最近做项目用到了三星的Nand Flash K9F4G08U,以前没有用过Nand,研究了几天的datasheet后,发现要真正做好Nand Flash的控制还是一件比较麻烦的事情。
首先就是坏块(Invalid Block)的处理,初始情况下(出厂时),坏块被标记在每一个Block的Page0或1的2048列上,如果该地址的数据是0xff,那么可以证明该Block在出厂时(注意仅仅是出厂时,Flash的坏块会随着使用而慢慢增多)不是坏块,反之则是一个坏块,而且坏块的判断不能在芯片擦除后进行,因为坏块标记可能会被擦除(Datasheet上说的非常明确),在记录下来整个Flash的坏块信息后,就需要建立坏块映射表,查了不少资料,网上对于坏块处理的信息并不多,我做了如下的处理:
将Flash划分为三个区,第一个区使用信息(包括坏块表,使用Block数目等,预留10个Block),第二个区为数据记录区,第三个区为坏块映射区(专用于替换坏块,为保留区,不能直接往里面写数据,为128个Block)。
第一次使用时,读取Block0中Page0的资料(一次全部读出),如果Page0的0、1Byte不是'O'、'K'(自己建立的"使用头"标志)的话,那么就运行初始化坏块扫描程序,记录坏块的数目和坏块地址,并且为他们分配坏块映射区的地址(依次分配),并且将坏块信息以及被替换块信息分别保存到两个数组中,检查完后,得到了所有坏块的数目和坏块的映射信息以及最后一个被替换块(用以决定下次替换的地址),将他们格式化后,分别写入到使用信息记录区(Block0-9)中,如果发现Block0编程失败,那么擦除该块直接跳至下一个信息记录Block,直到成功写进去,或者Block0-9全部失败(那么标记整个Flash失效,因为连续10个Block在生命周期内全部失效的几率非常小,所以基本可以忽略~)至此,已经记录下了所有坏块信息、替换信息以及使用状况。
初始信息写进去后,下次重新启动后,系统从Page0至Page9检查是否有头标志,检测到头标志后,继而将所有坏块信息以及实使用信息分别读取到Ram中去,在正常使用中,将要写的Block号在坏块信息数组中查询,如果有,则直接写入被替换的块中,如果发现此时被替换块也是坏块,那么直接读出最后被替换块的值,将此值写到替换表中,并将最后被替换块+1,直到找到合适的替换块,此时将之前坏块的有用信息全部写入到被替换块中,然后继续写入新的数据,最后更新坏块表及坏块信息,并写至使用信息Flash块中,至此,Flash坏块替换完毕。
其次就是位交换问题了,Flash靠电荷储存来存储信息,当由于工艺问题造成某个位写入失败时,位交换发生,需要采用专用算法去校正,比较典型的算法就是ECC,专门用来校正Flash的单个位交换,这个问题我找了很多资料,现在知道了校验方式,但是整个校验看起来比较长,涉及到众多的移位以及异或运算,所以目前尚未加入到程序中,有兴趣的朋友们可以参考三星:
http://www.samsung.com/global/business/semiconductor/products/flash/downloads/applicationnote/eccalgo_040624.pdf
以及
http://www.samsung.com/global/business/semiconductor/products/flash/downloads/applicationnote/samsung_new_ecc_for_512byte_256word.txt
匆忙想出来的解决方法,写得也比较乱,肯定有很多大侠都研究过Nand Flash的,在下只想是抛砖引玉,希望更多朋友交流自己的经验。
用户221285 2009-5-11 09:45
用户177011 2009-3-28 12:49
fmku007_604351039 2009-3-28 00:49
用户5445 2008-7-5 09:01
用户140715 2008-4-14 20:58
用户1364249 2008-4-3 23:47
用户41652 2008-4-2 17:18
用户3684 2008-3-29 09:29
用户941092 2008-3-24 23:03
用户93592 2008-3-2 22:17
我以前经常用最后一种方法的.