标题: 关于EEPROM扇区擦除的问题 [打印本页]

作者: liyago    时间: 2022-8-9 19:54
标题: 关于EEPROM扇区擦除的问题

如果是擦除1个扇区,那么是直接擦除就可以了,但是要擦除多个扇区呢,好像用重复的方法不好用,


                                                                        IapEraseSector(IAP_ADDRESS);        //清除内存
                                                                        IapEraseSector(IAP_ADDRESS2);        //清除内存
                                                                        IapEraseSector(IAP_ADDRESS3);        //清除内存
在擦每个扇区间加个延时也不行



                                                                        IapEraseSector(IAP_ADDRESS);        //清除内存
                                                                        delay1ms(20);//延时1ms
                                                                        IapEraseSector(IAP_ADDRESS2);        //清除内存
                                                                        delay1ms(20);//延时1ms
                                                                        IapEraseSector(IAP_ADDRESS3);        //清除内存
                                                                        delay1ms(20);//延时1ms



请教各位大神都是如何擦除EEPROM多个扇区的呢?


使用的芯片是:STC15F2k08S2、STC15F2k32S2

作者: wulin    时间: 2022-8-9 21:14
        for(i=0;i<10;i++)//连续擦除10个扇区
        {
                IapEraseSector(i*0x0200);
        }
作者: lkc8210    时间: 2022-8-9 21:19
  1. for(i=0;i<3;i++)
  2. {
  3.         IapEraseSector(IAP_ADDRESS+i*512);
  4. }
复制代码

作者: 188610329    时间: 2022-8-9 21:22
IAP_CONTR | = 0x80;
IAP_CMD = 0x03;
IAP_ADDRH = ????;   //Epprom高位地址
IAP_TRIG = 0x5A;
IAP_TRIG = 0xA5;

一共就 5 句话,连续 删除多个扇区的话,只要不断重复后面三句就够了。 你整那么花俏,最终关键代码又不发出来,有啥用?
作者: npn    时间: 2022-8-9 21:33
IAP_ADDRESS、IAP_ADDRESS2、IAP_ADDRESS3 是常量还是 变量? 具体请将程序贴完成。
作者: 君工创    时间: 2022-8-9 21:46
STC15F2k08S2的EEPROM扇区地址是:0000h,到D3FFh.擦除要对应地址。
作者: univers    时间: 2022-8-10 11:10
官方有例程。用一个循环。
作者: coody_sz    时间: 2022-8-10 11:31
正如“沙发”发的,一个for循环的事,一条调用语句即可。
作者: liyago    时间: 2022-8-10 12:05
wulin 发表于 2022-8-9 21:14
for(i=0;i

谢谢,这样简单方便,通杀了
作者: liyago    时间: 2022-8-10 12:09
lkc8210 发表于 2022-8-9 21:19

我原来想用0x0400开始后面的3个扇区,用了以下for循环
#define IAP_ADDRESS 0x0400
        for(i=0;i<3;i++)
        {
                IapEraseSector(IAP_ADDRESS);
                IAP_ADDRESS=IAP_ADDRESS+0x0200;
        }

但存不住信息,断电就没了
对比你的代码,受教了,谢谢,我这代码应也没什么问题吧?
作者: liyago    时间: 2022-8-10 12:11
188610329 发表于 2022-8-9 21:22
IAP_CONTR | = 0x80;
IAP_CMD = 0x03;
IAP_ADDRH = ????;   //Epprom高位地址

你这直接在擦除函数里修改,不好维护和移植啊
作者: liyago    时间: 2022-8-10 12:14
coody_sz 发表于 2022-8-10 11:31
正如“沙发”发的,一个for循环的事,一条调用语句即可。

用过for的,发现不成功,以为是我的擦除方式错了,想请教一下连续擦除多个扇区,擦每个扇区后要休息一下的吗?还有如何检验EEPROM有些扇区是不良的呢?
作者: lkc8210    时间: 2022-8-10 15:15
liyago 发表于 2022-8-10 12:09
我原来想用0x0400开始后面的3个扇区,用了以下for循环
#define IAP_ADDRESS 0x0400
        for(i=0;i

你这IAP_ADDRESS是宏定义的
你写的代码是 IAP_ADDRESS=IAP_ADDRESS+0x0200;
但编译器看到的是0x0400=0x0400+0x0400;
当然存不住信息
作者: yzwzfyz    时间: 2022-8-10 16:59
注意:擦除是需要时间的。
时间不足时,访问它,你就会发现未擦干净。等时间足够了,再访问就OK了。
作者: liyago    时间: 2022-8-10 18:38
lkc8210 发表于 2022-8-10 15:15
你这IAP_ADDRESS是宏定义的
你写的代码是 IAP_ADDRESS=IAP_ADDRESS+0x0200;
但编译器看到的是0x0400=0x ...

明白了,又一个低级错误,怎么会把这看成了变量,多谢了!
作者: npn    时间: 2022-8-10 20:44
yzwzfyz 发表于 2022-8-10 16:59
注意:擦除是需要时间的。
时间不足时,访问它,你就会发现未擦干净。等时间足够了,再访问就OK了。

是否擦干净用 do while 进行判断,没有字节擦除,只有扇区擦除,一次擦 512字节。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1