18252776113 发表于 2012-5-22 11:05:58

关于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;
}

BXAK 发表于 2012-5-22 11:28:25

STC通用EEPROM操作函数(通杀1T,12T系列所有型号,支持连续读/写)

18252776113 发表于 2012-5-22 14:38:36

BXAK 发表于 2012-5-22 11:28 static/image/common/back.gif
STC通用EEPROM操作函数(通杀1T,12T系列所有型号,支持连续读/写)

我找到读写错误的原因了,您的代码我也收藏了,非常的好,十分感谢!

34071417 发表于 2012-5-22 18:01:05

STC提供的EEPROM很好用的,但是发现不同的型号居然写验证数不一样!
页: [1]
查看完整版本: 关于STC12的EEPROM问题,实在没搞出来,求助!