日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

极详细的ECC讲解 -OOB与ECC

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 极详细的ECC讲解 -OOB与ECC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/dongzhichen/article/details/8249228

?

?

詳細的ECC講解 -OOB與ECC??

在網絡編程中

OOB(out of band)帶外數據

在MTD設備中

OOB? 如下所示:

http://www.cnblogs.com/bcxx_qin/archive/2009/06/11/1501271.html

極詳細的ECC講解

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為第0246列的極性,CP1為第1357列的極性,
CP2為第0、145列的極性,CP3為第2、367列的極性,
CP4為第0123列的極性,CP5為第4567列的極性。
用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6, 表示第0列內部256Bit位異或之后再跟第2256Bit位異或,再跟第4列、第6列的每個Bit位異或,這樣,CP0其實是256*4=1024Bit位異或的結果。CP1 ~ CP5 依此類推。
行校驗如下圖所示



其中RP0 ~ RP15 為十六個Bit位,表示Row Parity(行極性),
RP0為第0246….252、254個字節的極性
RP1-----1、357……253、255
RP2----014589…..252、253(處理2Byte,跳過2Byte
RP3---- 23671011…..254255(跳過2Byte,處理2Byte
RP4---- 處理4Byte,跳過4Byte
RP5---- 跳過4Byte,處理4Byte
RP6---- 處理8Byte,跳過8Byte
RP7---- 跳過8Byte,處理8Byte
RP8---- 處理16Byte,跳過16Byte
RP9---- 跳過16Byte,處理16Byte
RP10----處理32Byte,跳過32Byte
RP11----跳過32Byte,處理32Byte
RP12----處理64Byte,跳過64Byte
RP13----跳過64Byte,處理64Byte
RP14----處理128Byte,跳過128Byte
RP15----跳過128Byte,處理128Byte
可見,RP0 ~ RP15 每個Bit位都是128個字節(也就是128行)即128*8=1024Bit位求異或的結果。
綜上所述,對256字節的數據共生成了6Bit的列校驗結果,16Bit的行校驗結果,共22Bit。在Nand中使用3個字節存放校驗結果,多余的兩個Bit位置1。存放次序如下表所示:



K9F1208為例,每個Page頁包含512字節的數據區16字節的OOB256字節數據生成3字節ECC校驗碼256字節數據生成3字節ECC校驗碼,共6字節ECC校驗碼存放在OOB區中,存放的位置為OOB區的第012367字節


?校驗碼生成算法的C語言實現

Linux內核中ECC校驗算法所在的文件為drivers/mtd/nand/nand_ecc.c,其實現有新、舊兩種,在2.6.27及更早的內核中使用的程序,從2.6.28開始已經不再使用,而換成了效率更高的程序。可以在Documentation/mtd/nand_ecc.txt 文件中找到對新程序的詳細介紹。


首先分析一下2.6.27內核中的ECC實現,源代碼見:
http://lxr.linux.no/linux+v2.6.27/drivers/mtd/nand/nand_ecc.c
43/*
44 * Pre-calculated 256-way 1 byte column parity
45 */
46static constu_char
nand_ecc_precalc_table[] = {
47? ?0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00,
48? ?0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,
49? ?0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,
50? ?0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,
51? ?0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,
52? ?0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,
53? ?0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,
54? ?0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,
55? ?0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,
56? ?0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,
57? ?0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,
58? ?0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,
59? ?0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,
60? ?0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,
61? ?0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,
62

0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00
63};



為了加快計算速度,程序中使用了一個預先計算好的列極性表。這個表中每一個元素都是unsigned char類型,表示8位二進制數。
表中8位二進制數每位的含義:





這個表的意思是:對0~255256個數,計算并存儲每個數的列校驗值和行校驗值,以數作數組下標。比如nand_ecc_precalc_table[13 ]??存儲13的列校驗值和行校驗值,13的二進制表示為00001101, 其CP0 =Bit0^Bit2^Bit4^Bit6 = 0
CP1 = Bit1^Bit3^Bit5^Bit7 = 1
CP2 = Bit0^Bit1^Bit4^Bit5 = 1;
CP3 = Bit2^Bit3^Bit6^Bit7 = 0;
CP4 = Bit0^Bit1^Bit2^Bit3 = 1;
CP5 = Bit4^Bit5^Bit6^Bit7 = 0;
其行極性RP = Bit0^Bit1^Bit2^Bit3^Bit4^Bit5^Bit6^Bit7 = 1
nand_ecc_precalc_table[13 ]處存儲的值應該是 0101 0110,即0x56.
注意,數組nand_ecc_precalc_table的下標其實是我們要校驗的一個字節數據。
理解了這個表的含義,也就很容易寫個程序生成這個表了。程序見附件中的 MakeEccTable.c文件。



有了這個表,對單字節數據dat,可以直接查表 nand_ecc_precalc_table[ dat ]得到dat的行校驗值和列校驗值。 但是ECC實際要校驗的是256字節的數據,需要進行256次查表,對得到的256個查表結果進行按位異或,最終結果的 Bit0 ~ Bit5 即是256字節數據的CP0 ~ CP5.
/* Build up column parity */
??81? ?? ???for(i = 0; i < 256;i++) {
??82
/* Get CP0 - CP5 from table */
??83
idx =nand_ecc_precalc_table[*dat++];
??84
reg1 ^= (idx & 0x3f);
??85
??86? ?? ?? ?? ?//這里省略了一些,后面會介紹
??91? ?? ???}



Reg1





在這里,計算列極性的過程其實是先在一個字節數據的內部計算CP0 ~ CP5,每個字節都計算完后再與其它字節的計算結果求異或。而表1中是先對一列Bit0求異或,再去異或一列Bit2。 這兩種只是計算順序不同,結果是一致的。 因為異或運算的順序是可交換的。



行極性的計算要復雜一些。
nand_ecc_precalc_table[]表中的Bit6已經保存了每個單字節數的行極性值。對于待校驗的256字節數據,分別查表,如果其行極性為1,則記錄該數據所在的行索引(也就是for循環的i值),這里的行索引是很重要的,因為RP0 ~ RP15 的計算都是跟行索引緊密相關的,如RP0只計算偶數行,RP1只計算奇數行,等等。

/* Build up column parity */
??81? ?? ???for(i = 0; i < 256;i++) {
??82
/* Get CP0 - CP5 from table */
??83
idx =nand_ecc_precalc_table[*dat++];
??84
reg1 ^= (idx & 0x3f);
??85
??86
/* All bit XOR = 1 ? */
??87? ?? ?? ?? ?? ? if (idx & 0x40) {
??88
reg3 ^= (uint8_t)i;
??89
reg2 ^= ~((uint8_t)i);
??90? ?? ?? ?? ?? ? }
??91? ?? ???}


這里的關鍵是理解第8889行。Reg3reg2都是unsigned char 型的變量,并都初始化為零。
行索引(也就是for循環里的i)的取值范圍為0~255,根據表2可以得出以下規律:


RP0只計算行索引的Bit00的行,RP1只計算行索引的Bit01的行;
RP2只計算行索引的Bit10的行,RP3只計算行索引的Bit11的行;
RP4只計算行索引的Bit20的行,RP5只計算行索引的Bit21的行;
RP6只計算行索引的Bit30的行,RP7只計算行索引的Bit31的行;
RP8只計算行索引的Bit40的行,RP9只計算行索引的Bit41的行;
RP10只計算行索引的Bit50的行,RP11只計算行索引的Bit51的行;
RP12只計算行索引的Bit60的行,RP13只計算行索引的Bit61的行;
RP14只計算行索引的Bit70的行,RP15只計算行索引的Bit71的行;

?

已經知道,異或運算的作用是判斷比特位為1的個數,跟比特位為0的個數沒有關系。如果有偶數個1則異或的結果為0,如果有奇數個1則異或的結果為1
那么,程序第88行,對所有行校驗為1的行索引按位異或運算,作用便是:

判斷在所有行校驗為1的行中,
屬于RP1計算范圍內的行有多少個------reg3Bit 0指示,0表示有偶數個,1表示有奇數個;
屬于RP3計算范圍內的行有多少個------reg3Bit1指示,0表示有偶數個,1表示有奇數個;
屬于RP5計算范圍內的行有多少個------reg3Bit2指示,0表示有偶數個,1表示有奇數個;
屬于RP7計算范圍內的行有多少個------reg3Bit3指示,0表示有偶數個,1表示有奇數個;
屬于RP9計算范圍內的行有多少個------reg3Bit4指示,0表示有偶數個,1表示有奇數個;
屬于RP11計算范圍內的行有多少個------reg3Bit5指示,0表示有偶數個,1表示有奇數個;
屬于RP13計算范圍內的行有多少個------reg3Bit6指示,0表示有偶數個,1表示有奇數個;
屬于RP15計算范圍內的行有多少個------reg3Bit7指示,0表示有偶數個,1表示有奇數個;


所以,reg3每個Bit位的作用如下表所示:
Reg3




89行,對所有行校驗為1的行索引按位取反之后,再按位異或,作用就是判斷比特位為0的個數。比如reg2Bit00表示:所有行校驗為1的行中,行索引的Bit00的行有偶數個,也就是落在RP0計算范圍內的行有偶數個。所以得到結論:


在所有行校驗為1的行中,
屬于RP0計算范圍內的行有多少個------reg2Bit 0指示,0表示有偶數個,1表示有奇數個;
屬于RP2計算范圍內的行有多少個------reg2Bit1指示,0表示有偶數個,1表示有奇數個;
屬于RP4計算范圍內的行有多少個------reg2Bit2指示,0表示有偶數個,1表示有奇數個;
屬于RP6計算范圍內的行有多少個------reg2Bit3指示,0表示有偶數個,1表示有奇數個;
屬于RP8計算范圍內的行有多少個------reg2Bit4指示,0表示有偶數個,1表示有奇數個;
屬于RP10計算范圍內的行有多少個------reg2Bit5指示,0表示有偶數個,1表示有奇數個;
屬于RP12計算范圍內的行有多少個------reg2Bit6指示,0表示有偶數個,1表示有奇數個;
屬于RP14計算范圍內的行有多少個------reg2Bit7指示,0表示有偶數個,1表示有奇數個;


所以,reg2每個Bit位的作用如下表所示:
Reg2



至此,只用了一個查找表和一個for循環,就把所有的校驗位CP0 ~ CP5RP0 ~ RP15全都計算出來了。下面的任務只是按照表3的格式,把這些比特位重新排列一下順序而已。
reg2reg3中抽取出 RP8~RP15放在tmp1中,抽取出RP0~RP7放在tmp2中,
Reg1左移兩位,低兩位置1
然后把tmp2, tmp1, reg1放在ECC碼的三個字節中。
程序中還有CONFIG_MTD_NAND_ECC_SMC, 又進行了一次取反操作,暫時還不知為何。


?

?ECC糾錯算法

NAND Flashpage中寫入數據的時候,每256字節我們生成一個ECC校驗和,稱之為ECC校驗和保存到PAGEOOBout-of-band)數據區中。當NAND Flash中讀取數據的時候,每256字節我們生成一個ECC校驗和稱之為新ECC校驗和



OOB區中讀出的原ECC校驗和新ECC校驗和按位異或,若結果為0,則表示不存在錯(或是出現了ECC無法檢測的錯誤);若3個字節異或結果中存在11個比特位為1表示存在一個比特錯誤,且可糾正;若3個字節異或結果中只存在1個比特位為1,表示OOB區出錯;其他情況均表示出現了無法糾正的錯誤。


假設ecc_code_raw[3]保存原始的ECC校驗碼,ecc_code_new[3]保存新計算出的ECC校驗碼,其格式如下表所示:




ecc_code_raw[3]ecc_code_new[3] 按位異或,得到的結果三個字節分別保存在s0,s1,s2中,如果s0s1s2中共有11Bit位為1,則表示出現了一個比特位錯誤,可以修正。定位出錯的比特位的方法是,先確定行地址(即哪個字節出錯),再確定列地址(即該字節中的哪一個Bit位出錯)。


確定行地址的方法是,設行地址為unsigned charbyteoffs,抽取s1中的Bit7,Bit5,Bit3,Bit1,作為byteoffs的高四位, 抽取s0中的Bit7,Bit5,Bit3,Bit1 作為byteoffs的低四位, 則byteoffs的值就表示出錯字節的行地址(范圍為0 ~ 255)。
確定列地址的方法是:抽取s2中的Bit7,Bit5,Bit3作為bitnum的低三位,bitnum其余位置0,則bitnum的表示出錯Bit位的列地址 (范圍為0 ~ 7)。


下面以一個簡單的例子探索一下這其中的奧妙。
假設待校驗的數據為兩個字節,0x45(二進制為0100 0101)和0x38(二進制為0011 1000),其行列校驗碼如下表所示:






從表中可以計算出CP5 ~ CP0的值,列在下表的第一行(原始數據)。假設現在有一個數據位發生變化,0x38變為0x3A,也就是Byte
1Bit 10變成了1,計算得到新的CP5 ~ CP0值放在下表第2行(變化后數據)。新舊校驗碼求異或的結果放在下表第三行。


可見,當 Bit
1發生變化時,列校驗值中只有CP1CP2CP4發生了變化,而CP0CP3CP5沒變化,也就是說6Bit校驗碼有一半發生變化,則求異或的結果中有一半為1。同理,行校驗求異或的結果也有一半為1。這就是為什么前面說256字節數據中的一個Bit位發生變化時,新舊22Bit校驗碼求異或的結果中會有11Bit位為1





再來看怎么定位出錯的Bit位。以列地址為例,若CP5發生變化(異或后的CP5=1),則出錯處肯定在Bit 4 ~ Bit 7中;若CP5無變化(異或后的CP5=0,則出錯處在Bit 0 ~ Bit 3 中,這樣就篩選掉了一半的Bit位。剩下的4Bit位中,再看CP3是否發生變化,又選出2Bit位。剩下的2Bit位中再看CP1是否發生變化,則最終可定位1個出錯的Bit位。下面的樹形結構更清晰地展示了這個判決過程:

圖表 1??出錯Bit列地址定位的判決樹




注意:圖中的CP指的是求異或之后的結果中的CP


為什么只用CP4CP2CP0呢?其實這里面包含冗余信息,因為CP5=1則必有CP4=0CP5=0則必有CP4=1,也就是CP5CP4一定相反,同理,CP3CP2一定相反,CP1CP0一定相反。所以只需要用一半就行了。


這樣,我們從異或結果中抽取出CP5CP3CP1位,便可定位出錯Bit位的列地址。比如上面的例子中CP5/CP3/CP1 = 001,表示Bit 1出錯。


同理,行校驗RP1發生變化,抽取RP1,可知Byte 1發生變化。這樣定位出Byte 1Bit 0出錯。
當數據位256字節時,行校驗使用RP0 ~ RP15,抽取異或結果的RP15RP13RP11RP9RP7RP5RP3RP1位便可定位出哪個Byte出錯,再用CP5,CP3,CP1定位哪個Bit出錯。

?

TestEcc.rar(2.12 KB)?? 用ECC定位出錯Bit的實驗程序? http://linux.chinaunix.net/bbs/attachment.php?aid=231922

?MakeEccTable.rar?Make_Ecc_Table.c 代碼??http://linux.chinaunix.net/bbs/attachment.php?aid=231869

?

Nand Flash原理分析與編程

NAND Flash 在嵌入式系統中的地位與PC機上的硬盤是類似的用于保存系統運行所必需的操作系統,應用程序,用戶數據,運行過程中產生的各類數據,系統掉電后數據不會護丟失.本文主要介紹關于NAND Flash的組織結構和編寫程序的方法。
?????? 在三星的NAND Flash 中,當CPU從NAND Flash開始啟動時,CPU會通過內部的硬件將NAND Flash開始的4KB數據復制到稱為“Steppingstone”的4KB的內部RAM中,起始地址為0,然后跳到地址0處開始執行。這也就是我們為什么可以把小于4KB的程序燒到NAND Flash中,可以運行,而當大于4KB時,卻沒有辦法運行,必須借助于NAND Flash的讀操作,讀取4KB以后的程序到內存中。
NAND Flash的尋址方式和NAND Flash的memory組織方式緊密相關。NAND Flash的數據是以bit的方式保存在 memory cell(存儲單元)。一般情況下,一個cell中只能存儲一個bit。這些cell以8個或者16個為單位,連成 bit line ,形成所謂的byte(x8)/word(x16),這就是NAND Flash的位寬。
這些Line會再組成Pape(頁)。然后是每32個page形成一個Block,所以一個Block(塊)大小是16k.Block是NAND Flash中最大的操作單元其中的擦除操作是以Block為單位進行擦除,而讀寫和編程是以page為單位進行操作的,并且讀寫之前必須進行flash的擦寫。我們這里以三星K9F1208U0M的NAND Flash 為例,它的大小是64MB的。
1block = 32page
1page = 512bytes(datafield) + 16bytes(oob)
K9F1208U0B總共有4096 個Blocks,故我們可以知道這塊flash的容量為4096 *(32 *528)= 69206016 Bytes = 66 MB
但事實上每個Page上的最后16Bytes是用于存貯檢驗碼用的,并不能存放實際的數據,所以實際上我們可以操作的芯片容量為
4096 *(32 *512) = 67108864 Bytes = 64 MB
Nand Flash 物理結構圖
在NAND Flash中有8個I/O引腳(IO0—IO7)、5個全能信號(nWE ALE CLE nCE nRE)、一個引腳,1個寫保護引腳。操作NAND Flash時,先傳輸命令,然后傳輸地址,最后讀寫數據。對于64MB的NAND Flash,需要一個26位的地址。只能8個I/O引腳充當地址、數據、命令的復用端口,所以每次傳地址只能傳8位。這樣就需要4個地址序列。因此讀寫一次nand flash需要傳送4次(A[7:0] A[16:9] A[24:17] A[25])。64M的NAND Flash的地址范圍為0x00000000—0x03FFFFFF。
一頁有528個字節,而在前512B中存放著用戶的數據。在后面的16字節中(OOB)中存放著執行命令后的狀態信息。主要是ECC校驗的標識。列地址A0-A7可以尋址的范圍是256個字節,要尋址528字節的話,將一頁分為了A.(1half array)B(2 half array) C(spare array)。A區0—255字節,B區 256-511 字節C區512—527字節。訪問某頁時必須選定特定的區。這可以使地址指針指向特定的區實現。
在NAND Flash 中存在三類地址,分別為Block Address 、Column Address Page Address.。
Column Address 用來選擇是在上半頁尋址還是在下半頁尋址A[0]—A[7].也就相當于頁內的偏移地址。在進行擦除時不需要列地址,因為擦除是以塊為單位擦除。32個Page需要5bit來表示。也就是A[13:9];也就是頁在塊內的相對地址。A8這一位用來設置512字節的上半頁,還是下半頁,1表示是在上半頁,而2表示是在下半頁。Block的地址有A[25:14]組成。
存儲操作特點:
1.擦除操作的最小單位是塊
2.Nand Flash芯片每一位只能從1變為0,而不能從0變為1,所以在對其進行寫入操作之前一定要將相應塊擦除(擦除就是將相應塊的位全部變為1
3 OOB部分的第六字節(即517字節)標志是否壞塊如果不是壞塊該值為FF,否則為壞塊
4 除OOB第六字節外,通常至少把OOB前3字節存放Nand Flash硬件ECC碼
一個容量為64M(512Mbit)的NAND Flash,分為131072頁,528列。(實際中由于存在spare area,故都大于這個值),有4096塊,需要12bit來表示即A[25:14].如果是128M(1Gbit)的話,blodk Address為A[26:14].由于地址只能在IO0—IO7上傳送。編程時通常通過移位來實現地址的傳送。傳送過程如下:
第1個地址序列:傳遞column address,也就是NAND Flash[7:0],這一周期不需要移位即可傳遞到I/O[7:0]上,而half page pointer 即A8是由操作指令決定,00h,在A區,01h在B區,指令決定在哪個half page上進行讀寫,而真正A8的值是不需要程序員關心的;
第2個地址序列:就是將NAND_ADDR 右移9位,而不是8位,將NAND_ADDR[16:9]傳遞到I/O[7:0]上;
第3個地址序列:將NAND_ADDR[24:17] 傳遞到I/O[7:0]上;
第4個地址序列:將NAND_ADDR[25]傳送到I/O上。
整個地址的傳送過程需要4步才能完成。如果NAND Flash 的大小是32MB的以下的話,那么block address 最高位只到bit24,因此尋址只需要3步,就可以完成。
在進行擦除操作時由于是以塊進行擦除,所以只需要3個地址序列,也就是只傳遞塊的地址,即A[14:25]。
NAND Flash地址的計算:
Column Address 翻譯過來是列地址,也就是在一頁里的偏移地址。其實是指定Page上的某個Byte,指定這個Byte,其實也就是指定此頁的讀寫起始地址。
Page Address:頁地址。頁的地址總是以512Bytes對齊的,所以它的低9位問題0,確定讀寫操作在NAND Flash中的哪個頁進行。

?

?

總結

以上是生活随笔為你收集整理的极详细的ECC讲解 -OOB与ECC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。