【问题标题】:Is it possible to use a SPI flash chip with a arduino (Atmega328p)是否可以使用带有 arduino 的 SPI 闪存芯片(Atmega328p)
【发布时间】:2019-05-27 08:50:50
【问题描述】:

是否可以使用最小扇区擦除大小为 4KB 的 SPI 闪存芯片和 Atmega 328p(2KB 内部 RAM)?

我看到的问题:为了将数据写入闪存,必须擦除一页。如果要更新扇区内的数据,首先需要读取扇区内的所有页面,将它们保存在芯片外,擦除扇区并按照更改的顺序将页面写回。

但是 4KB 的扇区无法保存在 2KB 的 RAM 中,那么其他人针对这种情况使用什么解决方案?因为我已经看到 Arduinos 用于此设置,但无法确定他们的解决方案是什么。

(Arduino 只是这个问题中小型微控制器的一个例子)

【问题讨论】:

  • 将扇区保存在不同的扇区而不是 RAM 中(而且在断电的情况下更安全),只保留您需要的数据
  • 那么,您需要多少数据?在擦除期间,您只需要根据需要在 RAM 中存储尽可能多的内容。如果您确实需要存储 4kb 数据,那么您可能应该选择另一种类型的内存,例如经典 EEPROM。

标签: arduino embedded low-memory


【解决方案1】:

您可以简单地使用双冗余页面方案。给定两个这样组织的 4kb 页面:

 Page A           Page B
+------------+   +------------+
| Sequence A |   | Sequence B |
!~Sequence A |   !~Sequence B |
+------------+   +------------+
|            |   |            |
|            |   |            |
| Data A     |   |  Data B    |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
|            |   |            |
+------------+   +------------+

最初你写Data A并将Sequence A设置为零它的逆~Sequence A。在启动时,您检查每个页面的序列号并将具有最高有效序列号的页面(当sequence ^ ~sequnece == 0xff 有效)设置为当前读取页面,另一个作为当前写入页面

当你更新数据时,你擦除当前写入页,写入数据区,然后设置序号为读取页序号加1 (模256),并设置它的逆。然后交换当前的读/写页面。更新时,您可以将数据从一个页面复制到另一个页面,而无需缓冲整个页面,并且只修改您打算更改的部分。

如果在写入过程中发生掉电或复位,页序号将无效,因为它是最后写入的,并且顺序和逆序写入都必须完成,因此部分写入的数据将失效,前一个启动时将选择有效页面。

选择当前活动页面时,您当然必须处理包裹周围(即序列号为255且零,零是较新的)。

此方案适用于经常读取和很少写入的数据。 NV 读/写周期的性质和频率将决定合适的机制,因为不同的解决方案适用于顺序日志记录或非易失性事件计数器。

【讨论】:

  • 要挑剔,如果在擦除/编程过程中出现断电或复位,制造商对数据内容不做任何保证。所以严格来说,这需要伴随一个 CRC 校验和。
  • @Lundin :我的错误,从几年前我自己实现的记忆中执行此操作(仍在使用但很少重新访问)-添加了必要的序列号验证(而不是使用 CRC)。否则,正如您所说,写入序列字节时风险窗口较小,擦除页面时风险窗口较大。 CRC 可能仍然有用,但在实践中,我发现此解决方案非常可靠。
【解决方案2】:

有点不清楚,您希望编写什么内容(大小)以及多久编写一次。

您可以考虑几个更小的 NV 块,它们远小于页面大小。每个 NV 块都有一些块头来标识块(例如 BlockID + Size)。然后,只要新的 NV 块适合该页面,您就可以更新该页面。如果没有,请将其写入下一页,并将所有最新的其他块也复制到新页面。然后您可以同时擦除旧页面并为下一次交换做好准备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2013-04-09
    • 2015-10-21
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多