频繁写入非易失性存储器


10

我正在设计一种会随温度变化自动调整其物理位置的设备。如果设备关闭或电源断开,则设备需要记住其上次的温度和位置。我可以将这些值存储在EEPROM中,但问题是位置和温度变化非常快。如果每次更改后将温度和pos写入EEPROM,这将(1)降低固件速度,(2)一两年后可能会杀死EEPROM。因此,正如我所见,我的选择如下...

1)断电后,请使用电容器/电池在短时间内保持设备供电,以便我只能在那时将值写入EEPROM。我不喜欢这样,因为该板有点耗电,这需要很大的限制。而且我没有大量的可用空间。而且,我不希望电池和电池座的额外成本或大笔费用。

2)使用F-RAM代替EEPROM,这样我就可以写万亿次而不会用完。我不喜欢这个选项,因为FRAM比EEPROM贵很多,而且是用于生产产品的(不仅仅是一个)。

3)仅每5分钟左右写一次位置和温度。这样,我总是会记录最近的位置/温度,但我不会每秒写入一次,因此程序不会变慢,而EEPROM不会死得那么快。这似乎是我最好的选择。

还有其他人有我没有想到的建议吗?


5
就一个问题。如果设备自动调整其物理位置,为什么还要记住最近的温度?再次打开设备电源时,它不会更新温度并调整其位置吗?
丹尼尔·格里洛

1
我同意丹尼尔。如果断电并且环境温度急剧变化怎么办?上电后,如果您使用了上次保存的温度/位置,则无论如何您将处于错误的位置,并且无论如何设备最终都将移动。还有没有在您的问题中列出的其他要求?
戴夫

EEPROM规范是什么-多少个写周期?
詹森·S

Answers:


10

您需要的是一种称为损耗平衡的技术。它不会每次都在EEPROM的同一位置写入数据,而是使用某种算法来使用不同的位置。我已经读过有关复杂的磨损均衡算法的信息,但是我不知道为什么下面的简单方法不起作用。

在您的数据中添加一个24位计数器,以便您的数据块的长度为8个字节。24AA64上的页面长32个字节,因此一个64kb的EEPROM可容纳256个页面。从数据表:

“当写入少于32个字节时,页面其余部分中的数据将随着写入的数据字节一起刷新。这将迫使整个页面承受写入周期,因此,每页指定了耐久性。”

因此,使用小于32字节页面的数据块是没有意义的。

看第一页的柜台。如果为零,则使用该页面的最大写周期数,因此转到下一页并检查该计数器。重复直到找到一个计数器> 0。那就是您当前正在使用的页面。Microchip的EEPROM具有100万次循环的耐久性,在给定的示例中,如果64KB EEPROM中的每个块最大为32个字节,则可以增加到2.56亿次。那应该足以使您的产品耐用:如果您每5秒钟写一次(!),则可以使用40年。

您将需要在首次使用时初始化EEPROM。你怎么知道那是什么时候。初始化时使用最后一页写入唯一签名。在每次通电时检查签名是否存在。如果不是,则必须初始化设备。您可以在每个页面中使用0xF4240(一百万个)预置计数器,或者在初次使用该页面时将所有内容清除为0xFF并写入0xF4240。
需要初始化EEPROM,因为有时在生产/测试过程中会写入某种模式。

编辑
损耗均衡应该可以解决您的问题,但是我仍然要评论电容器解决方案。您说该板相当耗电,但是也许可以用二极管将微控制器/ EEPROM的电源与板的其余部分隔离开。因此,当主电源消失时,您可能只需要几个mA。24AA64会在不到5ms的时间内写完一页,然后在10mA和100​​mV的允许压降下需要

C=ItΔV=10mA5ms100mV=500μF

使用小型超级电容即可轻松实现。

进一步阅读
数据表24AA64
EEPROM耐久性指南


每页给出EEPROM的耐久性(至少对于24AA64和我使用的其他EEPROM)。24AA64指定一个32字节的页面,因此计数应该是每页而不是每个块。
萨德2012年

@Saad-正确。固定在我的答案。
stevenvh 2012年

4

