⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5043.c

📁 51单片机5043eeprom驱动程序源码肯定是好地
💻 C
字号:
//#include<reg51.h>
#include<SM5964.h>
#include<MYTYPE.H>


#define WREN 0x06                                     //写使能允许命令
#define WRDI 0x04				      //使写使能复位命令
#define RDSR 0x05                                     //读寄存器命令
#define WRSR 0x01                                     //写寄存器命令
#define READ0 0x03                                    //读低位地址命令
#define READ1 0x0B                                     //读高位地址命令
#define WRITE0 0x02                                   //写低位地址命令
#define WRITE1 0x0A                                   //写高位地址命令
#define CS P17
#define SO P11
#define SCK P12
#define SI P13

/****************************************************************/
//              X25043EEP  C   语言读写程序                    //
/****************************************************************/

/***************************************************************/
//读一个字节
//入参:无         出参:读出的数据
/****************************************************************/

void Delay(void)
{INT8U i=0;
 while(i<200)
 { i++;}
 }


INT8U Read()
{INT8U ch=0;
 INT8U i;
 CS=0;

 for(i=0;i<8;i++)
     {  //Delay();

        SCK = 1;

        SCK = 0;

        ch<<=1;

        if(SO)
          ch|=0x01;
        else
          ch&=0xfe;

      }

   return(ch);

}

