目录
NandFlash结构
- 页(page)
读和写的最小单位,不同厂家的芯片,大小有不同,常见的有256、512、1024、2048字节。
- 块(block)
擦除的最小单位,不同厂家大小也有所不同。
- 额外空间()
这块空间是在每一页的后面多出来的存储空间,不算入总的存储空间,大小一般数十个字节,视芯片而定。
地址访问
NandFlash的地址访问大致由列地址和行地址组成,如下图。
存储空间的访问,由行地址和列地址组成。
行地址:块地址+页地址
列地址:一页中的那个字节
NandFlash芯片除了位宽、命令、各个厂商有所差异外,这个地址的访问也是差异的,以下是两个不同厂商的NandFlash的地址访问描述。
基本上都是4周期和5周期两种,这个主要由存储体大小决定。
5周期
4周期
如何使用NandFlash芯片?
- 基本功能:读取、写入、擦除
- 扩展功能:ECC数据保存校验、坏块管理
读取操作:
- 注意读取一般是按页读取,使用相应的读写命令。(这些命令各大厂商大体一致)
- 实际使用中发现,其实可以按字节为单位,读取比页更小的数量,为了访问效率,应该按页读取。
写入操作:
- 写入操作需要注意,必须保证待写入的存储区域为0xFF才能写入,这个特性基本上的Flash都是这样。所以一般的写入过程都是在擦除后进行。
- 写入也是一般按页写入,使用相应命令完成。另外写入一般叫做“编程”(Program Operations)。
擦除操作:
- 目的是把待处理的区域全部擦写成0xFF
- 操作单位为块,按块擦除。
ECC数据保存校验、坏块管理:
由于Nand的物理特性,导致它的存储单元在使用的过程中会损坏,导致每次读写的数据,可能就不是原数据了。所以在每次读取和写入的操作时,会对数据进行校验,确保写入和读取的数据正确性。
ECC(Error Checking and Correcting)
-
一般把要写入的这一页数据做一个计算,得到与这一页数据相关的一个值。把这个值写入到额外空间,等到读取时,把读取的数据再进行相同的计算,得到的值与写入时保存在额外空间的计算值进行对比,以验证数据的正确性,这个过程就叫做ECC(Error Checking and Correcting).
-
这个计算过程可以使用软件计算、或者硬件计算。
软件计算(软件ECC):通过程序员自己设计相应的算法,通过占用CPU进行计算。
硬件计算(硬件ECC):在主控芯片的NandFlash控制器中,设计了专用的硬件进行相应计算。在读写前通过寄存器控制开启计算,读写后到相应的寄存器中获取计算结果就行。
下面以u-boot中NXP的一款控制器,使用硬件ECC的读取程序作为示例
坏块管理(待确定)
- 坏块管理,简单来说就是,在读写过程中或者专门检测中,发现该块损坏了,就对该块进行标记,类似于ECC数据一样,把标记值存入额外空间中。
- 正常操作时,前从额外空间中读取标记值,确认是否为坏块。
- PS:笔者尚未了解清楚,待定。