求助贴,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。
今天有在查和对比,一直找不到原因,特上来论坛求助 <p>你可以选择吧没有用的东西,都删掉只保留一个你能复现问题的最小工程。最好是使用单片机上有的硬件来显示数据。</p>
<p>还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包不包括擦除函数,,看起来这个是官方给的一个函数,,,所以,最好还是上传一个最小工程。</p>
_奶咖君_ 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...
我试试看,把工程只保留读写这部分看看 _奶咖君_ 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...
我去检查检查官方给的这个例程,看看是否是因为没有先擦除 _奶咖君_ 发表于 2025-1-4 15:17
还有一件事,通用的流程,写之前应该擦除EEPROM,我这里没看到,,,也不清楚你的IapProgram这个函数里面包 ...
程序中确实是没有先擦除,在做写操作。我先试试看,可以了回来结贴 lyagp03 发表于 2025-1-4 17:18
程序中确实是没有先擦除,在做写操作。我先试试看,可以了回来结贴
如果没有擦除就写入的话 ,,那100% 就是这个问题了,,,
对于Flash的写入操作,只能将1写成0 ,,,你在写入之前 就把读取到是0xFFFF的地址都写成了0,,那之后再怎么写入也肯定都是零了。。 <p><img src="data/attachment/forum/202501/04/173036dh4g05rqc5rh0vqg.png" alt="image.png" title="image.png" /></p>
<p>手册中再相关章节一上来的位置就写了相关的机制。。。</p>
_奶咖君_ 发表于 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操作 lyagp03 发表于 2025-1-4 20:10
void IapErase(int addr)
{
IAP_CONTR = 0x80; //使能IAP
看一遍手册.....手册里描述的很清楚了。
页:
[1]
2