tangzy0202 发表于 2023-12-4 15:34:22

STC8H8K64U的EEPROM读写遇到的问题

本帖最后由 tangzy0202 于 2023-12-4 15:34 编辑

请教各位老师,我在使用STC8H8K64U读写EEPROM遇到个问题:写入一个字节数据,马上读取没问题,如果写入2个字节,再分别读取这2个字节,读取到的数据都是最后写入的字节数据,读取其他未写入地址(包括不同扇区),读取的也是最后写入的数据,感觉最后一个数据把EEPROM覆盖了似的,请教各位老师这是什么情况?原来在STC15芯片上使用一切正常,程序如下


/********************************************************************
* 函数名: IapEraseSector(扇区擦除、addr:擦除扇区起始地址)
/***************************************************************|***/
void IapEraseSector(unsigned int addr)                                                                //指定扇区擦除
{
    IAP_CONTR = 0x80;                        //使能IAP
        IAP_TPS = 35;                   //设置等待参数35MHz
    IAP_CMD = 3;                            //设置IAP扇区擦除命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}
/********************************************************************
* 函数名: IapProgramByte(写一字节数据到ISP/IAP/EEPROM指定地址、addr:地址,dat:数据)
/***************************************************************|***/
void IapProgramByte(unsigned int addr, unsigned char dat)                        //写一字节数据到EEPROM指定地址
{
    IAP_CONTR = 0x80;                         //使能IAP
        IAP_TPS = 35;                   //设置等待参数35MHz
    IAP_CMD = 2;                                  //设置IAP字节编程命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_DATA = dat;               //写ISP/IAP/EEPROM数据
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}
/********************************************************************
* 函数名: IapReadByte(从ISP/IAP/EEPROM指定地址读取一字节)
/***************************************************************|***/
unsigned char IapReadByte(unsigned int addr)                                                //从EEPROM指定地址读取一字节          
{
    unsigned char dat;            //数据缓冲区
    IAP_CONTR = 0x80;                        //使能IAP
        IAP_TPS = 35;                   //设置等待参数35MHz
    IAP_CMD = 1;                             //设置IAP字节读命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;               //读ISP/IAP/EEPROM数据
    IapIdle();                      //关闭IAP功能
    return dat;                     //返回
}
/********************************************************************
* 函数名: IapIdle(关闭IAP)
/***************************************************************|***/
void IapIdle()                                                                                                                 //关闭IAP
{
    IAP_CONTR = 0;                //关闭IAP功能
    IAP_CMD   = 0;                //清除命令寄存器
    IAP_TRIG= 0;                //清除触发寄存器
    IAP_ADDRH = 0x80;        //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}
/********************************************************************
* 函数名: IapWriteSetup(从指定地址写入设置参数、1扇区512字节)
/***************************************************************|***/
void IapWriteSetup()        //从指定地址写入设置参数:IapWRa,IapWRb,IapWRc,IapWRd
{
        IapEraseSector(0xE800);
        IapWRa = 23;
        IapWRb = 45;
        IapWRc = 0;
        IapWRd = 0;
        IapProgramByte(0xE800,IapWRa);                //写一个字节
        Delay_1ms(1);
        IapProgramByte(0xE802,IapWRb);                //写一个字节
        Delay_1ms(1);
        IapWRc = IapReadByte(0xE800);                //读一个字节
        Delay_1ms(1);
        IapWRd = IapReadByte(0xE802);                //读一个字节
        Delay_1ms(1);
}

电子DIY小家 发表于 2023-12-4 16:01:18

STC8H实验箱的测试代码跑一下

乘风飞扬 发表于 2023-12-4 16:25:38

IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大?

tangzy0202 发表于 2023-12-4 19:06:15

乘风飞扬 发表于 2023-12-4 16:25
IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大? ...

64k

tangzy0202 发表于 2023-12-4 19:06:50

tangzy0202 发表于 2023-12-4 19:06
64k

STC8H8K64U,64K

tangzy0202 发表于 2023-12-4 19:08:03

乘风飞扬 发表于 2023-12-4 16:25
IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大? ...

STC8H8K64U,64K

tangzy0202 发表于 2023-12-4 19:10:12

乘风飞扬 发表于 2023-12-4 16:25
IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大? ...

STC8H8K64U,64K,设置8k

乘风飞扬 发表于 2023-12-5 09:06:45

tangzy0202 发表于 2023-12-4 19:10
STC8H8K64U,64K,设置8k

8K的地址范围是0x0000~0x1FFF,你使用的地址超过了EEPROM的范围,结果当然就不对。

tangzy0202 发表于 2023-12-5 10:30:18

乘风飞扬 发表于 2023-12-5 09:06
8K的地址范围是0x0000~0x1FFF,你使用的地址超过了EEPROM的范围,结果当然就不对。 ...

谢谢,问题解决了,我忽略了IAP模式8K从0000H到1FFFH,谢谢!!!!
页: [1]
查看完整版本: STC8H8K64U的EEPROM读写遇到的问题