1)一旦开始写过程,您只需要给MCU / EEPROM供电,并确保控制线不会毛刺-为此,I2C可能比SPI更可取。只需几毫安几毫秒的时间,这样就不会有太大的上限了,一旦启动写操作,您就可以让MCU进入睡眠状态。3)您可能可以应用一些智能,例如释抑-一旦写入,它总是保持一定的时间,然后再进行写入。或等待直到值稳定一段时间后再写入。
您还可以通过将数据分布在多个位置来提高耐用性。Microchip有一些工具和应用笔记可以计算其eeprom的耐久性,这可能会很有用。


4
Microchip关于耐用性的应用笔记: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf 在Appnote中,您还可以通过将工作电压从5v降至3.5v来将耐用性提高约2倍。
vandee 2011年

1
如果使用第一种方法,请确保一旦启动即在系统中写入非易失性存储器是最高优先级。中断不会导致您的值在写入过程中发生变化,或者导致微控制器无法启动其他处理,从而导致时间用尽。最重要的是,断电时不要写入损坏的值。此外,值的CRC可以帮助您确认未发生损坏,但是必须确定是否发生损坏,例如使用默认值。
马丁

3

我建议使用面向块的闪存设备,并将每个块中的一个字节用作模式标志。保持不变,几乎所有模式标志都将被编程;只有一个未编程模式标志的块,而前一个块(如有必要,则进行包装)被编程。该块将是具有最新数据的块。当该块填满时,擦除下一个块(请注意,被擦除的块可以在擦除周期内保存数据的任何组合,并且不变量仍将保持不变),然后在完成擦除后,将模式标志编程为是最后一个街区。

有必要充分保护闪存的电源,以确保对字节进行编程的任何尝试都能成功或全部失败,但是中断擦除周期并保留一个充满任意数据的块并不重要,因为下一次写入数据条目的尝试将重新擦除该块。

如果您的数据是16位,则64Kx8芯片将容纳32,000多个条目。每秒写入一个条目将使芯片充满约2.7倍。甚至具有“仅” 10K擦除周期耐久性的芯片也将持续10年以上。使用较大的芯片或具有100K耐力的芯片会按比例增加使用寿命。


2

1)可能是最简单的选项,尽管它可能需要更改硬件。我以前在不修改PBC的情况下就已经做到了这一点,只需增加去耦电容并中断掉电即可。

2)正如您所指出的,FRAM的问题在于价格!

3)根据温度和位置数据的波动性,只有在值发生变化时才通过写入来增加耐力。您可能每秒对温度进行一次采样,但是如果仅每5分钟更改一次,则问题就解决了。


1

这是我在项目中解决此问题的方法:

保留1个闪存扇区,以保存未使用的插槽的位掩码和该值的多个插槽。

我使用的位掩码长16个字节,因此我有128个插槽可放置值。

位掩码被初始化为全1,就闪存而言,这是擦除状态。

当您想写入一个新值时,读入位掩码并找到第一位。这是您将在其中写入值的插槽号。将该位更改为零以将其标记为已使用,然后将位掩码写回闪存,而无需先擦除它。接下来,在不擦除闪存的情况下,将该值写入位掩码后的插槽。

这样,只需写入新的位掩码(从1到0的变化),就可以将闪存写周期延长128倍。

如果整个位掩码为0,则擦除闪存扇区并重新开始。


3
我可能会让您失望,但是当您稍微闪烁一下时,整个扇区都将被覆盖。您的解决方案将使“位掩码”扇区真正很快消失。
2011年

1
如果不擦除闪存,则不会用完该扇区的10K擦除周期之一。如果您具有值0x7F并写入值0x3F,则结果将为0x3F。这样可以使位掩码保持最新状态,但不会擦除闪存。仅当整个位掩码为0时,擦除操作才会发生。–
Robert

如果我错了,让我们讨论一下。我不想在这里有错误的答案,而且我真的不希望我的项目中有错误的设计。
罗伯特

我认为罗伯特是对的。在我的微控制器上,一次只能写入4个字节,但是所需的位设置为零。使它们恢复为1的唯一方法是将1k块空白。它是唯一会磨损闪光灯的擦除周期...
蒂姆(Tim)

对于每种类型的内存,甚至对于内存供应商,它可能都不同。我已经看到EEPROM必须擦除该页面,然后在每次写入时都对其进行重写。我见过闪存,您可以写入仍为1的位而不会擦除页面。
mjh2007'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.