|
主题:《用变址寻址原理突破EEPROM存储器的擦写寿命极限》大话篇 返回主题列表
刷新 PAGE 1 / 2 共32篇 首页 前页 后页 尾页 程序匠人 发表于 2002-1-21 19:52 侃单片机 ←返回版面
《用变址寻址原理突破EEPROM存储器的擦写寿命极限》大话篇
时 间:今晚 地 点:“砍弹片鸡”论坛 剧 名:《大话篇》第五场 领衔主演:程序匠人、斑竹 ……
——观众们蜂拥而至,纷纷抢占有利地形……
——鼓响三声,小匠上场……
感谢各位对小匠的大话篇的支持。小匠的大话篇,自推出以来,收视率一直居高不下,好评如潮……(斑竹按:此处删除自吹自擂词语200个……)
但是,也有一些网友提出了批评,说:前面的大话倒是不错,惟独后面的程序太臭,有狗尾续貂之嫌,捆绑销售之意、卖弄才华之疑、哗众取宠之心……
——台下,众网友纷纷点头……
所以,这次,小匠决定不再帖程序了,帖段文字了事吧。
——匠人转身下场,斑竹问:“匠人,今天的大话篇完了?” ——“对,完了!” ——斑竹一把揪住匠人:“好啊,你这个匠人,海报上写得明明白白,是我俩共同领衔主演,我还没上场露脸呢,你倒宣布剧终了!?”
——“乒、乒、乓、乓……”的一阵剧响……
——小匠鼻青脸肿地刚离开论坛,又被一群MM围住。 ——“匠人,你上场才2分钟不到,就想开溜,这摆明了是骗取门票收入。哪里走,吃偶们一吨粉拳!!!”
——“乒、乒、乓、乓……”的又一阵剧响……
——大话篇第五场,匆匆落幕……
——导演忙着招呼众群众演员:“大伙快点,把匠人抬到医院去……”
《用变址寻址原理突破EEPROM存储器的擦写寿命极限》
一般地,EEPROM存储器(如93C46/56/66系列)的擦写次数为10万次,超过这一极限时,该单元就无法再使用了。但在实际应用中,可能有些数据要反复改写。这时,可通过变址寻址的方式来突破EEPROM存储器的擦写寿命极限。
比如,我们有一个单字节的数据要保存在E2PROM(93C56)中,可按以下方法来做:
1、将93C56的00H单元定义为地址指针存放单元。 2、将要寻址的单元地址(假设为01H)放入93C56的00H地址中。 3、每次要对E2PROM中的数据进行读写时,先读取00H中的数据,并以读出的值为地址,访问其指向的单元。 4、在每次写完数据后,立即将数据再读出,并与写入的地址做比较。 A、如果相等,则代表本次写入数据成功。 B、如果不相等,则代表本次写入数据失败。这时,将00H中的值+1,让其指向后一个新的地址单元,再将数据写入新的地址单元。 93C56共有128个字节单元,按照以上方法,可将数据的擦写次数提升120多倍!达到1200多万次!
对于24C16/32/64系列的芯片,也可采用这种方法。
这个方法,小匠使用过多次,证明是可行的。
* - 本贴最后修改时间:2002-1-22 8:23:52 修改者:程序匠人 * - 修改原因:笔误
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
makesoft 发表于 2002-1-21 21:31 侃单片机 ←返回版面
那么00H单元的擦写寿命最少应该为120*100000次
stevenxu 发表于 2002-1-21 21:46 侃单片机 ←返回版面
makesoft,你错了
00H单元只改写了128次
soho 发表于 2002-1-21 22:16 侃单片机 ←返回版面
补充二点
1. EEPROM单元坏与不坏界线很是模糊. EEPROM单元能写入信息是因为它的浮栅能俘获电子并将其困在其中. 但随着时间的推移电子由于热运动或外界给予能量会逐渐逃逸, 所以说EEPROM保持信息是有一定年限的(比如100年). 写入与擦除信息即是向浮栅注入和释放电子,电子能量比较高,可能改变周围的晶格结构,导致浮栅俘获电子能力的下降,也就是表现为保存信息的时间变短, 所以才会有一个保守的写入次数限制(这里说保守是因为半导体的离散性大,实际的次数大得多). 到了规定写入次数并不是说该单元就坏了, 而是说该单元保持信息的时间已不可信赖(而实际上它可能还能保存相当长时间甚至几十上百年),所以实际上短时间很难判定某个单元是否可用(坏了). 如匠人的方法检测, 写入时测试好好的, 可能几秒钟之后该单元的数就逃了.
2. 写坏一个单元是很费时间的, "这个方法,小匠使用过多次,证明是可行的。", 不知匠人在使用过程中是否碰到过有写坏的情况?
个人意见请朋友们扔....
scchenyong 发表于 2002-1-21 23:15 侃单片机 ←返回版面
同意soho兄。
jw5th 发表于 2002-1-22 01:29 侃单片机 ←返回版面
智者千虑,必有一失,(我说的是匠人)
不懂可以,装懂就不好了。这样的话题本人以前提过,被人笑的脸红耳赤,很大的教训哪!
云起 发表于 2002-1-22 05:01 侃单片机 ←返回版面
可以改进
00H存放地址,01H 02H存放次数,每次读写次数+1,达到65535次(FFH),地址指针+1,轮流写过去。
telesoft 发表于 2002-1-22 07:23 侃单片机 ←返回版面
我以为:“在每次写完数据后,立即将数据再读出”这种操作不妥
在EEPROM写操作时,先把内容存在缓冲区中,几毫秒后才能写入EEPROM,所以在这几毫秒内,最好不要对它操作,我说的是24CXX系列。 我认为EEPROM的寿命与产品关系不大。
程序匠人 发表于 2002-1-22 09:26 侃单片机 ←返回版面
答复各位
谢谢大家的提醒…… ——匠人三鞠躬……
1、SOHO的分析真是深刻,你提出“写入时测试好好的, 可能几秒钟之后该单元的数就逃了.”我想,如果用亢余技术来处理的话,也许能回避你所说的问题。
2、TO 云起:你的方法是不可行的,如果按你的方法,数据改写10万次, 01H 02H单元的次数也改写了10万次,那不是也坏了吗?
3、TO telesoft :你的担心是多余的,时序的问题,小匠当然考虑到了。;--)
4、TO jw5th:被你称为“智者”,小匠真是脸红…… ——斑竹在旁打量着匠人:“你好象没有脸红嘛……”
不过,小匠也是抛砖引玉,希望和大家一同探讨,如何完善这种方法。
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
虚拟人 发表于 2002-1-22 12:01 侃单片机 ←返回版面
是个不错的创意!
zh_liqi 发表于 2002-1-22 14:12 侃单片机 ←返回版面
俺做的电视搜台,台号变换用的就是这种方法
俺做的电视搜台,台号变换用的就是这种方法。曾经试过24cXX可连续读写180万次(用了我一下午的时间啊)。
panny 发表于 2002-1-22 17:36 侃单片机 ←返回版面
我有一问题!!
我用89c52写了一程序,通过超级终端运行,发现偶尔出现 光标移位的现象。在有的电脑上却不会出现,为什么呢? 是我的程序有问题还是跟电脑有关?
soho 发表于 2002-1-22 20:22 侃单片机 ←返回版面
匠人提供了一个好思路, 方法稍作修改如何
为了保证EEPROM内的数据可以长久保存, 每个单元的写入次数不能超过规定的限值, 借用匠人和云起的思路,本人提出改进方案:
数据以块为单位存放, 每块可取4个字节, 前三个字节记录写入次数,第四个字节为要保存的数. 每次作写入操作时, 把次数+1连同数据一超写入EEPROM. EEPROM前面开辟一个索引指针区(可供N个数据保存用), 存放数据块的地址由指针计算所得, 计算方法是:基址+指针值*数据块长度. 当某块区域的写入次数到达时, 调整指针指向下一个可用的数据区域.
这样,EEPROM的空间利用率<<25%, 用来换取写入次数>>写入寿命, 方法是否可取, 请诸位拍转.
程序匠人 发表于 2002-1-23 08:29 侃单片机 ←返回版面
也可用数据亢余技术来做。
soho兄:你的方法是可行的。 另外,我的一个思路是,将数据在EEPROM中保存在3个单元,每次读数据时,将3个数据同时读出,用表决的方式判断取出一个有效的值,如果发现哪个单元的数据与其他两个单元的数据不符,则认为该单元坏了。重新换一个。当然,这基于一个假设,即3个单元不可能同时坏掉。 用这种方法,EEPROM的空间利用率可达到33%。
欢迎大家继续讨论……
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
插翅能飞 发表于 2002-1-23 16:11 侃单片机 ←返回版面
听说现在有一些新型的存储器,可改写次数达到上亿次……
不知是真是假?
程序匠人 发表于 2002-1-23 21:54 侃单片机 ←返回版面
小匠好象也听说过,不过也不太熟悉
签名:
如果你的‘芯’是一座作坊,我愿作那不知疲倦的程序匠……
虚拟人 发表于 2002-1-25 14:45 侃单片机 ←返回版面
方法不错,就是空间利用率太低了
soho和匠人的方法都不错,就是空间利用率太低了, 有没有更有效的办法呢?
晓奇 发表于 2002-1-25 18:46 侃单片机 ←返回版面
是个好办法,我的做法
我的做法是:在一个储存数据区的前面加一个特殊的字节例如:'55',用他表示这个区正在使用,每次写入更换一个区,同时对上一次为'55'的标志字节写入'aa',如果每次写入的数据有5字节则以6字节位一组,整个eeprom内轮流循环写。读数据的时候首先按照n*6做地址搜索'55',要死一起死.
* - 本贴最后修改时间:2002-1-25 19:08:27 修改者:晓奇 * - 修改原因:xx
签名:
晓奇工作室
xspartan 发表于 2002-1-25 23:22 侃单片机 ←返回版面
除了佩服还是佩服 唉 ,公司该给你们发奖金阿
程序匠人 发表于 2002-1-25 23:36 侃单片机 ←返回版面
妙啊!
晓奇的方法很好!
优点是明显的: EEPROM的空间利用率大为提高,尤其是当要保存的数据为多字节时。
当然,还有一些需要改进的地方: 1、每次读写数据时都要去找当前的活动区,未免太让CPU操劳了。 2、万一EEPROM中有一个单元的革命意志不坚定,提前退休了,那整片芯片也就完蛋了(这就是所谓的水桶效应——水桶的容量取决于最短的那块板) 3、如果每次要改写的只是个别数据,那怎么办呢?
不管怎么样,这个思路不错,如果再完善一下,一定是个好方法。
签名:
如果你的‘芯’是一座作坊, 我愿做那不知疲倦的程序匠……
想和匠人对话吗?请点击这里^
专业源自专心 串口专家 加入21IC人才库 创造美好新生活 主题:《用变址寻址原理突破EEPROM存储器的擦写寿命极限》大话篇 返回主题列表
刷新 PAGE 2 / 2 共32篇 首页 前页 后页 尾页 zxcasd 发表于 2002-1-26 03:27 侃单片机 ←返回版面
看来晓奇的"要死一起死"的办法最好了
xgdzd 发表于 2002-1-27 23:32 侃单片机 ←返回版面
晓奇的方法很好!但是……
“同时对上一次为'55'的标志字节写入'aa'”,则作为标志的字节其写入次数是数据区的2倍,恐怕要提前“壮烈牺牲”了,难以做到“要死一起死”。若能解决则不失为“妙法”!!!
xiaohh2000 发表于 2002-1-28 10:35 侃单片机 ←返回版面
改良
在晓奇的方法上稍做改进如下:把标志字放在最后,(顺便说一句,标志字最好分析一下系统,取一个系统不可能出现的数字,如果觉得1byte不可靠,可取2byte,另外标志字最好别选A,5之类).查找标志字再写数据(覆盖标志字),然后在所写数据的结尾写标志字.这样可以避免标志字写2遍的问题.至于查找指针的问题,我觉得可以这样:上电时读出写数指针放入RAM中,写了新数后更新指针.
程序匠人 发表于 2002-1-28 12:29 侃单片机 ←返回版面
xiaohh2000的方法小匠看不明白……
能否再解释一下?
签名:
如果你的‘芯’是一座作坊, 我愿做那不知疲倦的程序匠……
想和匠人对话吗?请点击这里^
ymc8 发表于 2002-1-28 12:30 侃单片机 ←返回版面
曾经使用过的方法
EEPROM用X25045: 不常改写的数据共30字节,写入第1~8页。 改写频繁的数据有2字节,保存在20H~1FFH中,以4字节页为单位使用,每页中前2字节作为计数器,后2字节为要保存的数据。 所有计数器第一次使用前先初始化为0FFH。读出数据时先读第一块的计数器,=0,则读下一块的计数器,非0,则直接读出。写入数据时,先读第一块的计数器,=0,则读下一块的计数器,非0,则直接写入,写入后计数器减1,若计数器=0,则同时写入下一块。最后一块写满65535次后,将所有计数器再初始化为0FFH,然后进入下一循环…… 分析: 每页中的四个字节写入次数相同,应该具有接近的寿命; 共使用120页,理论寿命应是只用固定2个字节的120倍; 大部分操作为读计数器,速度快,并且程序判定=0比较容易; 空间利用率一般:50% 适用场合:系统对速度要求不高(若当前块为最后一块,则需读119次计数器);
有几台设备已写入200多万次(估算),目前仍在正常运转。
程序匠人 发表于 2002-1-28 12:44 侃单片机 ←返回版面
21ICBBS果然是藏龙卧虎!
签名:
如果你的‘芯’是一座作坊, 我愿做那不知疲倦的程序匠……
想和匠人对话吗?请点击这里^
xiaohh2000 发表于 2002-1-28 13:32 侃单片机 ←返回版面
对不起,俺没说清楚
设定eeprom的初值0xff.第一次写完数据后,在数据后写标志字.以后的操作:先找标志字,写数时,从标志字开始往后写(必须覆盖标志字),紧接着数据写标志字,读书时,从标志字往前读. 为了防止找标志字太费功夫,可以在系统上电时找到标志字的位置,记录在RAM中,并跟踪变化.
lhhmcs51 发表于 2002-1-28 17:25 侃单片机 ←返回版面
ramtron chip
此系列芯片据资料称可达2亿次写入操作
程序匠人 发表于 2002-1-29 08:44 侃单片机 ←返回版面
lhhmcs51兄:能否介绍一下ramtron chip?
签名:
如果你的‘芯’是一座作坊, 我愿做那不知疲倦的程序匠……
想和匠人对话吗?请点击这里^
虚拟人 发表于 2002-1-30 10:23 侃单片机 ←返回版面
螺蛳壳也能做道场,厉害!
程序匠人 发表于 2002-2-5 23:06 侃单片机 ←返回版面
匠人的改进方法
小匠的这篇帖子,引起大伙一些非常深入的讨论。小匠也从中找到了更完善的方法。不敢独吞,再次现丑了。
首先回顾一下,我原来的方法: 1、将93C56的00H单元定义为地址指针存放单元。 2、将要寻址的单元地址(假设为01H)放入93C56的00H地址中。 3、每次要对E2PROM中的数据进行读写时,先读取00H中的数据,并以读出的值为地址,访问其指向的单元。 4、在每次写完数据后,立即将数据再读出,并与写入的地址做比较。 A、如果相等,则代表本次写入数据成功。 B、如果不相等,则代表本次写入数据失败。这时,将00H中的值+1,让其指向后一个新的地址单元,再将数据写入新的地址单元。
我分析了一下,我要存入E2PROM中的数据为BCD码,并且它的规律是,每次改写都是递增的。在这种情况下,可以在我原先的方法做一些改进。 即,每当被改写的数值递增后发生进位时,就将00H的值+1,让其指向后一个新的地址单元,再将数据写入新的地址单元。 这里借用了晓奇的方法,——“要死一起死”,但是,却省下了大量标志的空间。从理论上来说,空间利用率可接近100%了。 其实,在许多场合下,对于这种频繁改写E2PROM的情况,其改写的值都是有一定规律的,要么递增,要么递减,要么有其它规律,如果对这种规律善加利用,一定可做出最佳的程序。
上述改进方法,我已用到最近的一个案子中了,尚待验证。当然,实际的程序要更复杂一些。 各位有高见,请提出……
* - 本贴最后修改时间:2002-2-5 23:09:00 修改者:程序匠人 * - 修改原因:改
签名:
如果你的‘芯’是一座作坊, 我愿做那不知疲倦的程序匠……
想和匠人对话吗?请点击这里^
makesoft 发表于 2002-2-6 00:46 侃单片机 ←返回版面
空间换时间,是有代价的。
刷新 PAGE 2 / 2 共32篇
|