麻烦大佬帮看看这个eeprom循环擦写的代码!!
本帖最后由 vb2002 于 2024-11-12 18:51 编辑大佬帮看看,这段代码
功能上没有问题. 但是现在如果CAP==1,会按页擦除eeprom
按道理应该是 0x0000,0x0200,0x0400,0x0600,0x0800,0x0a00,0x0c00,0x0e00,这样的顺序.
但是如果中间中断了.比如擦到0x0400 了. 这个时候CAP==0了.
应该下次CAP==1的时候 继续接上0x0400 往下擦除.(但是实际上,到0x400了..又从0x0000开始了)
本来想着节约eeprom寿命的.结果加快了 第一个扇区的反复擦写.
还有,代码中间有两个擦除指令. 删掉下面那个后.就不能运行.删掉上面那个没有区别.
大佬帮看看好吗?
numm = IapRead(0x0020+2);
mode = IapRead(EEPROMId+numm*0x0200);
if(CAP )
{
mode++;
if(mode>=4)mode=0;
numm++;
if(numm>=8)
numm = 0;
EEPROMId += numm * 0x0200;
if(EEPROMId >= 0x0ffd)
EEPROMId = 0x220;
IapErase(numm);
// IapErase(0x0020);
IapProgram(EEPROMId,mode);
IapProgram(0x0020+2,numm);
}
P3M0 = 0x04; P3M1 = 0x00; //
switch (mode)
{
case 0:CCAP1H = 3;
break;
case 1:CCAP1H = 10;
break;
case 2:CCAP1H = 25;
break;
case 3:CCAP1H = 55;
break;
default:CCAP1H = 111 ;
break;
}
前排围观 wnagming 发表于 2024-11-12 20:38
第一行是从一个固定位置取出numm的值,但是第17行又进行了写入,而擦除又不是每次都能擦掉0X0020+2的数据, ...
所以是这代码感觉有点问题,,
是在反复擦除第一个扇区,
我看串口打印数据,好像每次都是连着写,cap不为真的时候,就返回读第一扇区
有点头大 wnagming 发表于 2024-11-12 20:38
第一行是从一个固定位置取出numm的值,但是第17行又进行了写入,而擦除又不是每次都能擦掉0X0020+2的数据, ...
还有个问题,您上次给的那个按字节写入的,
我改了下,现在每次cap为真的时候写入可以正常流程写了,,
但是读的时候直接就读0xff了
wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的
我知道是两个东西
现在这个基本是完善的.
测试出来和我看到的代码不同. 无非是多擦除几次第一页扇区
wnagming 发表于 2024-11-12 21:01
所以每次读取数据都可以直接写入,看似是读取数据加一再写入
上次的代码.类似于是预读.
应该也叫遍历是吗?
我把判断条件放在前面一点点.
好像也能按照逻辑来执行
就是总是觉得不完美.
wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的
这个是代码
下面那个是三个字节
分别为
eepromid..(0,1,2三个变量循环).. CAP状态(1和0)
CAP状态为1 的时候,就可以增加eepromid, 三个变量也能循环.
CAP状态为0的时候, eepromid不增加. 但是读出来的三个变量变成ff了.
逻辑上已经完全正确了.
现在只要把FF变成关机前的那个变量.就完美了.
wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的
卧槽,,,,卧槽
卧槽
我弄好了.
我弄好了
现在可以了
wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的
如果cap==0
eepromid -1
就行了....
现在代码完美了..
下一步做记录cap ++
页:
[1]