ECC的全稱是Error Checking and Correction,是一種用於Nand的差錯檢測和修正算法。如果操作時序和電路穩定性不存在問題的話,NAND Flash出錯的時候一般不會造成整個Block或是Page不能讀取或是全部出錯,而是整個Page(例如512Bytes)中只有一個或幾個bit出錯。ECC能糾正1個比特錯誤和檢測2個比特錯誤,而且計算速度很快,但對1比特以上的錯誤無法糾正,對2比特以上的錯誤不保證能檢測。 校驗碼生成算法:ECC校驗每次對256字節的數據進行操作,包含列校驗和行校驗。對每個待校驗的Bit位求異或,若結果為0,則表明含有偶數個1;若結果為1,則表明含有奇數個1。列校驗規則如表1所示。256字節數據形成256行、8列的矩陣,矩陣每個元素表示一個Bit位。 ![]() 其中CP0 ~ CP5 為六個Bit位,表示Column Parity(列極性), CP0為第0、2、4、6列的極性,CP1為第1、3、5、7列的極性, CP2為第0、1、4、5列的極性,CP3為第2、3、6、7列的極性, CP4為第0、1、2、3列的極性,CP5為第4、5、6、7列的極性。 用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6, 表示第0列內部256個Bit位異或之后再跟第2列256個Bit位異或,再跟第4列、第6列的每個Bit位異或,這樣,CP0其實是256*4=1024個Bit位異或的結果。CP1 ~ CP5 依此類推。 行校驗如下圖所示 ![]() 其中RP0 ~ RP15 為十六個Bit位,表示Row Parity(行極性), RP0為第0、2、4、6、….252、254 個字節的極性 RP1-----1、3、5、7……253、255 RP2----0、1、4、5、8、9…..252、253 (處理2個Byte,跳過2個Byte) RP3---- 2、3、6、7、10、11…..254、255 (跳過2個Byte,處理2個Byte) RP4---- 處理4個Byte,跳過4個Byte; RP5---- 跳過4個Byte,處理4個Byte; RP6---- 處理8個Byte,跳過8個Byte RP7---- 跳過8個Byte,處理8個Byte; RP8---- 處理16個Byte,跳過16個Byte RP9---- 跳過16個Byte,處理16個Byte; RP10----處理32個Byte,跳過32個Byte RP11----跳過32個Byte,處理32個Byte; RP12----處理64個Byte,跳過64個Byte RP13----跳過64個Byte,處理64個Byte; RP14----處理128個Byte,跳過128個Byte RP15----跳過128個Byte,處理128個Byte; 可見,RP0 ~ RP15 每個Bit位都是128個字節(也就是128行)即128*8=1024個Bit位求異或的結果。 綜上所述,對256字節的數據共生成了6個Bit的列校驗結果,16個Bit的行校驗結果,共22個Bit。在Nand中使用3個字節存放校驗結果,多余的兩個Bit位置1。存放次序如下表所示: ![]() 以K9F1208為例,每個Page頁包含512字節的數據區和16字節的OOB區。前256字節數據生成3字節ECC校驗碼,后256字節數據生成3字節ECC校驗碼,共6字節ECC校驗碼存放在OOB區中,存放的位置為OOB區的第0、1、2和3、6、7字節。 |