0

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

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

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

于 2019-05-27T14:50:06.733 回答
0

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

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

于 2019-05-27T21:56:25.153 回答