/*********************************************************************/
//功能:向X25043中写入一个字节的数据
//入参:要写入的数据
//出参:无
/********************************************************************/
void Write(INT8U ucda)				//写字节子函数如果是写使能信号则最后片选信号要拉高
{INT8U i;                                       //在写入功能中已将时钟信号拉低了
 CS=0;
 for(i=0;i<8;i++)
    {if(ucda&0x80)
        SI = 1;
     else
        SI = 0;
     SCK = 0;

     SCK = 1;
     ucda=ucda*2;
    }
 //SCK=0;						//写完后使时信号拉高
                                                //写使能后一定要使片选信号拉高
}
/*************************************************************************/
//功能:设置X25043相应的寄存器内容
//入参:往寄存器中要写入的数据
//出参:无
/****************************************************************************/
void WrRes(INT8U ucda)                          //写寄存器内容可以使能看门狗写入寄存器相关内容就可
{INT8U i;
 Write(WREN);
 CS=1;
 Write(WRSR);
 Write(ucda);
 CS=1;
}
/***************************************************************************/
//功能:读出寄存器相关内容
//入参:命令
//出参:返回的数据
/**************************************************************************/
INT8U RdRes(INT8U Order) 			//读出寄存器内容
{ INT8U i;INT8U bdata ch=0;
  Write(WREN);
  CS=1;
  Write(Order);

 for(i=0;i<8;i++)
      {  SCK = 1;
         SCK = 0;
         ch<<=1;
         if(SO)
           ch|=0x01;
         else
           ch&=0xfe;

      }
   return(ch);
}
/**************************************************************************/
//功能:向X25043中写入一个字节的数据
//入参:16位的地址,数据
//出参:无
/****************************************************************************/
void WriteAbyte(INT16U Addr,INT8U ucda)
{ INT8U bdata Chk;INT8U i;
  CS=0;
  CS=1;
 Write(WREN);
  CS=1;                                        //写使能信号后片选信号拉高
  //SCK=0;

  i=(INT8U)(Addr>>8);
      if(i!=0){Write(WRITE1);}                 //如果不为0则选择了高256个字节选择高位地址
        else     {Write(WRITE0);}                //选择低256个字节
  i=(INT8U)(Addr);

     Write(i);                                //写入具体空间地址
     //Write(WREN);CS=1;
     Write(ucda);                              //写入数据
     SCK=0;CS=1;
  while(1)             			       //检测是否EEP写数据完成没完成继续检测
  {Chk=RdRes(RDSR);
   if((Chk^0)!=1) break;
  }
  //Write(WRDI);
  SCK=0;
  CS=1;
}
/********************************************************************/
//功能:写页数据
//入参:16位地址,要存入的数组首址,数组长度
//出参:无
/*********************************************************************/
void  WritePageByte(INT16U Addr,INT8U *pMem,INT16U Len)        //分页写数据入参为地址,存放数组首址,数组长度
{INT8U bdata Chk;INT8U i; INT8U uu;
 INT8U Page1;                                                 //整数页地址
 INT8U Page2;					              //不到一页的数据
 INT8U Num=4;                                                 //每一页一次写4个数据
 INT8U pAddr;                                                 //页地址
 INT8U pAddr1;


 Write(WREN);                                                 //写数据使能
 CS=1;

 pAddr1=(INT8U)(Addr);
 pAddr=pAddr1&0x03;
 pAddr1=pAddr;
 pAddr=(INT8U)(Addr>>8);
          if(pAddr!=0){Write(WRITE1);}                          //写页内高低地址
          else Write(WRITE0);
          pAddr=(INT8U)(Addr);
          Write(pAddr);
          //Write(WREN);CS=1;
          if(Len<(4-pAddr1))
          {
          for(i=0;i<(Len);i++)
               {      Write(*pMem);
                      pMem++;
               }
                 while(1)       				//检测EEP编写操作是否完成
                   {Chk=RdRes(RDSR);
                    if(Chk^0!=1)break;
                   }
          }
          else
          {for(i=0;i<(4-pAddr1);i++)
               {      Write(*pMem);
                      pMem++;
               }
                 while(1)       				//检测EEP编写操作是否完成
                   {Chk=RdRes(RDSR);
                    if(Chk^0!=1)break;
                   }
          }

if(Len>4)
{
Page1=(Len-(4-pAddr1))/4;
Page2=(Len-(4-pAddr1))%4;
}
else {Addr=Addr+(4-pAddr1);
      Write(WREN);CS=1;
      pAddr=(INT8U)(Addr>>8);
      if(pAddr!=0){Write(WRITE1);}
      else Write(WRITE0);
      pAddr=(INT8U)(Addr);
      Write(WREN);CS=1;
    Write(pAddr);
    for(i=0;i<Len;i++)
      {Write(WREN);CS=1;
       Write(*pMem);
       pMem++;
      }
     } //Write(WREN);CS=1;
Addr=Addr+(4-pAddr1);
          Write(WREN);CS=1;
          pAddr=(INT8U)(Addr>>8);
          if(pAddr!=0){Write(WRITE1);}                        //高,低位地址
          else Write(WRITE0);                                  //只取后8位作地址

          pAddr=(INT8U)(Addr);

    for(i=0;i<Page1;i++)
    {     //Write(WREN);CS=1;
          Write(pAddr);                                        //写具体地址
           Write(WREN);CS=1;
          for(Len=0;Len<Num;Len++)
            {

             Write(*pMem);

             pMem++;

            }


      Addr=Addr+4;                                       //页地址加一
      pAddr=(INT8U)(Addr>>8);
      if(pAddr!=0){Write(WRITE1);}
      else Write(WRITE0);
      pAddr=(INT8U)(Addr);
     }
    while(1)       				//检测EEP编写操作是否完成
    {Chk=RdRes(RDSR);
     if(Chk^0!=1)break;
    }
    Write(WREN);CS=1;
    Write(pAddr);
    for(i=0;i<Page2;i++)
      {//Write(WREN);CS=1;
       Write(*pMem);
       pMem++;
      }

  //SCK=0;
  CS=1;
}
/**********************************************************************/
//功能:读出一个字节数据
//入参:16位地址
//出参:读出的数据
/***********************************************************************/
INT8U ReadAbyte(INT16U Addr)                             //读一个地址的数据
{INT8U ReData;INT8U i;INT8U pAddr;INT8U bdata Chk;
 //Write(WREN);CS=1;
 //while(1)
 //{Chk=RdRes(RDSR);
 // if(Chk^0!=1)break;
 // }

 pAddr=(INT8U)(Addr>>8);                                 //写入地址分别识别高低位
 if(pAddr!=0) {Write(READ1);}
 else {Write(READ0);}                                      //写入数据地址低位
 pAddr=(INT8U)(Addr);
 //Delay();
 Write(pAddr);

 ReData=Read();
 return(ReData);
 SCK=0;CS=1;
}
/********************************************************************/
//功能:读出连续空间的数据
//入参:16位地址,要存入数据的首址,要读出数据的长度
//出参:无
/*******************************************************************/
void ReadEEpByte(INT8U*pMem,INT16U Addr,INT16U Len)       //入参为地址,读出的数据存放的首址,读出的数组的长度
{INT16U i;INT8U pAddr;INT8U bdata Chk;
 //while(1)
 //{Chk=RdRes(RDSR);
  //if(Chk^0!=1)break;
  //}
 pAddr=(INT8U)(Addr>>8);
 //Write(WREN);CS=1;
 if(pAddr!=0){Write(READ1);}                             //只要处理一次读0,1区后顺序读就没问题了
 else Write(READ0);
 pAddr=(INT8U)(Addr);                                   //页地址(低8位)
 Write(pAddr);

 for(i=0;i<Len;i++)
     {

       *pMem=Read();
       pMem++;

     }
 SCK=0;
 CS=1;
}
/*********************************************************************/
//功能:禁止往EEP中写入数据
//入参:无
//出参;无
/**********************************************************************/
void Wrdi(void)                           //禁止往EEP中写入数据,但写功能子函数中没有将片选拉高故在此将片选拉高
{Write(WRDI);
 CS=1;
}

void WriteEEpByte(INT8U *pMem,INT16U addr,INT16U Len)
{
 INT16U i; INT8U Check=1;

 for(i=0;i<Len;i++)
    {
     Delay();
     WriteAbyte(addr,*pMem);
     addr++;pMem++;
     Delay();
    }

}

bit WriteReadEep(INT8U *pMem,INT16U addr,INT16U Len,bit Wr_Rd)
{
 if(addr+Len>512) return(0);
if(Wr_Rd)
 {WriteEEpByte(pMem,addr,Len);}
 else {ReadEEpByte(pMem,addr,Len);}
 return(1);
}














⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -