📄 5043.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 + -