lyagp03 发表于 2025-1-4 14:27:39

求助贴,IAP读写有问题

芯片型号是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);BWriteOneData(0x09,TEMP_COM2);
                BWriteOneData(0x0A,TEMP_COM1);BWriteOneData(0x0B,TEMP_COM2);
                BWriteOneData(0x0C,(TEMP_COM1));BWriteOneData(0x0D,TEMP_COM2);
                BWriteOneData(0x0E,TEMP_COM1);BWriteOneData(0x0F,TEMP_COM2);
               
                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。
今天有在查和对比,一直找不到原因,特上来论坛求助

_奶咖君_ 发表于 2025-1-4 15:12:49

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

_奶咖君_ 发表于 2025-1-4 15:17:46

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

lyagp03 发表于 2025-1-4 17:08:09

_奶咖君_ 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...

我试试看,把工程只保留读写这部分看看

lyagp03 发表于 2025-1-4 17:10:29

_奶咖君_ 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...

我去检查检查官方给的这个例程,看看是否是因为没有先擦除

lyagp03 发表于 2025-1-4 17:18:34

_奶咖君_ 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...

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

_奶咖君_ 发表于 2025-1-4 17:29:08

lyagp03 发表于 2025-1-4 17:18
程序中确实是没有先擦除,在做写操作。我先试试看,可以了回来结贴
如果没有擦除就写入的话 ,,那100% 就是这个问题了,,,

对于Flash的写入操作,只能将1写成0 ,,,你在写入之前 就把读取到是0xFFFF的地址都写成了0,,那之后再怎么写入也肯定都是零了。。

_奶咖君_ 发表于 2025-1-4 17:31:21

<p><img src="data/attachment/forum/202501/04/173036dh4g05rqc5rh0vqg.png" alt="image.png" title="image.png" /></p>
<p>手册中再相关章节一上来的位置就写了相关的机制。。。</p>

lyagp03 发表于 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操作

_奶咖君_ 发表于 2025-1-4 20:15:13

lyagp03 发表于 2025-1-4 20:10
void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP


看一遍手册.....手册里描述的很清楚了。
页: [1] 2
查看完整版本: 求助贴,IAP读写有问题