SPI 数据存储设备:(微型)SD 卡、DataFlash 或串行 EEPROM?

电器工程 spi 闪光 eeprom 数据存储
2022-02-04 04:16:00

我正在重新审视我的一些设计习惯,其中一个正受到严格​​审查:基于 SPI 的存储设备是(微型)SD 卡,因为它们的性价比和通常更高的速度。

在三种主要类型的基于 SPI 的存储设备中 - (micro)SD 卡、DataFlash 和更简单25Cxx的系列 SPI EEPROM(还考虑了微控制器上的内置 EEPROM 和24CxxI2C EEPROM),这是给定用例的合适介质以下?请记住,我将所有介质都用作原始块设备,因此“SD 卡需要文件系统”的说法不成立。

用例:

  • 系统配置和校准数据。示例:以太网接口的 MAC 地址,板载参考电压的测量电压。
  • 日志。示例:从传感器捕获的数据。
  • 代码和代码资源(太大而无法放入程序内存或必须随身携带。)示例:系统更新、国际化和本地化字符串、用户界面资源、字体。
  • 安全和数字版权管理。示例:加密密钥(公共和/或私有、对称和/或非对称)数字签名。
1个回答

基本上,选择主要取决于两个标准:要存储的数据是大还是小,以及是否经常重写:

  • 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 读取敏感数据,甚至不需要任何特定的硬件。