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

STC8H8K64U的EEPROM读写遇到的问题

[复制链接]
  • TA的每日心情
    开心
    2023-12-6 11:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    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);
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    22 分钟前
  • 签到天数: 99 天

    [LV.6]常住居民II

    41

    主题

    1011

    回帖

    6953

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:53
  • 签到天数: 140 天

    [LV.7]常住居民III

    26

    主题

    1337

    回帖

    4159

    积分

    论坛元老

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

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-6 11:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    7

    回帖

    29

    积分

    新手上路

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

    64k
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-6 11:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    7

    回帖

    29

    积分

    新手上路

    积分
    29
     楼主| 发表于 2023-12-4 19:06:50 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-6 11:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    7

    回帖

    29

    积分

    新手上路

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

    STC8H8K64U,64K
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-6 11:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    7

    回帖

    29

    积分

    新手上路

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:53
  • 签到天数: 140 天

    [LV.7]常住居民III

    26

    主题

    1337

    回帖

    4159

    积分

    论坛元老

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

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

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-6 11:43
  • 签到天数: 2 天

    [LV.1]初来乍到

    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, 2024-5-15 08:25 , Processed in 0.071728 second(s), 61 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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