基本上,选择主要取决于两个条件:要存储的数据是大还是小,以及是否经常重写:
- EEPROM非常适合经常更改的小数据。原因是:它仅以小尺寸出售,但是通常可以将它们擦除单字节。此外,EEPROM的耐久性非常高(数百万个周期)。
- Flash适用于不经常更改的大数据。它可以廉价地用于大容量文件,但是当您需要覆盖数据时,您只能对整个页面(几KB)进行操作。耐久性在100.000个周期的范围内更大。
我不会再详细介绍两者之间的区别,它已经介绍过:
关于SD卡:SD卡是可移动闪存,因此,它遵循与常规闪存相同的约束。但是,它通常使用NAND闪存,而通常,串行闪存芯片使用NOR闪存。NAND闪存更便于写入(较小的页面,更快的擦除),但可靠性较差。如果您进行大量写操作,则一段时间后可能会遇到坏块。损耗均衡可以减轻这种情况,但是并不总是在便宜的SD卡中实现(SD / MMC卡是否确实通过自己的控制器进行损耗均衡?)。您可以在软件中实现它,但是它并不简单。
但是,接口(I2C或SPI)的选择完全无关。I2C较慢,但使用的引脚较少。I2C EEPROM通常也比SPI便宜,但是您通常根据在应用程序中为MCU引脚分配属性的方式决定使用其中一种。
现在,您已经给出了特定的用例,因此让我们一一看一下:
系统配置和校准数据
嗯,这个没有太多限制:该数据通常很小,并且不会经常更改。因此,在这里,最简单的方法是将其放在成本更低的位置:
- 内部MCU EEPROM(如果有)
- 或一些外部闪光灯(如果您已将其用于其他目的)
- 如果您没有其他可用的永久性存储,则可以使用SD卡。但是请注意,由于SD卡最终可以卸下并放入另一台设备中,因此校准数据将不再是一致的。因此,您可能要避免这种情况。
如果设备中没有其他永久存储需求,并且MCU中没有内部EEPROM,则最终可以在MCU本身的闪存中使用特定的闪存页面(如果MCU允许的话)。否则,您可以使用小型外部EEPROM。
请注意,在特定的MAC地址情况下,出售的EEPROM中带有预编程的MAC地址,保证是唯一的(例如Microchip 24AAxxx)。因此,除非您已被IEEE正式分配了地址块或愿意冒险使用本地分配的地址,否则这将是必经之路。
日志
这通常很大,并且经常更改。大表示闪存,而不是EEPROM。因此,您可以使用闪存芯片或SD卡,但是如果确实经常重写日志,则最好使用SD卡。否则,您将有使闪存芯片磨损的风险,并且如果将闪存芯片焊接在板上,将比SD卡更难更换。还要注意的是,当通过循环遍历整个闪存页面来写入日志时,损耗平衡实际上变得微不足道。
如果这些都是小的日志,那么您很幸运,请选择EEPROM(只要可以接受的话)。
请注意,如果耐久性是一个真正的问题,那么还有一些具有无限耐久性和相对较大尺寸的解决方案:F-RAM和MRAM。但是这些花费了您一臂之力,您没有提到它们是一种选择。还要注意,这两种较新的技术比闪存具有更好的擦除/写入速度,因此对于连续记录,这可能很有趣。
代码和代码资源
通常较大,但不经常更改。外部闪存芯片(通常为NOR闪存)是理想的选择。
安全和数字版权管理
这个比较棘手。如果它确实包含绝不应该提取的敏感数据,则最好实际使用SIM卡形式的智能卡(最终在其中包含一些自定义固件)。但是,这当然是复杂的设计了很多。另一种(更简便,更便宜)的解决方案可能是专用的安全芯片,例如Atmel AT88SC系列,但是芯片上可用的命令必须对您的特定应用有意义。该芯片上可以执行的操作以及必须仔细计划的条件。
如果仅需要“基本”安全性,最简单的方法是使用内部MCU EEPROM。它不会像智能卡或专用芯片那样安全(它包含特定的安全措施,例如防止光攻击,针对芯片中的电源/故障分析的对策等等),但这是您能做到的最好做。
否则,如果没有内部EEPROM,您将得到与配置/校准数据相同的选项。但是,使用任何外部芯片来存储安全数据都是有风险的,因为可以使用简单的逻辑分析仪轻松监控数据线,并提取敏感数据。因此,即使据说EEPROM比闪存更难篡改,但从安全角度来看,在使用外部芯片的情况下选择一个或另一个不会有任何区别。
最后,SD卡在这里绝对是最糟糕的主意,因为它是可移动的。然后可以从PC读取敏感数据,甚至不需要任何特定的硬件。