vb2002 发表于 2024-11-12 17:39:23

麻烦大佬帮看看这个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;
      }


wlhet 发表于 2024-11-12 20:46:13

前排围观

vb2002 发表于 2024-11-12 20:53:51

wnagming 发表于 2024-11-12 20:38
第一行是从一个固定位置取出numm的值,但是第17行又进行了写入,而擦除又不是每次都能擦掉0X0020+2的数据, ...

所以是这代码感觉有点问题,,
是在反复擦除第一个扇区,
我看串口打印数据,好像每次都是连着写,cap不为真的时候,就返回读第一扇区
有点头大

vb2002 发表于 2024-11-12 20:55:10

wnagming 发表于 2024-11-12 20:38
第一行是从一个固定位置取出numm的值,但是第17行又进行了写入,而擦除又不是每次都能擦掉0X0020+2的数据, ...

还有个问题,您上次给的那个按字节写入的,
我改了下,现在每次cap为真的时候写入可以正常流程写了,,
但是读的时候直接就读0xff了

vb2002 发表于 2024-11-12 21:16:47

wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的

我知道是两个东西
现在这个基本是完善的.
测试出来和我看到的代码不同. 无非是多擦除几次第一页扇区

vb2002 发表于 2024-11-12 21:18:37

wnagming 发表于 2024-11-12 21:01
所以每次读取数据都可以直接写入,看似是读取数据加一再写入

上次的代码.类似于是预读.
应该也叫遍历是吗?
我把判断条件放在前面一点点.
好像也能按照逻辑来执行
就是总是觉得不完美.

vb2002 发表于 2024-11-12 21:38:35

wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的



这个是代码
下面那个是三个字节
分别为
eepromid..(0,1,2三个变量循环).. CAP状态(1和0)
CAP状态为1 的时候,就可以增加eepromid, 三个变量也能循环.
CAP状态为0的时候, eepromid不增加. 但是读出来的三个变量变成ff了.
逻辑上已经完全正确了.   
现在只要把FF变成关机前的那个变量.就完美了.






vb2002 发表于 2024-11-12 22:09:22

wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的

卧槽,,,,卧槽
卧槽

我弄好了.

我弄好了
现在可以了

vb2002 发表于 2024-11-12 22:10:24

wnagming 发表于 2024-11-12 21:02
你现在是每次再同一个位置写入新的数据,当然是不行的

如果cap==0
eepromid -1
就行了....
现在代码完美了..
下一步做记录cap ++
页: [1]
查看完整版本: 麻烦大佬帮看看这个eeprom循环擦写的代码!!