闪存:在写入几个字节之前是否需要擦除整个页面?

电器工程 闪光
2022-01-03 17:54:20

一个简单的问题,我希望!我没有找到任何确定的答案...

我正在为SST25VF064C闪存芯片编写驱动程序。它通过 SPI 进行通信。

像所有闪存(据我所知)一样,它需要先擦除(所有位 = 1),然后才能写入(位 = 0)。对于这个芯片,可以擦除的最小区域是 4kB。

它的内存被分成 256 字节的页面。使用一条指令,我可以将 1 字节到 256 字节的任何内容写入指定页面。我不必从页面边界开始:要编程的第一个位置可以是页面内的任何位置。

一般规则是确保在写入之前擦除页面。但是,如果我避开已经写入的区域,我可以写入之前写入的页面吗?例如,假设我将数据存储到字节 0-127。如果我从第 128 个字节开始,我以后可以在同一页中再写入 128 个字节吗?

3个回答

是的,在任何擦除之后,您可以在下一次擦除操作之前使用任意数量的单独操作来写入数据(将位从 1 更改为 0)。

您甚至可以重写以前写入的位置,只要您只清除更多位即可。这对于维护分配位图之类的东西很方便。

如果我避开已经写入的区域,我可以写入之前写入的页面吗?

如果我理解 p。数据表的第 16 条正确地说:使用此特定芯片,即使您避开已写入的区域,也不得写入先前写入的页面。

细节

SST25VF064C 闪存芯片数据表在第10 页。16 表示“page-Program 指令在内存中最多编程 256 个字节的数据。在启动 Page-Program 操作之前,选定的页面地址必须处于擦除状态 (FFH)。”

因此,我假设“在启动页面编程操作之前,整个选定页面必须处于擦除状态(页面 FFh 上的每个字节)。” SST 或 Microchip 是否发布了任何文件来澄清这个令人发狂的模棱两可的句子?

根据我的经验,所有 MLC 闪存芯片和一些较新的 SLC 闪存芯片的制造商都规定,一旦页面被写入,必须在再次写入该页面之前擦除该页面,即使您只想将一些 1 位更改为0 位。(这YAFFS 文章中称为“一次写入规则”。)

根据我的经验,所有较旧的闪存芯片都允许您在没有擦除周期的情况下将任何 1 位更改为 0 位,即使该位位于页面中,甚至是已经将其他位编程为零的字节中——闪存页可以在擦除之间多次编程。(这在 YAFFS 文章中称为“多次写入”)。

制造商的数据表是制造商向您做出的有条件承诺。只要您遵循所有数据表建议,制造商就承诺该芯片将按规定运行。我怀疑如果您对先前写入的页面进行编程,避开已经写入的区域,那么立即回读很有可能会给出您期望的数据——新写入的字节是您刚刚写入的值,其他字节可能没有变化。但是,由于这不符合数据表的建议,您不能再依赖数据表中的所有承诺。我听说这种未经批准的活动会导致数据保留时间和耐久性受到影响,因为程序干扰、过度编程、电荷陷阱、类似于DRAM 行锤的影响等。

“内存使用方案会影响误码率。部分页面编程、块内的非连续页面编程、每个块的过度读取而不擦除以及单个块内的读取操作次数不相等都会增加读取次数干扰错误。” ——米哈尔·杰德拉克。 “嵌入式系统中的 NAND 闪存”。

“当在页编程事件期间无意地将位从“1”编程为“0”时,会发生编程干扰。该位错误可能发生在正在编程的页上或块中的另一页上。偏置电压条件页面编程期间的块会导致少量电流隧道进入附近的存储单元。重复的部分页面编程尝试将继续加剧这种情况。——道格拉斯·谢尔顿和迈克尔·弗莱。 “闪存中的干扰测试”页。8、9。

“当在编程操作期间无意地对某个位进行编程(1 到 0)时,就会发生编程干扰。......通过块中的随机编程和对页面应用多次部分写入,这种情况会变得更糟。” “Yaffs NAND 闪存故障缓解”

您正在使用的编程软件很可能已经在写入“所需”的 256 字节。它“看起来”就像它让您能够写入 1 到 256 个字节,但我怀疑它正在做的是将您想要的字节与 256“FF”的“掩码”进行或运算。如果这是正确的,那么您可以“安全地”写入任何字节一次,而不必擦除整个 4K 字节。如果在您的控制之外写入校验和,那么当您将另一个字节写入先前写入的段时,很可能会创建一个无效的校验和。其含义取决于芯片。

如果你的编程软件不做“OR-ing”,你可以自己做。清除一个 256 字节的段,将字节写入正确的位置,或者使用 FF 的 256 字节掩码,然后将该段写入所需的页面。

您可以轻松确定这两种方法是否适用于任何特定芯片。写入前 128 个字节,写入后 128 个字节,确认前 128 个字节没有“搞砸”!