📄 c51wrreadat45db041_form070813.c
字号:
/*************************************************************/
/*Name : RESET_AT45() */
/*Discription : 执行完一个操作以后重置 */
/*************************************************************/
void RESET_AT45(void)
{
CS_AT45_DIS;
SCK_AT45_HIGH;
SI_AT45_HIGH;
CS_AT45_EN; //CS片选低电平有效
SCK_AT45_LOW;
}
/****************************************************************/
/*Name :END_AT45()
/*Discription :用于AT45的结束
/****************************************************************/
void END_AT45(void)
{
CS_AT45_DIS; //CS片选高电平无效
SI_AT45_HIGH;
SCK_AT45_HIGH;
}
/*************************************************************/
/*Name :SEND_DATA_AT45() */
/*Discription :在AT45启动下,送入指定位数的数据 */
/*输入: op_data 要输入的数据 */
/* num 输入的位数 */
/* 最高位先送出 */
/*************************************************************/
void SEND_DATA_AT45(unsigned char buffer)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (buffer & 0x80)
{
SI_AT45_HIGH;
}
else
{
SI_AT45_LOW;
}
SCK_AT45_LOW ;
SCK_AT45_HIGH;
buffer<<=1;
}
}
/************************************************************/
/*Name :GET_DATA_AT45() */
/*Discription :在AT45启动下,读入指定位数的数据 */
/*输入: 无 */
/*输出:读入的8位数据 */
/* 最高位先送出 */
/*************************************************************/
unsigned char GET_DATA_AT45(void)
{
unsigned char i,rByte=0;
for(i=0;i<8;i++)
{
SCK_AT45_LOW;
SCK_AT45_HIGH;
rByte<<=1;
rByte|=SO_AT45;
}
return rByte;
}
/***********************************************************************/
/*Name :AT45_status() */
/*Discription :AT45的字读取程序 */
/*输出 :寄存器状态,查询是否为忙,以及卡是否未坏 */
/***********************************************************************/
unsigned char AT45_status(void)
{
unsigned char Result=0;
/*开启AT45.........................................................*/
CS_AT45_EN;
SEND_DATA_AT45(0xD7);
Result=GET_DATA_AT45();
/*关闭AT45.........................................................*/
CS_AT45_DIS; //CS片选高电平无效
return Result;
}
/***********************************************************************/
/*描述: */
/* 将指定数据写入main中某页的某个地址,先擦除此页,再写入指定地址 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* PA - 页地址,0~2047 */
/* BFA - 指定main page中的起始写入地址 */
/* pHeader - 指定数据的首地址 */
/* len - 指定数据的长度 */
/***********************************************************************/
unsigned char AT45_MainWr(unsigned char buffer,unsigned int PA,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<255)
{
if(AT45_status()==0x9c) break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x82);break;
case 2:SEND_DATA_AT45(0x85);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)((PA<<1)|(BFA>>8)));
SEND_DATA_AT45((unsigned char)BFA);
//发送数据
for(i=0;i<len;i++){SEND_DATA_AT45(*(pHeader+i));}
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 将从指定页指定地址读出数据 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* PA - 页地址,0~2047 */
/* BFA - 指定main page中的起始写入地址 */
/* pHeader - 指定数据的首地址 */
/* len - 指定数据的长度 */
/***********************************************************************/
unsigned char AT45_MainRe(unsigned int PA,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c) break;
}
if(i==255) return 0;
CS_AT45_EN;
SEND_DATA_AT45(0xD2);
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)((PA<<1)|(BFA>>8)));
SEND_DATA_AT45((unsigned char)BFA);
for(i=0;i<4;i++)
{
SEND_DATA_AT45(0x00);
}
//发送数据
for(i=0;i<len;i++){*(pHeader+i)=GET_DATA_AT45();}
CS_AT45_DIS;
return 1;
}
/********************************************************************/
/*描述: */
/* 从BUFFER中的指定地址开始读出指定长度的数据,读到最后从buffer的开头重读。 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* 在该指令序列中,操作码84H选择BUFFER 1,87H选择BUFFER 2 */
/* BFA - BUFFER中的起始地址,0~263 */
/* pHeader - 待存数据的头指针 */
/* len - 待存数据的长度1~264 */
/********************************************************************/
unsigned char AT45_BufRe(unsigned char buffer,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0xD4);break;
case 2:SEND_DATA_AT45(0xD6);break;
}
SEND_DATA_AT45(0x00);
SEND_DATA_AT45((unsigned char)(BFA>>8));
SEND_DATA_AT45((unsigned char)BFA);
SEND_DATA_AT45(0x00);
for(i=0;i<len;i++){*(pHeader+i)=GET_DATA_AT45();}
CS_AT45_DIS;
return 1;
}
/********************************************************************/
/*描述: */
/* 将指定数据写入从某个地址(0~263)开始的BUFFER中。 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* 在该指令序列中,操作码84H选择BUFFER 1,87H选择BUFFER 2 */
/* BFA - BUFFER中的起始地址,0~263 */
/* pHeader - 待存数据的头指针 */
/* len - 待存数据的长度1~264 */
/********************************************************************/
unsigned char AT45_BufWr(unsigned char buffer,unsigned int BFA,
unsigned char *pHeader,unsigned char len)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)
{
// Green_led_off;
break;
}
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x84);break;
case 2:SEND_DATA_AT45(0x87);break;
}
SEND_DATA_AT45(0x00);
SEND_DATA_AT45((unsigned char)(BFA>>8));
SEND_DATA_AT45((unsigned char)BFA);
for(i=0;i<len;i++){SEND_DATA_AT45(*(pHeader+i));}
CS_AT45_DIS;
return 1;
}
/*******************************************************/
/*描述: */
/* 连续读 */
/*参数: */
/* PA - 页地址,0~2047 */
/* BFA - 指定main 页的起始读取地址,0-264 */
/* pHeader - 指定数据的首地址 */
/* len - 指定数据的长度 */
/*******************************************************/
unsigned char AT45_ArrayRead(unsigned int PA,unsigned int BFA,
unsigned char *pHeader,unsigned int len)
{
unsigned int i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
SEND_DATA_AT45(0xE8);
//地址,
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)((PA<<1)|(BFA>>8)));
SEND_DATA_AT45((unsigned char)BFA);
for(i=0;i<4;i++)
{
SEND_DATA_AT45(0x00);
}
for(i=0;i<len;i++){*(pHeader+i)=GET_DATA_AT45();}
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 将指定数据写入从某个地址(0~263)开始的页中:包含2个动作,首先将指定数据*/
/* 写入到BUFFER 1或者BUFFER 2中,其中可以指定BUFFER中的起始写入地址,此写入*/
/* 动作不影响BUFFER中其它地址中的数据,然后再将BUFFER中的整个数据写入到某指*/
/* 定页中(带预擦除)。 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* PA - 页地址,0~2047 */
/* BFA - 指定BUFFER中的起始写入地址 */
/* pHeader - 指定数据的首地址 */
/* len - 指定数据的长度 */
/********************************************************************/
unsigned char AT45_Bf2MainWr_inErase(unsigned char buffer,unsigned int PA,
unsigned int BFA,unsigned char *Header,unsigned char len)
{
unsigned char i=0;
AT45_BufWr(buffer,BFA,Header,len);
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x83);break;
case 2:SEND_DATA_AT45(0x86);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)(PA<<1));
SEND_DATA_AT45(0x00);
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 比较将MAIN中的内容传到BUFF中 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* PA - 页地址,0~2047 */
/* len - 指定数据的长度 */
/***********************************************************************/
unsigned char AT45_Main2BUF(unsigned char buffer,unsigned int PA)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255) return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x53);break;
case 2:SEND_DATA_AT45(0x55);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)(PA<<1));
SEND_DATA_AT45(0x00);
CS_AT45_DIS;
return 1;
}
/***********************************************************************/
/*描述: */
/* 比较buff和main中的页是否内容一致 */
/*参数: */
/* buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 */
/* PA - 页地址,0~2047 */
/* BFA - 指定BUFFER中的起始写入地址 */
/* pHeader - 指定数据的首地址 */
/* len - 指定数据的长度 */
/***********************************************************************/
unsigned char AT45_Bf2MainBUFcmp(unsigned char buffer,unsigned int PA)
{
unsigned char i=0;
while(i++<254)
{
if(AT45_status()==0x9c)break;
}
if(i==255)return 0;
CS_AT45_EN;
switch(buffer)
{
case 1:SEND_DATA_AT45(0x60);break;
case 2:SEND_DATA_AT45(0x61);break;
}
SEND_DATA_AT45((unsigned char)(PA>>7));
SEND_DATA_AT45((unsigned char)(PA<<1));
SEND_DATA_AT45(0x00);
CS_AT45_DIS;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -