找回密码
 立即注册
查看: 53|回复: 7

STC8H2K08U的iap技术的内部eeprom存储的问题 | 已解决

[复制链接]
  • TA的每日心情
    开心
    2024-4-12 11:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    4

    回帖

    15

    积分

    新手上路

    积分
    15
    发表于 2024-4-12 11:40:51 | 显示全部楼层 |阅读模式
    #include "iap_eeprom.h"
    #include <STC8H.H>
    #include "intrins.h"
    #include "main.h"
    #include "intrins.h"

    void IapIdle()
    {
        IAP_CONTR = 0;                              //关闭IAP功能
        IAP_CMD = 0;                                //清除命令寄存器
        IAP_TRIG = 0;                               //清除触发寄存器
        IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
        IAP_ADDRL = 0;
    }

    char IapRead(int addr)
    {
        char dat;

        IAP_CONTR = 0x80;                           //使能IAP
        IAP_TPS = 12;                               //设置等待参数12MHz
        IAP_CMD = 1;                                //设置IAP读命令
        IAP_ADDRL = addr;                           //设置IAP低地址
        IAP_ADDRH = addr >> 8;                      //设置IAP高地址
        IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
        IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
        _nop_();
        dat = IAP_DATA;                             //读IAP数据
        IapIdle();                                  //关闭IAP功能

        return dat;
    }

    void IapProgram(int addr, char dat)
    {
        IAP_CONTR = 0x80;                           //使能IAP
        IAP_TPS = 12;                               //设置等待参数12MHz
        IAP_CMD = 2;                                //设置IAP写命令
        IAP_ADDRL = addr;                           //设置IAP低地址
        IAP_ADDRH = addr >> 8;                      //设置IAP高地址
        IAP_DATA = dat;                             //写IAP数据
        IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
        IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
        _nop_();
        IapIdle();                                  //关闭IAP功能
    }

    void IapErase(int addr)
    {
        IAP_CONTR = 0x80;                           //使能IAP
        IAP_TPS = 12;                               //设置等待参数12MHz
        IAP_CMD = 3;                                //设置IAP擦除命令
        IAP_ADDRL = addr;                           //设置IAP低地址
        IAP_ADDRH = addr >> 8;                      //设置IAP高地址
        IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
        IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
        _nop_();                                    //
        IapIdle();                                  //关闭IAP功能
    }

    //main.c
    //while(1)循环的上面
    uint8_t iap_data_box2;
    iap_data_box2=IapRead(0x0400);
    //        
            iap_data_box2+=2;
            IapErase(0x0400);
            IapProgram(0x0400,iap_data_box2);
            iap_data_box2=IapRead(0x0400);
    //下面是加了个数码管显示iap_data_box2的代码救不贴出来了
    设想是通过每次掉电上电存入iap_data_box2+2来检测是否真的存到eeprom,但是每次上电都是2不知道为什么

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-12 11:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    4

    回帖

    15

    积分

    新手上路

    积分
    15
     楼主| 发表于 2024-4-12 11:42:33 | 显示全部楼层
    每次上电iap_data_box2显示都是2,有种它着eeprom存了但是又好像没存的感觉,挺没有头绪的
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    26

    主题

    1281

    回帖

    3985

    积分

    论坛元老

    积分
    3985
    发表于 2024-4-12 13:17:27 | 显示全部楼层
    烧录附件的例子到芯片试试,每次上电串口打印一次EEPROM读写数据。

    STC8-EEPROM多字节读写操作-通过串口1输出.zip

    8.28 KB, 下载次数: 3

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-12 11:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    4

    回帖

    15

    积分

    新手上路

    积分
    15
     楼主| 发表于 2024-4-12 15:07:30 | 显示全部楼层
    乘风飞扬 发表于 2024-4-12 13:17
    烧录附件的例子到芯片试试,每次上电串口打印一次EEPROM读写数据。

    [15:03:07.904]接收←00 00 FE
    [15:03:08.252]接收←69 71 FC CA 8E FE
    [15:03:09.643]接收←00
    [15:03:09.995]接收←72 69 8E C6 86
    [15:03:11.619]接收←00 FF
    [15:03:11.969]接收←E9 E9 71 CA 86
    [15:03:13.148]接收←00 FF
    [15:03:13.482]接收←73 E9 E9 CE 86
    [15:03:14.417]接收←00
    [15:03:14.764]接收←69 E9 E9 C2 86 86
    [15:05:59.673]接收←00 00
    [15:06:00.022]接收←E9 E9 CE 86 86
    [15:06:02.060]接收←00 DC
    [15:06:02.315]接收←00 FE
    [15:06:02.507]接收←00
    [15:06:02.555]接收←00
    [15:06:02.905]接收←69 E9 CA 8E FC
    [15:06:03.352]接收←00
    [15:06:03.704]接收←E9 E9 E9 86 86
    [15:06:05.949]接收←00
    [15:06:06.293]接收←E9 E9 E9 8E 8E FC
    [15:06:07.027]接收←00 FF
    [15:06:07.105]接收←80 FD F8 C2 FF
    [15:06:07.439]接收←E9 E9 E9 CA 8E FC
    [15:06:11.423]接收←00
    [15:06:11.773]接收←71 71 E9 CA CE 86
    [15:06:12.985]接收←00 FE
    [15:06:13.348]接收←73 72 8E CA C6 FC
    [15:06:14.315]接收←00 00 00 FF
    [15:06:14.694]接收←72 E9 E9 8E 82
    [15:06:15.090]接收←00 FF
    [15:06:15.153]接收←00 FF
    [15:06:15.503]接收←69 71 F9 8E FE
    [15:06:16.102]接收←00
    [15:06:16.454]接收←E9 E9 FC 86 C6

    大佬,这是上电收到的信息看样子是能存储的,不过我暂时还不知道原因
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    26

    主题

    1281

    回帖

    3985

    积分

    论坛元老

    积分
    3985
    发表于 2024-4-12 15:38:17 | 显示全部楼层
    shuyuan 发表于 2024-4-12 15:07
    [15:03:07.904]接收←00 00 FE
    [15:03:08.252]接收←69 71 FC CA 8E FE
    [15:03:09.643]接收←00

    下载时, 选择IRC频率 11.0592MHz。
    打印时串口波特率设置 115200,使用文本模式打印。
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-12 11:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    4

    回帖

    15

    积分

    新手上路

    积分
    15
     楼主| 发表于 2024-4-12 15:48:46 | 显示全部楼层
    乘风飞扬 发表于 2024-4-12 15:38
    下载时, 选择IRC频率 11.0592MHz。
    打印时串口波特率设置 115200,使用文本模式打印。 ...

    Read1=0x00 0x01 0x02 0x03 0x04 0x10 0x09 0xe8 0xf9 0xcb
    Read2=0x01 0x02 0x03 0x04 0x05 0x11 0x0a 0xe9 0xfa 0xcc
    这是输出的报文属于正常吗
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    26

    主题

    1281

    回帖

    3985

    积分

    论坛元老

    积分
    3985
    发表于 2024-4-12 16:01:57 | 显示全部楼层
    shuyuan 发表于 2024-4-12 15:48
    Read1=0x00 0x01 0x02 0x03 0x04 0x10 0x09 0xe8 0xf9 0xcb
    Read2=0x01 0x02 0x03 0x04 0x05 0x11 0x0a  ...

    例子是将EEPROM读取的数据+1后重新写入,如果读数是FF的话赋初值。
    看起来你读取的后面几个地址原本就有内容,就没有赋初值。
    不过+1后写入,再次读取出来的结果是对的。
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-12 11:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    4

    回帖

    15

    积分

    新手上路

    积分
    15
     楼主| 发表于 2024-4-12 17:04:15 | 显示全部楼层
    乘风飞扬 发表于 2024-4-12 16:01
    例子是将EEPROM读取的数据+1后重新写入,如果读数是FF的话赋初值。
    看起来你读取的后面几个地址原本就有 ...

    谢谢大佬,能正常存储是我的代码问题应该是,现在已经好了,谢谢大佬
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-30 08:14 , Processed in 0.065847 second(s), 59 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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