找回密码
 立即注册
查看: 393|回复: 12

求助贴,IAP读写有问题

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-05-02 09:27:28

8

主题

95

回帖

548

积分

高级会员

积分
548
发表于 2025-1-4 14:27:39 | 显示全部楼层 |阅读模式
芯片型号是STC8H1K28,由于和客户有保密协议,只能贴一部分代码起来。

        if(A8_TEMP != WORK_ONTIME_1H)
        {
                A8_TEMP = WORK_ONTIME_1H;
                A8_KIL = A8_TEMP/1000;
                A8_TEMP = A8_TEMP%1000;
                A8_HUN = A8_TEMP/100;
                A8_TEMP = A8_TEMP%100;
                A8_INT = A8_TEMP/10;
                A8_TEMP = A8_TEMP%10;
                A8_DEC = A8_TEMP;
                       
                BWriteOneData(0x08,TEMP_COM1[A8_KIL]);BWriteOneData(0x09,TEMP_COM2[A8_KIL]);
                BWriteOneData(0x0A,TEMP_COM1[A8_HUN]);BWriteOneData(0x0B,TEMP_COM2[A8_HUN]);
                BWriteOneData(0x0C,(TEMP_COM1[A8_INT]));BWriteOneData(0x0D,TEMP_COM2[A8_INT]);
                BWriteOneData(0x0E,TEMP_COM1[A8_DEC]);BWriteOneData(0x0F,TEMP_COM2[A8_DEC]);
               
                A8_TIME = WORK_ONTIME_1H;
                IapProgram(0x0000, A8_TIME);
                A8_TIME = (WORK_ONTIME_1H >> 8);
                IapProgram(0x0001, A8_TIME);
                A8_TEMP = WORK_ONTIME_1H;
        }

以上是IAP写,对比数据前后,有变化就写进IAP中。

                WORK_ONTIME_1H = IapRead(0x0001);
                WORK_ONTIME_1H = (WORK_ONTIME_1H << 8);
                WORK_ONTIME_1H = (WORK_ONTIME_1H | IapRead(0x0000));
                if(WORK_ONTIME_1H == 0xFFFF)
                {
                        WORK_ONTIME_1H = 0;
                        IapProgram(0x0000, 0);
                        IapProgram(0x0001, 0);
                }
以上是IAP读,这部分应该正常,我烧录程序时,有设置对应的数据,开机LCD能正常显示。后面程序有对0000和0001这两个地址进行写操作,非0数据,但是重新开机后,就变成0了。
EEPROM部分都是按照例程直接应用过来。烧录的时候设置的用户EEPROM大小为0.5K。
今天有在查和对比,一直找不到原因,特上来论坛求助
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-4 15:12:49 | 显示全部楼层

你可以选择吧没有用的东西,都删掉只保留一个你能复现问题的最小工程。最好是使用单片机上有的硬件来显示数据。

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-4 15:17:46 | 显示全部楼层

还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包不包括擦除函数,,看起来这个是官方给的一个函数,,,所以,最好还是上传一个最小工程。

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-05-02 09:27:28

8

主题

95

回帖

548

积分

高级会员

积分
548
发表于 2025-1-4 17:08:09 | 显示全部楼层
_奶*** 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...

我试试看,把工程只保留读写这部分看看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-05-02 09:27:28

8

主题

95

回帖

548

积分

高级会员

积分
548
发表于 2025-1-4 17:10:29 | 显示全部楼层
_奶*** 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...

我去检查检查官方给的这个例程,看看是否是因为没有先擦除
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-05-02 09:27:28

8

主题

95

回帖

548

积分

高级会员

积分
548
发表于 2025-1-4 17:18:34 | 显示全部楼层
_奶*** 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...

程序中确实是没有先擦除,在做写操作。我先试试看,可以了回来结贴
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-4 17:29:08 | 显示全部楼层
lyag*** 发表于 2025-1-4 17:18
程序中确实是没有先擦除,在做写操作。我先试试看,可以了回来结贴

如果没有擦除就写入的话 ,,那100% 就是这个问题了,,,

对于Flash的写入操作,只能将1写成0 ,,,你在写入之前 就把读取到是0xFFFF的地址都写成了0,,那之后再怎么写入也肯定都是零了。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-4 17:31:21 | 显示全部楼层

image.png

手册中再相关章节一上来的位置就写了相关的机制。。。

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:264
  • 最近打卡:2025-05-02 09:27:28

8

主题

95

回帖

548

积分

高级会员

积分
548
发表于 2025-1-4 20:10:03 | 显示全部楼层
_奶*** 发表于 2025-1-4 17:31
手册中再相关章节一上来的位置就写了相关的机制。。。

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功能
}
我用的是例程里面的这个擦除函数,能对0000和0001地址进行擦除吗?
前面没怎么用过IAP操作
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-4 20:15:13 | 显示全部楼层
lyag*** 发表于 2025-1-4 20:10
void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP

看一遍手册.....手册里描述的很清楚了。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 15:42 , Processed in 0.123274 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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