搜索
bottom↓
回复: 40

EEPROM多次断电之后数据丢失

[复制链接]

出0入0汤圆

发表于 2017-8-23 17:06:37 | 显示全部楼层 |阅读模式
我的项目是红外遥控RGB配色的,每次上电都会保留现在亮的颜色的数据,然后下次上电就读取,然后送到LED,就是断电记忆颜色,但是三四次之后颜色就不对了,最多是15次才会改变,有时1次都错了,
就是我第一次上电显示白色光,然后遥控器按下对应的颜色,假如是蓝色的话,此时显示蓝色,然后断电,再上电还是蓝色,但是,重复此操作3次以上就可能不再是蓝色了,在此期间没有按键改变颜色,是断电时写EEPROM出错,还是读时出错啊?
以下是部分代码:
uint ReadColour()
{
    uchar ReadColour,i;
   
        PWM_Ver_R=EEPROMRead(10);
        PWM_Ver_G=EEPROMRead(11);
        PWM_Ver_B=EEPROMRead(12);
        PWM_Ver_W=EEPROMRead(13);
    PWM_Ver_R_buff=EEPROMRead(20);
    PWM_Ver_G_buff=EEPROMRead(21);
    PWM_Ver_B_buff=EEPROMRead(22);
    PWM_Ver_W_buff=EEPROMRead(23);
    if(PWM_Ver_R == PWM_Ver_R_buff)
    {}
    else
        PWM_Ver_R=PWM_Ver_R_buff;
    if(PWM_Ver_G == PWM_Ver_G_buff)
    {}
    else
        PWM_Ver_G=PWM_Ver_G_buff;
    if(PWM_Ver_B == PWM_Ver_B_buff)
    {}
     else
        PWM_Ver_B=PWM_Ver_B_buff;
    if(PWM_Ver_W == PWM_Ver_W_buff)
    {}
    else
        PWM_Ver_W=PWM_Ver_W_buff;
    return PWM_Ver_R;
}
//**************LED缓存值函数************************************************//
void BufferLEDRGBValue()
{
    uchar i;
    buffer_PWM_Ver_R=PWM_Ver_R;
    buffer_PWM_Ver_G=PWM_Ver_G;
    buffer_PWM_Ver_B=PWM_Ver_B;
    buffer_PWM_Ver_W=PWM_Ver_W;
    //赋完值就保存颜色数据
    for(i=0;i<5;i++)
    {
        EEPROMWrite(10,PWM_Ver_R);
        EEPROMWrite(11,PWM_Ver_G);
        EEPROMWrite(12,PWM_Ver_B);
        EEPROMWrite(13,PWM_Ver_W);
        if(i==1)
        {
            EEPROMWrite(20,PWM_Ver_R);
            EEPROMWrite(21,PWM_Ver_G);
            EEPROMWrite(22,PWM_Ver_B);
            EEPROMWrite(23,PWM_Ver_W);
        }
    }
}
这是主函数
void main()
{
    PowerInitial(); //MCU初始化始终设置IO口配置
    Timer2Initial(); //设置定时器2,50us定时中断
    EEPROMWrite(0,0xAA); //
    EEPROMWrite(0,0xAA); //初始化EEPROM
    WDTInitial();
    FlagKeyONF=1;
    Flag_PWM_out=1;
    Flag_one_in=0;
    Flag_first=1;
    GIE=1;
    while(1)
    {
        if(Flag_4ms)
        {
            Flag_4ms=0;
            CLRWDT();  //清看门狗
            First_16ms++;
            if(First_16ms>200)
            {
                First_16ms=0;
                Flag_First_16ms=1;
            }
            if(Flag_First_16ms)
            {
                if(Flag_first)
                {
                    Flag_first=0;
                    FlagKeyONF=1;
                    Flag_PWM_out=1;
                    Flag_one_in=0;
                    ReadColour_buffer=ReadColour();
                    
                    if(ReadColour_buffer==0xFF)
                    {
                        PWM_Ver_R=0;
                        PWM_Ver_G=0;
                        PWM_Ver_B=0;
                        PWM_Ver_W=255;
                        BufferLEDRGBValue();
                    }
                }
                else
                {
                    //ScanKey();
                    InfraRedReceiverWork();
                    LEDMinus();
                    LEDPlus();
                    BufferLEDRGBValue();
                    PWM_time++;
                    if(PWM_time>3)
                    {
                        PWM_time=0;
                        //FadeLED();
                    }
                }
            }
        }
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入42汤圆

发表于 2017-8-23 17:22:43 | 显示全部楼层
一般是断电时出错。
EEPROM可以多区备份+校验,开机时读出数据再校验计算,有错读下一备份区,直到正确,并将正确数据写入出错的区。
EEPROM有WP脚,可以平时设置为禁止写,只有在改写时为允许,并写入校验后马上为禁止写。

出0入0汤圆

 楼主| 发表于 2017-8-23 17:33:42 | 显示全部楼层
cocom 发表于 2017-8-23 17:22
一般是断电时出错。
EEPROM可以多区备份+校验,开机时读出数据再校验计算,有错读下一备份区,直到正确,并 ...

我就是不会校验啊,然后只是多次写同一区域,在第二次写时再写一份到其他地址,然后读出来时比较两个是否相等,不相等就保留写到另一地址的数据,现在是有些颜色重复1次就出错,有些大概重复15次以上就出错了,而且特定颜色出错次数基本差不多

出0入42汤圆

发表于 2017-8-23 20:05:46 | 显示全部楼层
最简单的校验就是用校验和。将写入的数据按字节求和,然后写入数据的后面,读出时只要比较一下就可以了。校验和可以是8bit,也可以是16bit.

出0入0汤圆

发表于 2017-8-23 21:51:32 | 显示全部楼层
注意EEPROM有写周期.

出0入0汤圆

发表于 2017-8-24 08:18:57 来自手机 | 显示全部楼层
断电时,电压不稳是引起的吧!以前遇到过,

出0入8汤圆

发表于 2017-8-24 08:20:12 | 显示全部楼层
上电复位后  操作eeprom前  延时个几十MS以上在操作。

出20入12汤圆

发表于 2017-8-24 08:53:51 | 显示全部楼层
从器件角度入手,不差钱用铁电,也可以考虑microchip 的 Serial EERAM

出0入213汤圆

发表于 2017-8-24 09:02:06 | 显示全部楼层
楼主试一下,写数据到EEPROM,不断电再读出来,比较跟写进去的值是否一样.    另每个写操作过后延时几毫秒. 再操作EEPROM.

出0入476汤圆

发表于 2017-8-24 09:21:08 | 显示全部楼层
先备份出来数据,做好标记。然后擦除,写新数据,清除标记。  读的时候先看标记,如果有未完成标记启用备份数据。不然总有可能在在擦写的时候没来得及完成造成数据损坏。
还有尽量不要用eeprom开头的区,有可能复位的时候时序乱的时候写坏。

出0入399汤圆

发表于 2017-8-24 09:23:05 | 显示全部楼层
最近看AVR,正好看到这块:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-8-24 09:23:22 来自手机 | 显示全部楼层
有没有掉电检测电路,检查到掉电电源是否是否足够支持写入

出0入0汤圆

 楼主| 发表于 2017-8-24 10:49:47 | 显示全部楼层
smartmeter 发表于 2017-8-24 09:23
有没有掉电检测电路,检查到掉电电源是否是否足够支持写入

没有这个功能单片机,而且端口已经用完了

出0入0汤圆

 楼主| 发表于 2017-8-24 10:51:06 | 显示全部楼层
infinityvip 发表于 2017-8-24 08:18
断电时,电压不稳是引起的吧!以前遇到过,

我也怀疑是电压不稳,但是单独拿出来测试EEPROM就可以啊

出0入0汤圆

 楼主| 发表于 2017-8-24 10:52:07 | 显示全部楼层
R88 发表于 2017-8-24 09:23
最近看AVR,正好看到这块:

有BOD,但是,没法利用啊,只是编译时设置多少电压就复位而已

出0入0汤圆

发表于 2017-8-24 10:53:02 来自手机 | 显示全部楼层
QL攻城狮 发表于 2017-8-24 10:49
没有这个功能单片机,而且端口已经用完了

做好数据的检验和冗余,可以避免因突然断电导致的数据丢失

出0入0汤圆

发表于 2017-8-24 11:08:07 来自手机 | 显示全部楼层
问题就在eeprom跟mcu的最低工作电压不同,如果eeprom在3v就停止工作,而mcu在2v还可以工作,你需要一个外部检测电压保证mcu读写eeprom时mcu都是在电压高过eeprom的最低工作电压

出0入0汤圆

发表于 2017-8-24 11:09:18 | 显示全部楼层
出错频率这么高,我怎么觉得你的程序或者板子硬件有问题,有加逻辑分析仪检查一下通讯线么。

出0入0汤圆

发表于 2017-8-24 11:10:44 | 显示全部楼层
万分之几的概率还可以理解,你这十几次必出一次的,开玩笑呢

出0入0汤圆

发表于 2017-8-24 11:43:59 来自手机 | 显示全部楼层
用内部带eeprom的单片机如何

出0入0汤圆

发表于 2017-8-24 13:37:22 | 显示全部楼层
肯定是程序写错了。

这程序写的够乱的。

还有连续写5次确保eeprom写入的神操作:
//赋完值就保存颜色数据
    for(i=0;i<5;i++)
    {
        EEPROMWrite(10,PWM_Ver_R);
        EEPROMWrite(11,PWM_Ver_G);
        EEPROMWrite(12,PWM_Ver_B);
        EEPROMWrite(13,PWM_Ver_W);
        if(i==1)
        {
            EEPROMWrite(20,PWM_Ver_R);
            EEPROMWrite(21,PWM_Ver_G);
            EEPROMWrite(22,PWM_Ver_B);
            EEPROMWrite(23,PWM_Ver_W);
        }
    }

出0入0汤圆

发表于 2017-8-24 14:17:38 | 显示全部楼层
wy2000 发表于 2017-8-24 09:21
先备份出来数据,做好标记。然后擦除,写新数据,清除标记。  读的时候先看标记,如果有未完成标记启用备份 ...

这个方法有效,我就是这样用的。

出0入0汤圆

发表于 2017-8-24 20:09:36 | 显示全部楼层
eeprom写操作问题老生常谈了。

出0入0汤圆

发表于 2017-8-24 20:21:50 | 显示全部楼层
wp               

出0入0汤圆

 楼主| 发表于 2017-8-25 08:25:01 | 显示全部楼层
sunnyqd 发表于 2017-8-24 10:53
做好数据的检验和冗余,可以避免因突然断电导致的数据丢失

这个需要怎么做啊?我不是很懂这个,我公司就我一个技术,我还工作不到一年,都没人请教,都是自己查资料

出0入0汤圆

 楼主| 发表于 2017-8-25 08:30:30 | 显示全部楼层
2005n2005 发表于 2017-8-24 11:08
问题就在eeprom跟mcu的最低工作电压不同,如果eeprom在3v就停止工作,而mcu在2v还可以工作,你需要一个外部 ...

板子是客户的,没法增加电路了,而且样板没有这个问题,一直在怀疑是软件问题,但是软件我经验太欠缺,而且现在接受的灵敏度和距离也不高,样板可以接受5米以外,我只能50cm

出0入0汤圆

 楼主| 发表于 2017-8-25 08:31:27 | 显示全部楼层
wswh2o 发表于 2017-8-24 13:37
肯定是程序写错了。

这程序写的够乱的。

我看到说可以多次写入,我也不是很懂,就试着写一下了,没办法,客户一直催,有没有程序共享下啊,嘿嘿

出0入0汤圆

 楼主| 发表于 2017-8-25 11:17:37 | 显示全部楼层
wy2000 发表于 2017-8-24 09:21
先备份出来数据,做好标记。然后擦除,写新数据,清除标记。  读的时候先看标记,如果有未完成标记启用备份 ...

好的,谢谢,我试试

出0入0汤圆

发表于 2017-8-25 11:42:49 | 显示全部楼层
断电之后数据丢失 --> 上电过程没有可靠复位的可能性非常大,是个硬件问题。先判断一下。不下电,软件反复读取是否一直可靠,以此决定问题是软件还是硬件。

出100入101汤圆

发表于 2017-8-25 12:44:14 来自手机 | 显示全部楼层
做好扇区备份和校验

出0入0汤圆

发表于 2017-8-25 12:46:16 | 显示全部楼层
你的程序是一个不断写入过程,写前作标志,写完后复位标志,这个标志位不能因为上下电改变,一定要在需要的情况下才能写。

出0入0汤圆

 楼主| 发表于 2017-8-25 15:08:41 | 显示全部楼层
xiaoxu191 发表于 2017-8-25 11:42
断电之后数据丢失 --> 上电过程没有可靠复位的可能性非常大,是个硬件问题。先判断一下。不下电,软件反复 ...

好的,没想到,缺少经验害死人啊

出0入96汤圆

发表于 2017-8-26 15:07:44 | 显示全部楼层
每个写函数调用后延时10ms试试,另外写入之前判断一下和上次写入的是否相同,不同再写,相同跳过,可以延长e2的寿命

出0入0汤圆

发表于 2017-8-26 16:06:07 来自手机 | 显示全部楼层
你是说遥控器改变数据后立刻保存了,然后再断电,然后再上电读取就可能不对?

出0入0汤圆

 楼主| 发表于 2017-8-29 08:48:07 | 显示全部楼层
szeng 发表于 2017-8-25 12:46
你的程序是一个不断写入过程,写前作标志,写完后复位标志,这个标志位不能因为上下电改变,一定要在需要的 ...

好的,我试试,不过现在板子不在我这里了,,没法测,以后如果解决了我把方法发上来,有些和我一样刚入手的可能会遇到

出0入0汤圆

 楼主| 发表于 2017-8-29 08:54:03 | 显示全部楼层
xiaobendan 发表于 2017-8-26 16:06
你是说遥控器改变数据后立刻保存了,然后再断电,然后再上电读取就可能不对? ...

是的啊,

出0入0汤圆

发表于 2017-8-29 09:08:04 | 显示全部楼层
100%断电没有可靠写入

出0入0汤圆

发表于 2017-8-29 09:22:59 | 显示全部楼层

像是复位电路的问题

出0入4汤圆

发表于 2017-8-29 09:28:01 | 显示全部楼层
QL攻城狮 发表于 2017-8-29 08:48
好的,我试试,不过现在板子不在我这里了,,没法测,以后如果解决了我把方法发上来,有些和我一样刚入手 ...

重新看了一下你程序,发现main里面很过一段时间就去写一下eeprom
eeprom也是有写入次数限制的。而且写之后要有延时。

你需要判断一下,当前值与保存值不同才去写,不然就不写。而且写时,只写入一次即可。

出0入0汤圆

发表于 2017-8-30 22:20:06 | 显示全部楼层
坛里关于单片机写EEPROM操作的程序很多,你可以找找参考一下。在数据写入后都是有延时的,你有没有测在不断电时,连续写,看有没有错。如果实在搞不定,如果可以的话可以原位替换成铁电试试

出0入0汤圆

发表于 2017-9-5 10:38:25 | 显示全部楼层
写入两个区块,作校验。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 20:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表