基本上,选择主要取决于两个标准:要存储的数据是大还是小,以及是否经常重写:
- 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。但是这些要花费一条胳膊和一条腿,而且您没有提到它们是一种选择。另请注意,这两种较新的技术比闪存实现了更好的擦除/写入速度,因此对于连续记录,这可能很有趣。
代码和代码资源
通常很大,但不会经常变化。显然,如果您的 MCU 有一个内部闪存(就像大多数人一样),那将是可行的方法:它就是为了这个目的而存在的。如果没有,或者它太小,外部闪存芯片(通常是 NOR 闪存)是理想的选择。NOR 闪存比 NAND 更合适,因为您希望代码具有高完整性,而 NAND 闪存通常更难以直接与 MCU/SoC 接口。请注意,要直接从外部闪存执行代码,MCU 需要有一个地址空间到此外部闪存,而大多数低端 MCU 无法做到这一点(此功能通常称为 XIP:eXecute-到位)。
安全和数字版权管理
这个比较棘手。如果它确实包含不应提取的敏感数据,您最好实际使用 SIM 形式的智能卡(最终其中包含一些自定义固件)。但这当然会使设计复杂化很多。另一种(更简单、更便宜)的解决方案可能是专用安全芯片,如 Atmel AT88SC 系列,但芯片上可用的命令必须对您的特定应用有意义。在这个芯片上可以做什么以及在什么条件下必须仔细规划。
如果您只需要“基本”安全性,最简单的方法是使用内部 MCU EEPROM。它不会像智能卡或专用芯片那样安全(其中包含特定的安全措施,例如针对轻微攻击的保护、针对芯片内电源/故障分析的对策等......),但这是您能做到的最好的做。
否则,如果没有内部 EEPROM,您将获得与配置/校准数据相同的选项。然而,使用任何外部芯片来存储安全数据都是有风险的,因为可以使用简单的逻辑分析仪轻松监控数据线,并提取敏感数据。因此,即使据说 EEPROM 比闪存更难篡改,从安全角度来看,在外部芯片的情况下选择其中一个也没有任何区别。
最后,SD 卡在这里绝对是最糟糕的主意,因为它是可移动的。然后可以从 PC 读取敏感数据,甚至不需要任何特定的硬件。