关于STC12的EEPROM问题,实在没搞出来,求助!
本帖最后由 18252776113 于 2012-5-22 11:13 编辑意思非常简单,就是写入0-9个值,再读出来
现象:所显示的始终都是 最后一个写入的值
void init_iap()
{
uchar i=0;
uchar str;
flash=0;flash=1;flash=2;flash=3;flash=4;
flash=5;flash=6;flash=7;flash=8;flash=9;
iap_wr_byte(0x0000,flash,10);//写入 0-9
delayms(10);
iap_rd_byte(0x0000,str,10);//读出 0-9
for(i=0;i<10;i++) str=str+'0';
str='\0';
GUI_clear(WHITE);
delayms(1);
GUI_disp_zf_str(0,288,str,BLACK,WHITE);//显示出来的都是 9
delayms(10);
while(1);
}
以下代码是手册上的原文,只是很少的改了一下
实在是找不出问题!
void iap_idle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0x80;
IAP_ADDRL=0;
}
void iap_erase(uint addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_idle();
}
void iap_prog(uint addr,uchar dat)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROG;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_idle();
}
uchar iap_read(uint addr)
{
uchar dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
dat=IAP_DATA;//最后IAP_DATA==9 于是读出来都是9
iap_idle();
return dat;
}
void iap_wr_byte(uint addr,uchar *dat,uchar n)
{
uint i;
iap_erase(addr);
delayus(100);
for(i=0;i<512;i++)
{
if(iap_read(addr+i)!=0xff) {GUI_clear(RED);while(1);}//擦除错误
}
for(i=0;i<n;i++)
{
iap_prog(addr+i,*dat);//不同地址 存储不同的值 但读出的数值 是一样的
delayus(100);
dat++;
}
delayus(100);
}
uchar iap_rd_byte(uint addr,uchar *dat,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
*dat=iap_read(addr+i);
delayus(100);
dat++;
}
delayus(100);
return dat;
} STC通用EEPROM操作函数(通杀1T,12T系列所有型号,支持连续读/写) BXAK 发表于 2012-5-22 11:28 static/image/common/back.gif
STC通用EEPROM操作函数(通杀1T,12T系列所有型号,支持连续读/写)
我找到读写错误的原因了,您的代码我也收藏了,非常的好,十分感谢! STC提供的EEPROM很好用的,但是发现不同的型号居然写验证数不一样!
页:
[1]