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


16

我希望这是一个简单的问题!我找不到任何明确的答案...

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

像所有闪存(据我所知)一样,需要对其进行擦除(所​​有位= 1),然后才能对其进行写入(位= 0)。对于该芯片,可以擦除的最小区域为4kB。

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

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

Answers:


13

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

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


太好了,谢谢!这正是我想要的。
bitsmack 2014年

请注意,从各种数据表来看,有些芯片不喜欢您在后一个字节之后写入一个前一个字节,但是这似乎因器件而异。
价2014年

1
@Vality:你能提供一个例子吗?
戴夫·特威德

3
@DaveTweed NXP LPC21xx和LPC23xx MCU每16个内存字节就有一个校验和字节。您必须一次写入所有16个字节,因为校验和是在该操作中写入的。如果您以后来尝试在同一“行”中写入零,则将写入零,但也将在先前的零上写入新的校验和;否则,将重新写入零。可能是它有一些1,而前一个是0,所以校验和变得无效。我不记得MCU是否允许您读取校验和不正确的行。无论如何,那将是“跨设备变化”的示例。
Guillermo Prandi 2014年

1
“任何数量的单独操作均可写入...下一个擦除操作。” 请注意,某些部件,特别是MCU中的嵌入式闪存,会在需要擦除之前声明最大写入次数。可能违反此限制可能会损坏其他内存区域,因此,请务必注意此类限制。
ajb

5

如果我避开了已经写入的区域,该如何写入先前写入的页面?

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

细节

SST25VF064C闪存芯片数据表p上。16说:“页面编程指令可在内存中编程多达256个字节的数据。在启动页面编程操作之前,所选页面地址必须处于擦除状态(FFH)。”

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

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

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

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

“存储器的使用方案会影响误码率。部分页编程,块内的非顺序页编程,每个块的过度读取而没有擦除以及单个块内的读取操作次数不相等会增加读取次数干扰错误。” -米哈尔·杰德拉克(Michal Jedrak)。 “嵌入式系统中的NAND闪存”。

“在页面编程过程中,当某个位从“ 1”到“ 0”被无意编程时,将发生编程干扰。此位错误可能发生在正在编程的页面上或该块的另一页上。页面编程期间的块会导致少量电流隧穿到附近的存储单元中。重复进行的部分页面编程尝试将继续加剧这种情况。” -道格拉斯·谢尔顿(Douglas Sheldon)和迈克尔·弗赖(Michael Freie)。 “闪存中的干扰测试”。p。8、9

“在编程操作期间,如果对位进行了无意编程(从1到0),则会发生编程干扰。...通过在块中进行随机编程以及对页面进行多次部分写入,会使这种情况变得更糟。” “ Yaffs NAND闪存故障缓解”


0

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

如果您的编程软件不执行“或运算”,则您可以自己执行。清除一个256字节的段,将该字节写入正确的位置,或者使用256字节的FF掩码屏蔽,然后将该段写入所需的页面。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.