找回密码
 立即注册
查看: 962|回复: 8

STC8H8K64U的EEPROM读写遇到的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 11:43:41

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2023-12-4 15:34:22 | 显示全部楼层 |阅读模式
本帖最后由 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);
}

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-12-4 16:01:18 | 显示全部楼层
STC8H实验箱的测试代码跑一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-12-4 16:25:38 | 显示全部楼层
IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 11:43:41

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2023-12-4 19:06:15 | 显示全部楼层
乘风*** 发表于 2023-12-4 16:25
IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大? ...

64k
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 11:43:41

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2023-12-4 19:06:50 | 显示全部楼层

STC8H8K64U,64K
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 11:43:41

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2023-12-4 19:08:03 | 显示全部楼层
乘风*** 发表于 2023-12-4 16:25
IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大? ...

STC8H8K64U,64K
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 11:43:41

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2023-12-4 19:10:12 | 显示全部楼层
乘风*** 发表于 2023-12-4 16:25
IAP方式读写EEPROM的起始地址从0000开始,你设置0xE800,那么你的EEPROM大小设置多大? ...

STC8H8K64U,64K,设置8k
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-12-5 09:06:45 | 显示全部楼层
tangz*** 发表于 2023-12-4 19:10
STC8H8K64U,64K,设置8k

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2023-12-06 11:43:41

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 2023-12-5 10:30:18 | 显示全部楼层
乘风*** 发表于 2023-12-5 09:06
8K的地址范围是0x0000~0x1FFF,你使用的地址超过了EEPROM的范围,结果当然就不对。 ...

谢谢,问题解决了,我忽略了IAP模式8K从0000H到1FFFH,谢谢!!!!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:32 , Processed in 0.162991 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表