上一篇文章我们介绍了NAND Flash和NOR Flash的区别,从结构及原理上看,NOR Flash这种类似ROM的结构方式,使得他编程简单,所以使用的工程师也很多,要不是成本太高,NAND Flash根本无法生存。
NAND Flash由于价格低廉,存储容量大,越来越受到消费者的喜爱,特别是需要存储大量数据的消费者。那NAND Flash的编程又要注意哪些呢?
定义分区的实质是定义数据会如何写入NAND Flash,不同内容的数据写到对应的地址中。一般用户会有多个区,比如boot、kernel、fs、user等分区。
分区的描述:分区的地址范围(起始块、结束块),镜像文件大小(Image Size)。
分区的数据存储:镜像文件是从分区的起始块开始存放,如果分区中有坏块,将使用坏块处理策略替换坏块,直到镜像文件结束,如果分区中不够好块存放镜像文件,则烧录失败。
如下图是跳过坏块的镜像文件分区烧写示意图:
ECC 存在于NAND 每页的备用区(Spare Area)中,它允许外部系统发现主区的数据是否有误。在大多数情况下,ECC 算法可以纠正误码,NandFlash在使用中也可能会出现坏块,所以ECC是非常有必要的。
不同的用户会可能会使用不同的ECC算法,一般来说ECC算法由处理器供应商提供,如果编程器软件中无这个ECC算法,则需要用户提供ECC算法源代码。
如果用户不使用调入文件,而是使用读母片的方式烧录,并且无动态数据,则可以不考虑ECC算法,因为母片中的备用区已计算好ECC,直接将母片的备用区拷贝至其他芯片即可。
坏块处理策略定义了在遇到坏块时算法应该如何处理,基本的坏块处理策略有:跳过坏块、替换表(预留块区Reserve BlockArea,RBA)等等。
硬拷贝其实就是遇到坏块什么都不处理,不管好块还是坏块直接烧写,即使校验数据不一致也不报错;
跳过坏块就是遇到坏块跳到下一个好块烧;
就是预留一些块作为保留块,是用于替换坏块用,当遇到坏块时,在保留区中选一个块来替换,将原来写到坏块的数据写到替换块中。
其实就是使用跳过坏块,然后在Nand闪存指定位置写入一个坏块表(Bad block table),下图是BBT的结构图。