是否可以将 SPI 闪存芯片与 arduino (Atmega328p) 一起使用
Is it possible to use a SPI flash chip with a arduino (Atmega328p)
是否可以将最小扇区擦除大小为 4KB 的 SPI 闪存芯片与 Atmega 328p(2KB 内部 RAM)一起使用?
我遇到的问题:为了将数据写入闪存,必须擦除一页。如果你想更新扇区内的数据,你首先需要读取扇区内的所有页面,将它们保存在芯片外,擦除扇区并按顺序将页面写入你的更改。
但是4KB的扇区不能保存在2KB的RAM里面,请问其他人有什么解决办法呢?因为我看到 Arduinos 被用在这个设置中,但无法确定他们的解决方案是什么。
(Arduino只是本题中的一个小型单片机的例子)
您可以简单地使用 dual-redundant 页面方案。给定 两个 4kb 页面,组织如下:
Page A Page B
+------------+ +------------+
| Sequence A | | Sequence B |
!~Sequence A | !~Sequence B |
+------------+ +------------+
| | | |
| | | |
| Data A | | Data B |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+------------+ +------------+
最初你写 Data A
并将 Sequence A
设置为零它的倒数 ~Sequence A
。在 start-up 上,您检查每个页面的序号并将具有最高有效序号(在 sequence ^ ~sequnece == 0xff
时有效)的页面设置为 当前阅读页面 ,另一个作为当前写入页面。
更新数据时擦除当前写入页,写入数据区,然后设置序号为读取页面的序号加 1(模 256),并设置其倒数。然后交换当前 read/write 页。更新时,您可以将数据从一个页面复制到另一页面,而无需缓冲整个页面,并且只修改您想要更改的部分。
如果写入过程中出现断电或复位,页面序号将无效,因为它是最后写入的,并且顺序和逆序写入都必须完成,因此部分写入的数据将无效并且将在 start-up.
上选择上一个有效页面
选择当前活动页面时,当然要处理wrap-around(即序号为255和0时,0为新)
这种方案适用于经常读,很少写的数据。 NV read/write 周期的性质和频率将决定合适的机制,因为不同的解决方案适用于顺序日志记录或 non-volatile 事件计数器。
有点不清楚,您希望写什么内容(大小)以及多久写一次。
你可以想到几个更小的 NV 块,它们比页面大小小得多。每个 NV 块都有一些标识块的块头(例如 BlockID + Size)。然后,只要新的 NV 块适合该页面,您就可以更新该页面。如果没有,将其写入下一页,并将所有最新的其他块也复制到新页面。然后你可以同时擦除旧页面并准备下一次交换。
是否可以将最小扇区擦除大小为 4KB 的 SPI 闪存芯片与 Atmega 328p(2KB 内部 RAM)一起使用?
我遇到的问题:为了将数据写入闪存,必须擦除一页。如果你想更新扇区内的数据,你首先需要读取扇区内的所有页面,将它们保存在芯片外,擦除扇区并按顺序将页面写入你的更改。
但是4KB的扇区不能保存在2KB的RAM里面,请问其他人有什么解决办法呢?因为我看到 Arduinos 被用在这个设置中,但无法确定他们的解决方案是什么。
(Arduino只是本题中的一个小型单片机的例子)
您可以简单地使用 dual-redundant 页面方案。给定 两个 4kb 页面,组织如下:
Page A Page B
+------------+ +------------+
| Sequence A | | Sequence B |
!~Sequence A | !~Sequence B |
+------------+ +------------+
| | | |
| | | |
| Data A | | Data B |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+------------+ +------------+
最初你写 Data A
并将 Sequence A
设置为零它的倒数 ~Sequence A
。在 start-up 上,您检查每个页面的序号并将具有最高有效序号(在 sequence ^ ~sequnece == 0xff
时有效)的页面设置为 当前阅读页面 ,另一个作为当前写入页面。
更新数据时擦除当前写入页,写入数据区,然后设置序号为读取页面的序号加 1(模 256),并设置其倒数。然后交换当前 read/write 页。更新时,您可以将数据从一个页面复制到另一页面,而无需缓冲整个页面,并且只修改您想要更改的部分。
如果写入过程中出现断电或复位,页面序号将无效,因为它是最后写入的,并且顺序和逆序写入都必须完成,因此部分写入的数据将无效并且将在 start-up.
上选择上一个有效页面选择当前活动页面时,当然要处理wrap-around(即序号为255和0时,0为新)
这种方案适用于经常读,很少写的数据。 NV read/write 周期的性质和频率将决定合适的机制,因为不同的解决方案适用于顺序日志记录或 non-volatile 事件计数器。
有点不清楚,您希望写什么内容(大小)以及多久写一次。
你可以想到几个更小的 NV 块,它们比页面大小小得多。每个 NV 块都有一些标识块的块头(例如 BlockID + Size)。然后,只要新的 NV 块适合该页面,您就可以更新该页面。如果没有,将其写入下一页,并将所有最新的其他块也复制到新页面。然后你可以同时擦除旧页面并准备下一次交换。