青山电子

个人项目整理:X5045操作函数(C51)

0
阅读(14458)

个人项目整理

#include <INTRINS.h>

//X5045的引脚

sbit X5045_CS_WDI = P1^0;
sbit X5045_SO = P1^1;
sbit X5045_SI=P1^3;
sbit X5045_SCK = P1^2;
sbit X5045_WP=P3^2;
unsigned char bdata flag;
sbit X5045bit=flag^0;            //X5045读出写入数据位

#define WREN     0x06
#define WRDI      0x04
#define RDSR    0x05
#define WRSR    0x01
#define READH   0x0B
#define READL   0x03
#define READ    0x03
#define WRITEH  0x0A
#define WRITEL  0x02
#define WRITE   0x02

/****************************************************************************************
*NAME:       void WR_X5045(WRData)
*FUNCTION:   写数据到X5045函数
*Parameter:  一个字节数据
*RETURN:     无返回值
*****************************************************************************************/
void WR_X5045(WRData)//将8位数据串行放入X5045中
{
 unsigned char data i;
 
 for(i=0;i<8;i++)
  {
   X5045_SCK=0;
   _nop_();
   flag|=((WRData>>(7-i))&0x01);
   X5045_SI=X5045bit;
   X5045bit=0;
   _nop_();
   X5045_SCK=1;
  }
}
/****************************************************************************************
*NAME:       unsigned char RD_X5045(void)
*FUNCTION:   从X5045读数据函数
*Parameter:  无参数
*RETURN:     返回一个读取的字节数据
*****************************************************************************************/
unsigned char RD_X5045(void)//从X5045中串行读8位数据
{
 unsigned char data i,temp,ReadData;
 temp=0;
 ReadData=0;
 for(i=0;i<8;i++)
  {
   X5045_SCK=0;
   _nop_();
   temp=X5045_SO;
   temp=temp<<(7-i);
   ReadData+=temp;
   temp=0;
   _nop_();
   X5045_SCK=1;
  }
 return ReadData;
}
/****************************************************************************************
*NAME:       void X5045_init(unsigned char OverTime,unsigned char ProtectRange)
*FUNCTION:   X5045初始化函数
*Parameter:  OverTime:看门狗定时溢出时间设置(0:1.4s,1:600ms,2:200ms,3:禁止);ProtectRange:保护地址空间设置 (0:不保护,1:0x0180-0x01ff,2:0x0100-0x01ff,3:0x0000-0x01ff)
*RETURN:     无返回值
*****************************************************************************************/
void X5045_init(unsigned char OverTime,unsigned char ProtectRange)
{
 X5045_CS_WDI = 1;
 _nop_();
 X5045_CS_WDI = 0;
 _nop_();
 X5045_WP=0;//写保护
 _nop_();
 X5045_WP=1;//可写
 _nop_();
 X5045_CS_WDI=0;
 _nop_();
 WR_X5045(0x06);//WREN,使能写操作
 X5045_CS_WDI=1;
 _nop_();
 X5045_CS_WDI=0;
 WR_X5045(0x01);//WRSR,写状态寄存器
 WR_X5045((OverTime<<4)+(ProtectRange<<2));//写数据到状态寄存器
 X5045_CS_WDI=1;
 _nop_();
 X5045_WP=0;//写保护
}
/****************************************************************************************
*NAME:       unsigned char  X5045(unsigned char code5045,unsigned char addr5045,unsigned char data5045)
*FUNCTION:   X5045操作函数
*Parameter:  code5045:操作代码,addr5045:操作地址,data5045:操作数据
*RETURN:     从X5045中读出的数据
*****************************************************************************************/
unsigned char X5045(unsigned char code5045,unsigned char addr5045,unsigned char data5045)
{
 unsigned char data i,TempData;
 TempData=0;
 switch(code5045&0x07)
   {
     case WREN://使能写操作
         X5045_CS_WDI=0;
         X5045_WP=1;
        WR_X5045(0x06);
        X5045_CS_WDI=1;
        break;
     case WRDI://禁止写操作
        X5045_CS_WDI=0;     
        X5045_WP=0;
        X5045_CS_WDI=1;
        break;
     case RDSR://读状态寄存器
        X5045_CS_WDI=0;
        WR_X5045(0x05);
        TempData=RD_X5045();
        X5045_CS_WDI=1;
        break;
     case WRSR://写状态寄存器
        X5045_CS_WDI=0;
        X5045_WP=1;
        WR_X5045(0x06);
        X5045_CS_WDI=1;
        _nop_();
        X5045_CS_WDI=0;
        WR_X5045(0x01);
        WR_X5045(data5045);
        X5045_WP=0;
        X5045_CS_WDI=1;
        break;
     case READ://从选定的地址开始读存储器阵列的数据
        X5045_CS_WDI=1;
       _nop_();
       _nop_();
       X5045_CS_WDI=0;
       _nop_();
       _nop_();               
       X5045_CS_WDI=1;
       _nop_();
       _nop_();
       X5045_CS_WDI=0;      
        WR_X5045(code5045);
        WR_X5045(addr5045);
        TempData=RD_X5045();
        X5045_CS_WDI=1;
        break;
     case WRITE://从选定的地址开始写入数据至存储器阵列
        X5045_WP=1;
        _nop_();
        X5045_CS_WDI=0;
        _nop_();
        WR_X5045(0x06);//使能写操作
        X5045_CS_WDI=1;
        _nop_();
        X5045_CS_WDI=0;
        WR_X5045(0x01);//写状态寄存器
        WR_X5045(0x00);//状态寄存器全为0,存储器去保护
        X5045_CS_WDI=1;
        _nop_();     
        X5045_WP=0;
        delay(10000)//延时约10ms
        X5045_CS_WDI=1;
        _nop_();
        X5045_WP=1;
        _nop_();
        X5045_CS_WDI=0;
        WR_X5045(6);//使能写操作                                    
        X5045_CS_WDI=1;   
        _nop_();
        X5045_CS_WDI=0;
        WR_X5045(code5045);//写操作
        WR_X5045(addr5045);
        WR_X5045(data5045);
        X5045_CS_WDI=1;
        _nop_();
        _nop_();
        X5045_WP=0;
        break;
   }
  return TempData;

}