频繁写入非易失性存储器

电器工程 微控制器 eeprom 非易失性存储器
2022-01-12 22:34:50

我正在设计一种设备,它可以随着温度的变化自动调整它的物理位置。如果设备关闭或电源断开,设备需要记住它的最后温度和位置。我有能力将这些值存储在 EEPROM 中,但问题是位置和温度可能变化非常迅速。如果我在每次更改后将 temp 和 pos 写入 EEPROM,那会(1)稍微减慢固件速度,(2)可能在一两年后杀死 EEPROM。所以在我看来,我的选择如下......

1)在断电后使用电容器/电池使设备保持供电很短的时间,以便我只能在那个时候将值写入 EEPROM。我不喜欢这个,因为董事会有点耗电,这需要一个很大的上限。而且我没有大量的可用空间。而且我不希望增加电池和电池座/或大容量的成本。

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

3)每5分钟左右只写一次位置和温度。这样我总是记录了一个相当新的位置/温度,但我不是每秒都在写,所以我的程序不会减慢,EEPROM 也不会死得那么快。这似乎是我最好的选择。

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

4个回答

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

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

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

所以使用小于 32 字节页面的数据块是没有意义的。

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

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

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

\$ C = \dfrac{I \cdot t}{\Delta V} = \dfrac{10mA \cdot 5ms}{100mV} = 500\mu F \$

使用小型超级电容很容易。

进一步阅读
datasheet 24AA64
EEPROM 耐久性教程

1)一旦你开始了写过程,你只需要为 MCU/EEPROM 供电并确保控制线不会出现故障——I2C 可能比 SPI 更可取。几毫秒只需要几毫安,所以不应该是一个很大的上限,一旦开始写入,你就可以让 MCU 进入睡眠状态。3)您可能可以应用一些智能,例如延迟 - 一旦写入它总是保持一定的时间,然后可能会发生另一次写入。或者等到值稳定一段时间后再写入。
您还可以通过将数据分散到多个位置来提高耐用性。Microchip 有一些工具和应用笔记来计算其 eeprom 的耐用性,这可能很有用。

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

有必要充分保护闪存的电源,以确保任何对字节的编程尝试都会成功或失败,但是如果擦除周期被中断而留下一个充满任意数据的块,则无关紧要,因为下一次尝试写入数据条目将重新擦除该块。

如果您的数据是 16 位的,那么一个 64Kx8 芯片将容纳超过 32,000 个条目。每秒写入一个条目将填充芯片约 2.7 次。即使是具有“仅”10K 擦除周期耐久性的芯片也将持续 10 年以上。使用更大的芯片,或具有 100K 耐力的芯片,将成比例地增加使用寿命。

1) 可能是最简单的选项,尽管它可能需要更改硬件。我之前在没有 PBC 修改的情况下通过增加去耦帽和中断掉电就实现了这一点。

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

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