本帖最后由 wscf123 于 2015-2-8 23:35 编辑
经常有人在QQ群讨论有关E2PROM操作、保护、失效等一些问题,今天闲来没事,简单概括总结一下咯。(才疏学浅,路过的英雄记得补刀)
1)有关 芯片内部自带的E2PROM
有的资深的工程师可能不是很愿意用MCU自带的E2PROM,大概是这些家伙上过什么当、受过骗还是什么的。简单说一下优缺点吧:
(1)片内集成的感觉挺便宜的,和MCU一起卖的,对成本要求严格的,写次数很少的场合一般会考虑,至少能省个2、3毛钱吧;
(2)缺点的话,可能擦写次数、稳定性没有外挂的专用芯片厉害;
2)有关常用的外挂E2PROM
如果是学生或者刚从学生时代走来的人们,大概也就知道ATMEL 24C0X系列吧,就好像我毕业的时候以为世界只有51和AVR,开个玩笑!
工程师主要考察E2PROM的参数无非就是擦写次数、功耗、稳定性、价格,其中10万次擦写次数和 100万次擦写次数正在较量,至于从工程师的角度考虑 擦写次数自然是没有上限最好,太低的擦写次数会让程序员死很多脑细胞。
3)有关E2PROM的数据管理
(1)操作注意事项:分页操作需要有5ms延迟等待时间才可以(以类AT24C04的产品为例),也就是模块化程序设计中,在写数据之前、写数据完毕后、度数据之前、读数据之后都需要考虑加5ms的延时时间。本来IIC的读写速率就不是很高,外加这些延迟一定会势必影响系统设计的实时性,但也不得不从读写性能的角度出发。
(2)上拉电阻的选择:出于稳定性考虑,WP、SDA、SCL引脚都会设置上拉电阻,常用的电阻值为 4.7K 、10K电阻,个人比较推荐4.7K。
(3)硬件IIC与软件模拟IIC的比较:对MCU资源不是很敏感的应用,都会考虑软件模拟的方式,毕竟这个移植起来真的很方便,只有第一做软件部分的时序、保护性设计作为足够好,后面拿过来修改时钟就可以直接,确实方便。
(4)默认参数的写入:设置新E2PROM的时间戳标志,每次系统启动时检查这个时间戳和MCU自身存储的时间戳是否一致,不一致则初始化整个E2PROM为默认参数;当然软件程序的升级,这个时间戳表示也有必要做更改。
(5)数据容错和管理:
把数据以有意义的数据块作分类管理,在数据的块的头、位加固定标识和CS/CRC校验 模式,格式如
实际用于产品中,可以挑选这个格式内容里面的部分内容使用,比如去掉结束符等。
个人之所以建立写入开始字、结束字,原因是方便最好读出来的数据做数据格式检查,确认写入、读出的数据可靠性最高。
为增强实际的可靠性,在需要写入的时候,可以在写入后,再读出来进行数据的比对,确认写入是否正确;或者在需要读出的时候,读两次、或者多次,检查每次的数据是否一致。
对于出现异常的数据,最好有容错机制,可以回到默认状态值,不至于系统此时因为某个参数改变的崩溃。
(6)实际底层操作是否需要关闭主程序的中断:一般按照上述(5)操作,有多次冗余操作设计,可以不关闭主程序中断。而且,IIC为等待型操作,一般不会因为系统延迟导致时钟脉宽拉长,影响字节写入、读出。
(7)E2PROM擦写次数的延长: 如果现在手上的E2PROM的擦鞋次数是10万次,项目要求为100万次,且E2PROM内有很多空闲字节的没有使用。
可以这样操作,将数据整理好,以数据块的方式存储,一组数据分10个块地址存储,每次写完后转移到下一块写,即10次写操作中每个物理的数据存储地址只操作了1次。 注意此时的写块数据的指针不能单独存、操作,不然这个字节的操作频率高,也就受到10万次的限制,这个关键的链子在10万次的时候掉了,其他字节也就挂了。这个表征操作哪个块的指针或者说标示符,当然也需要是移动的,至于具体怎么实现,就是见仁见智的事了。