在進(jìn)行數(shù)據(jù)存儲(chǔ)的時(shí)候,我們需要保證數(shù)據(jù)的完整性,而NAND Flash大容量存儲(chǔ)器K9F1G08U芯片由于工藝上問題,不可避免就會(huì)出現(xiàn)有的Block中就是某個(gè)位或某些位是塊的,就是用塊擦除命令也是無(wú)法擦除的,K9F1G08U數(shù)據(jù)手冊(cè)也講了壞塊是存在的,對(duì)于K9F1G08U最多有20個(gè)壞塊。如果數(shù)據(jù)存儲(chǔ)到這個(gè)壞塊中,就無(wú)法保證該數(shù)據(jù)存儲(chǔ)的完整性。對(duì)于壞塊的管理K9F1G08U數(shù)據(jù)手冊(cè)也有它的方法去處理該壞塊的方法,我根據(jù)實(shí)際經(jīng)驗(yàn)總結(jié)出自己的一種方法。首先我們要定義一個(gè)壞塊管理表:unsigned char BadBlockTable[128],此數(shù)組可以存儲(chǔ)1024個(gè)Block狀態(tài),即每一個(gè)字節(jié)存儲(chǔ)8個(gè)Block狀態(tài)。我們要存儲(chǔ)一批數(shù)據(jù)到NAND Flash中去某個(gè)Block時(shí),先執(zhí)行Block擦除操作,然后分析該Block的1st Page和2st Page中的每個(gè)位是否全是FFH,如果全是FFH,則在BadBlockTable數(shù)組當(dāng)前Block對(duì)應(yīng)的字節(jié)位給置0,否則置1。如果是1表示當(dāng)前的塊是不能存儲(chǔ)數(shù)據(jù)的,這時(shí)需要更換下一個(gè)Block來(lái)存儲(chǔ)這些數(shù)據(jù),這樣我們重復(fù)上面的動(dòng)作分析再進(jìn)行分析是否可以存儲(chǔ)數(shù)據(jù),該塊能存儲(chǔ)就存儲(chǔ)到該塊中去。
具體實(shí)現(xiàn)的算法程序如下:
Flag=TRUE; while(TRUE==Flag) {
Erase_K9F1G08U_Block(K9F1G08U.HighAddress,K9F1G08U.LowAddress); Flag=Check_K9F1G08U_Block(K9F1G08U.HighAddress/64); if(TRUE==Flag)//is invalid block {
BadBlockTable[K9F1G08U.HighAddress/512]|=
(1<<(K9F1G08U.HighAddress%8));
K9F1G08U.HighAddress+=64;//Point to Next Block } else// is valid block ,record to BadBlockTable {
BadBlockTable[K9F1G08U.HighAddress/512]&=
~(1<<(K9F1G08U.HighAddress%8)); }
} for(i=0;i<sizeof(BadBlockTable);i++)
Write_RAM(RAM_BANK_0,K9F1G08U_BAD_BLOCK+i,BadBlockTable[i]);
|