NandFlash和iNand
生活随笔
收集整理的這篇文章主要介紹了
NandFlash和iNand
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
注:本文學(xué)習(xí)朱有鵬老師課程和自己整理而成。方便今后查閱,感謝朱老師~
NandFlash的接口
1.Nand的型號(hào)與命名1、Nand的型號(hào)命名都有含義,就拿K9F2G08來(lái)示例分析一下:K9F表示是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit(256MB)。08表示Nand是8位的(8位就是數(shù)據(jù)線有8根)
2、Nand命名中可以看出:廠家、系列型號(hào)、容量大小、數(shù)據(jù)位數(shù)。
2.Nand的數(shù)據(jù)位
1、Nand有8位數(shù)據(jù)位的,有16位數(shù)據(jù)位的。做電路時(shí)/寫軟件時(shí)應(yīng)該根據(jù)自己實(shí)際采購(gòu)的Nnad的位數(shù)來(lái)設(shè)計(jì)電路/寫軟件。
2、說明Nand是并行接口的(8/16位)
3、Nand的數(shù)據(jù)線上傳遞的不一定全部是有效數(shù)據(jù),也可能有命令、地址等。
3.Nand的功能框圖
1、Nand的結(jié)構(gòu)可以看成是一個(gè)矩陣式存儲(chǔ)器,其中被分成一個(gè)一個(gè)的小塊,每一小塊可以存儲(chǔ)一個(gè)bit位,然后彼此以一定單位組合成整個(gè)Nand。
2、Nand中可以被單次訪問的最小單元(就是說對(duì)Nand進(jìn)行一次讀寫至少要讀寫這么多,或者是這么多的整數(shù)倍)叫做Page(頁(yè)),在K9F2G08芯片中,Page的大小是2KB+64B。也就是說我們要讀寫K9F2G08,每次至少要讀寫2KB或者n*2KB,即使我們只是想要其中的一個(gè)字節(jié)。這就是我們說的典型的塊設(shè)備(現(xiàn)在有些塊設(shè)備為了方便,提供了一種random read模式,可以只讀取1個(gè)字節(jié))。
3、頁(yè)往上還有個(gè)Block(塊)的概念,1個(gè)塊等于若干個(gè)頁(yè)(譬如在K9F2G08中1個(gè)塊等于64頁(yè))。 ??
4、塊往上就是整個(gè)Nand芯片了,叫做Device。一個(gè)Device是若干個(gè)Block,譬如K9F2F08一個(gè)Device有2028個(gè)block。所以整個(gè)Device大小為:2048×64×2K = 256MB
5、塊設(shè)備分page、block有什么意義?首先要明白,塊設(shè)備不能完全按字節(jié)訪問而必須塊訪問是物理上的限制,而不是人為設(shè)置的障礙。其次,Page和Block各有各的意義,譬如Nand中:Page是讀寫Nand的最小單位;Block是擦除Nand的最小單位。(這些規(guī)則都是Nand的物理原理和限制要求的,不是誰(shuí)想要這樣的,所以對(duì)于我們做軟件的來(lái)說,只能去想辦法適應(yīng)硬件,不是想著超越硬件)。
6、Nand芯片中主要包含2部分:Nand存儲(chǔ)顆粒+Nand接口電路。存儲(chǔ)顆粒就是純粹的Nand原理的存儲(chǔ)單元,類似于倉(cāng)庫(kù);Nand接口電路是用來(lái)管理存儲(chǔ)顆粒,并且給外界提供一個(gè)統(tǒng)一的Nand接口規(guī)格的訪問接口的。
7、Nand中有多個(gè)存儲(chǔ)單元,每個(gè)單元都有自己的地址(地址是精確到字節(jié)的)。所以Nand是地址編排精確到字節(jié),但是實(shí)際讀寫卻只能精確到頁(yè)(所以Nand的很多操作都要求給的地址是頁(yè)對(duì)齊的,譬如2K、4K、512K等這樣的地址,不能給3000B這樣的地址)。Nand讀寫時(shí)地址傳遞是通過IO線發(fā)送的,因?yàn)榈刂酚?0位而IO只有8位,所以需要多個(gè)cycle才能發(fā)送完畢。一般的Nand都是4cycle或者5cycle發(fā)送地址(從這里把Nand分為了4cycle Nand和5cycle Nand)。
總結(jié):Nand芯片內(nèi)部有存儲(chǔ)空間,并且有電路來(lái)管理這些存儲(chǔ)空間,向外部提供統(tǒng)一的Nand接口的訪問規(guī)則,然后外部的SoC可以使用Nand接口時(shí)序來(lái)讀寫這個(gè)Nand存儲(chǔ)芯片。
? ? ?Nand接口是一種公用接口,是一種標(biāo)準(zhǔn),理論上來(lái)說外部SoC可以直接模擬Nand接口來(lái)讀寫Nand芯片,但是實(shí)際上因?yàn)閚and接口對(duì)時(shí)序要求非常嚴(yán)格,而且時(shí)序很復(fù)雜,所以一般的SoC都是通過專用的硬件的Nand控制器(這些控制器一般是作為SoC的內(nèi)部外設(shè)來(lái)存在的)來(lái)操控Nand芯片的。
?
?
?
NandFlash的結(jié)構(gòu)
1.Nand的單元組織:block與page(大頁(yè)Nand與小頁(yè)Nand)1、Nand的頁(yè)和以前講過的塊設(shè)備(尤其是硬盤)的扇區(qū)是類似的。扇區(qū)最早在磁盤中是512字節(jié),后來(lái)也有些高級(jí)硬盤扇區(qū)不是512字節(jié)而是1024字節(jié)/2048字節(jié)/4096字節(jié)等。Nand也是一樣,不同的Nand的頁(yè)的大小是不同的,也有512字節(jié)/1024字節(jié)/2048字節(jié)/4096字節(jié)等。
2、一個(gè)block等于多少page也是不定的,不同的Nand也不同。一個(gè)Nand芯片有多少block也是不定的,不同的Nand芯片也不同。
總結(jié):Nand的組織架構(gòu)挺亂的,接口時(shí)序也不同,造成結(jié)構(gòu)就是不同廠家的Nand芯片,或者是同一個(gè)廠家的不同系列型號(hào)存儲(chǔ)容量的nand接口也不一樣。所以nand有一個(gè)很大的問題就是一旦升級(jí)容量或者換芯片系列則硬件要重新做、軟件要重新移植。
2.帶內(nèi)數(shù)據(jù)和帶外數(shù)據(jù)(ECC與壞塊標(biāo)記)
1、Nand的每個(gè)頁(yè)由2部分組成,這2部分各自都有一定的存儲(chǔ)空間。譬如K9F2G08中為2K+64字節(jié)。其中的2K字節(jié)屬于帶內(nèi)數(shù)據(jù),是我們真正的存儲(chǔ)空間,將來(lái)存儲(chǔ)在Nand中的有效數(shù)據(jù)就是存在這2K范圍內(nèi)的(我們平時(shí)計(jì)算nand的容量時(shí)也是只考慮這2KB);
? 64字節(jié)的帶外數(shù)據(jù)不能用來(lái)存儲(chǔ)有效數(shù)據(jù),是作為別的附加用途的(譬如用來(lái)存儲(chǔ)ECC數(shù)據(jù)、用來(lái)存儲(chǔ)壞塊標(biāo)志等····)
2、什么是ECC:(error correction code,錯(cuò)誤校驗(yàn)碼)。
? 因?yàn)镹and存儲(chǔ)本身出錯(cuò)(位反轉(zhuǎn))概率高(Nand較Nor最大的缺點(diǎn)就是穩(wěn)定性),所以當(dāng)我們將有效信息存儲(chǔ)到Nand中時(shí)都會(huì)同時(shí)按照一定算法計(jì)算一個(gè)ECC信息(譬如CRC16等校驗(yàn)算法),將ECC信息同時(shí)存儲(chǔ)到Nand這個(gè)頁(yè)的帶外數(shù)據(jù)區(qū)。然后等將來(lái)讀取數(shù)據(jù)時(shí),對(duì)數(shù)據(jù)用同樣的算法再計(jì)算一次ECC,并且和從帶外數(shù)據(jù)區(qū)讀出的ECC進(jìn)行校驗(yàn)。如果校驗(yàn)通過則證明Nand的有效數(shù)據(jù)可信,如果校驗(yàn)不通過則證明這個(gè)數(shù)據(jù)已經(jīng)被損壞(只能丟棄或者嘗試修復(fù))。
3、壞塊標(biāo)志:Nand芯片用一段時(shí)間后,可能某些塊會(huì)壞掉(這些塊無(wú)法擦除了,或者無(wú)法讀寫了),nand的壞塊非常類似于硬盤的壞道。壞塊是不可避免的,而且隨著Nand的使用壞塊會(huì)越來(lái)越多。
? 當(dāng)壞塊還不算太多時(shí)這個(gè)Nand都是可以用的,除非壞塊太多了不劃算使用了才會(huì)換新的。所以我們?yōu)榱斯芾鞱and發(fā)明了一種壞塊標(biāo)志機(jī)制。Nand的每個(gè)頁(yè)的64字節(jié)的帶外數(shù)據(jù)中,我們(一般是文件系統(tǒng))定義一個(gè)固定位置(譬如定位第24字節(jié))來(lái)標(biāo)記這個(gè)塊是好的還是壞的。
? 文件系統(tǒng)在發(fā)現(xiàn)這個(gè)塊已經(jīng)壞了沒法用了時(shí)會(huì)將這個(gè)塊標(biāo)記為壞塊,以后訪問nand時(shí)直接跳過這個(gè)塊即可。
??
3.Nand的地址時(shí)序
1、Nand的地址有多位,分4/5周期通過IO引腳發(fā)送給Nand芯片來(lái)對(duì)Nand進(jìn)行尋址。尋址的最小單位是字節(jié),但是讀寫的最小單位是頁(yè)。
2、Nand的地址在寫代碼時(shí)要按照Nand要求的時(shí)序和順序去依次寫入。
4.Nand的命令碼
1、外部SoC要想通過Nand控制器來(lái)訪問Nand(實(shí)質(zhì)就是通過Nand接口),就必須按照Nand接口給nand發(fā)送命令、地址、數(shù)據(jù)等信息來(lái)讀寫Nand。
2、Nand芯片內(nèi)部的管理電路本身可以接收外部發(fā)送的命令,然后根據(jù)這些命令來(lái)讀寫Nand內(nèi)容與外部SoC交互。所以我們對(duì)Nand進(jìn)行的所有操作(擦除、讀、寫···)都要有命令、地址、數(shù)據(jù)的參與才能完成,而且必須按照Nand芯片規(guī)定的流程來(lái)做。
NandFlash的常見操作及流程分析
1.壞塊檢查1、Flash使用之前要先統(tǒng)一擦除(擦除的單位是塊)。Flash類設(shè)備擦除后里面全是1,所以擦干凈之后讀出來(lái)的值是0xff。
2、檢查壞塊的思路就是:先塊擦除,然后將整塊讀出來(lái),依次檢測(cè)各自字節(jié)是否為0xff,如果是則表明不是壞塊,如果不是則表明是壞塊。
2.頁(yè)寫(program)操作
1、寫之前確保這個(gè)頁(yè)是被擦除干凈的。如果不是擦除干凈的(而是臟的、用過的)頁(yè),寫進(jìn)去的值就是錯(cuò)的,不是你想要的結(jié)果。
2、寫操作(write)在flash的操作中就叫編程(program)
3、SoC寫Flash時(shí)通過命令線、IO線依次發(fā)送寫命令、寫頁(yè)地址、寫數(shù)據(jù)等進(jìn)入NandFlash。
4、寫的過程:SOC通過Nand控制器和Nand芯片完成順序?qū)?#xff0c;然后按照時(shí)序要求將一頁(yè)數(shù)據(jù)發(fā)給Nand芯片內(nèi)部的接口電路。接口電路先接收收據(jù)到自己的緩沖區(qū),然后再集中寫入Nand芯片的存儲(chǔ)區(qū)域中。
? Nand接口電路將一頁(yè)數(shù)據(jù)從緩沖區(qū)中寫入Nand存儲(chǔ)系統(tǒng)中需要一定的時(shí)間,這段時(shí)間Nand芯片不能再響應(yīng)SOC發(fā)過來(lái)的其他命令,所以SoC要等待Nnad接口電路忙完。
? 等待方法是SoC不斷讀取狀態(tài)寄存器(這個(gè)狀態(tài)寄存器有2種情況:一種是SoC的Nand控制器自帶的,另一種是SoC通過發(fā)命令得到命令響應(yīng)得到的),然后通過檢查這個(gè)狀態(tài)寄存器的狀態(tài)位就能知道Nand接口電路剛才寫的那一頁(yè)數(shù)據(jù)寫完了沒、寫好了沒。
? 直到SoC收到正確的狀態(tài)寄存器響應(yīng)才能認(rèn)為剛才要寫的那一頁(yè)數(shù)據(jù)已經(jīng)ok。(如果SoC收到的狀態(tài)一直不對(duì),可以考慮重寫或者認(rèn)為這一頁(yè)所在的塊已經(jīng)是壞塊,或者整個(gè)Nand芯片已經(jīng)掛掉了)。
5、正常情況下到了第四步就已經(jīng)完了。但是因?yàn)镹and的讀寫有不靠譜情況,因此我們?yōu)榱税踩珪?huì)去做ECC校驗(yàn)。ECC校驗(yàn)有硬件式校驗(yàn)和軟件式校驗(yàn)2種。
? 軟件式校驗(yàn)可以采用的策略有很多,其中之一(Nand芯片手冊(cè)上推薦的方式是):將剛才寫入的1頁(yè)數(shù)據(jù)讀出來(lái),和寫入的內(nèi)容進(jìn)行逐一對(duì)比。如果讀出的和寫入的完全一樣,說明剛才的寫入過程正確完成了;如果讀出來(lái)的和寫入的不完全一樣那就說明剛才的寫入有問題。 ??
6、硬件式ECC:SoC的Nand控制器可以提供硬件式ECC(這個(gè)也是比較普遍的情況)。硬件式ECC就是在Nand的控制器中有個(gè)硬件模塊專門做ECC操作。當(dāng)我們操作Nand芯片時(shí),只要按照SoC的要求按時(shí)打開ECC生成開關(guān),則當(dāng)我們寫入Nand芯片時(shí)SoC的Nand控制器的ECC模塊會(huì)自動(dòng)生成ECC數(shù)據(jù)放在相應(yīng)的寄存器中,然后我們只需要將這生成的ECC數(shù)據(jù)寫入Nand芯片的帶外數(shù)據(jù)區(qū)即可;
? 在將來(lái)讀取這塊Nand芯片時(shí),同樣要打開硬件ECC開關(guān),然后開始讀,在讀的過程當(dāng)中硬件ECC會(huì)自動(dòng)計(jì)算讀進(jìn)來(lái)的一頁(yè)數(shù)據(jù)的ECC值并將之放到相應(yīng)的寄存器中。然后我們?cè)僮x取帶外數(shù)據(jù)區(qū)中原來(lái)寫入時(shí)存入的ECC值,和我們剛才讀的時(shí)候得到的ECC值進(jìn)行校驗(yàn)。校驗(yàn)通過則說明讀寫正確,校驗(yàn)不通過則說明不正確(放棄數(shù)據(jù)或者嘗試修復(fù))。
??
3.擦除(erase)操作
1、擦除時(shí)必須給塊對(duì)齊的地址。如果給了不對(duì)齊的地址,結(jié)果是不可知的(有些Nand芯片沒關(guān)系,它內(nèi)部會(huì)自動(dòng)將其對(duì)齊,而有些Nand會(huì)返回地址錯(cuò)誤)。
2、讀寫時(shí)給的地址也是一樣,要求是頁(yè)對(duì)齊地址。如果給了不對(duì)齊的,也是有可能對(duì)有可能錯(cuò)。
4.頁(yè)讀(read)操作
S5PV210的NandFlash控制器
1.SoC的Nand控制器的作用1、Nand芯片本身通過Nand接口電路來(lái)存取數(shù)據(jù),Nand接口電路和SOC之間通過Nand接口時(shí)序來(lái)通信。Nand接口時(shí)序相對(duì)復(fù)雜,如果要SoC完全用軟件來(lái)實(shí)現(xiàn)Nand接口時(shí)序有一些不好(主要是:第一很難保證時(shí)序能滿足、容易不穩(wěn)定;第二代碼很難寫)。
? 解決方案是:在SoC內(nèi)部集成一個(gè)Nand控制器(實(shí)質(zhì)就是一塊硬件電路,這個(gè)硬件電路完全滿足Nand接口時(shí)序的操作,然后將接口時(shí)序的操作寄存器化)。
2、SOC和Nand芯片之間通信,在SoC沒有Nand控制器時(shí)需要SoC自己來(lái)處理接口時(shí)序,編程很麻煩,需要程序員看Nand芯片的接口時(shí)序圖,嚴(yán)格按照接口時(shí)序圖中編程(尤其要注意各個(gè)時(shí)間參數(shù));
? 在SoC有Nand控制器時(shí)SoC只需要編程操控Nand控制器的寄存器即可,Nand控制器內(nèi)部硬件會(huì)根據(jù)寄存器值來(lái)生成合適的Nand接口時(shí)序和Nand芯片通信。
? 所以在有Nand控制器時(shí)編程要簡(jiǎn)單很多,我們讀寫Nand芯片時(shí)再也不用關(guān)注Nand接口時(shí)序了,只要關(guān)注SoC的Nand控制器的寄存器即可。
3、擴(kuò)展來(lái)講,現(xiàn)在的技術(shù)趨勢(shì)就是:幾乎所有的外設(shè)在SoC內(nèi)部都有對(duì)應(yīng)的控制器來(lái)與其通信,那么SoC內(nèi)部集成的各種控制器(也就是各種內(nèi)部外設(shè))越多,則SoC硬件能完成的功能越多,將來(lái)用這個(gè)SoC來(lái)完成相應(yīng)任務(wù)時(shí)軟件編程越簡(jiǎn)單。
? 譬如說圖形處理和圖像處理領(lǐng)域,2D圖像編碼(jpeg編碼)、視頻編碼(h.264編碼),現(xiàn)在大部分的application級(jí)別的SoC都有集成的內(nèi)部編碼器(像S5PV210就有、更復(fù)雜的譬如4418、6818就更不用說了,只會(huì)更多更先進(jìn)),我們可以利用這些硬件編碼器來(lái)進(jìn)行快速編解碼,這樣軟件工作量和難度降低了很多(這就是所謂的硬件加速)。
??
2.結(jié)構(gòu)框圖分析
結(jié)構(gòu)框圖中關(guān)鍵點(diǎn):SFR(我們后續(xù)編程的關(guān)鍵,編程時(shí)就是通過讀寫SFR來(lái)產(chǎn)生Nand接口時(shí)序以讀寫Nand芯片的) + Nand interface(硬件接口,將來(lái)和Nand芯片的相應(yīng)引腳進(jìn)行連接) + ECC生成器
3.NFCONF、NFCONT、NFCMMD(發(fā)命令)、NFADDR、NFDATA、NFMECCD0&NFMECCD1、NFSECCD、NFSTAT
Nand操作代碼解析
1.分析擦除函數(shù)、擦除函數(shù)、擦除函數(shù)2.總結(jié):
1、像NandFlash這類芯片,通過專用的接口時(shí)序和SoC內(nèi)部的控制器相連(這種連接方式是非常普遍的,像LCD、DDR等都是類似的連接)。這種接法和設(shè)計(jì)對(duì)我們編程來(lái)說,關(guān)鍵在于兩點(diǎn):SoC的控制器的寄存器理解和Nand芯片本身的文檔、流程圖等信息。
2、對(duì)于我們來(lái)說,學(xué)習(xí)NandFlash,要注意的是:
第一,要結(jié)合SoC的數(shù)據(jù)手冊(cè)、Nand芯片的數(shù)據(jù)手冊(cè)、示例代碼三者來(lái)理解。
第二,初學(xué)時(shí)不要嘗試完全不參考自己寫出Nand操作的代碼,初學(xué)時(shí)應(yīng)該是先理解實(shí)例代碼,知道這些代碼是怎么寫出來(lái)的,必要時(shí)對(duì)照文檔來(lái)理解代碼。代碼理解之后去做實(shí)踐,實(shí)踐成功后以后再考慮自己不參考代碼只參考文檔來(lái)寫出nand操作的代碼。
iNand介紹
1.iNand/eMMC/SDCard/MMCCard的關(guān)聯(lián)1、最早出現(xiàn)的是MMC卡,卡片式結(jié)構(gòu),按照MMC協(xié)議設(shè)計(jì)。(相較于NandFlash芯片來(lái)說,MMC卡有2個(gè)優(yōu)勢(shì):第一是卡片化,便于拆裝;第二是統(tǒng)一了協(xié)議接口,兼容性好。)
2、后來(lái)出現(xiàn)SD卡,兼容MMC協(xié)議。SD卡較MMC有一些改進(jìn),譬如寫保護(hù)、速率、容量等。
3、SD卡遵守SD協(xié)議,有多個(gè)版本。多個(gè)版本之間向前兼容。
4、iNand/eMMC在SD卡的基礎(chǔ)上發(fā)展起來(lái),較SD卡的區(qū)別就是將SD卡芯片化了(解決卡的接觸不良問題,便于設(shè)備迷你化)。
5、iNand和eMMC的關(guān)聯(lián):eMMC是協(xié)議,iNand是Sandisk公司符合eMMC協(xié)議的一種芯片系列名稱。
2.iNand/eMMC的結(jié)構(gòu)框圖及其與NandFlash的區(qū)別
1、iNand內(nèi)部也是由存儲(chǔ)系統(tǒng)和接口電路構(gòu)成(和Nand結(jié)構(gòu)特性類似,不同之處在于接口電路功能不同)。
2、iNand的接口電路挺復(fù)雜,功能很健全。譬如:
第一,提供eMMC接口協(xié)議,和SoC的eMMC接口控制器通信對(duì)接。
第二,提供塊的ECC校驗(yàn)相關(guān)的邏輯,也就是說iNand本身自己完成存儲(chǔ)系統(tǒng)的ECC功能,SoC使用iNand時(shí)自己不用寫代碼來(lái)進(jìn)行ECC相關(guān)操作,大大簡(jiǎn)化了SoC的編程難度。(NandFlash分2種:SLC和MLC,SLC更穩(wěn)定,但是容量小價(jià)格高;MLC容易出錯(cuò),但是容量大價(jià)格低)
第三,iNand芯片內(nèi)部使用MLC Nand顆粒,所以性價(jià)比很高。
第四,iNand接口電路還提供了cache機(jī)制,所以inand的操作速度很快。
3.iNand/eMMC的物理接口和SD卡物理接口的對(duì)比
1、S5PV210芯片本身支持4通道的SD/MMC,在X210中實(shí)際是在SD/MMC0通道接了iNand芯片,而SD/MMC2接了SD卡(SD/MMC3也接了SD卡)。
2、對(duì)比inand和SD卡接線,發(fā)現(xiàn):這兩個(gè)接線幾乎是一樣的,唯一的區(qū)別就是SD卡IO線有4根,而iNand的IO線有8根。
3、這個(gè)告訴我們,我們?cè)趯?shí)際操作iNand芯片時(shí)和操作SD卡時(shí)幾乎是一樣的(物理接線幾乎一樣,軟件操作協(xié)議幾乎一樣)。
4.結(jié)論:iNand/eMMC其實(shí)就是芯片化的SD/MMC卡,軟件操作和SD卡相同。
分析iNand芯片的操作代碼時(shí),其實(shí)就是以前的SD卡的操作代碼。一些細(xì)節(jié)的區(qū)別就是為了區(qū)分各種不同版本的SD卡、iNand的細(xì)節(jié)差異。
SD卡/iNand操作
1.硬件接口:DATA、CLK、CMD1、iNand的IO線有8根,支持1、4、8線并行傳輸模式;SD卡IO線有4根,支持1、4線并行傳輸模式。
2、CMD線用來(lái)傳輸命令、CLK線用來(lái)傳輸時(shí)鐘信號(hào)。
3、接口有CLK線,工作時(shí)主機(jī)SoC通過CLK線傳輸時(shí)鐘信號(hào)給SD卡/iNand芯片,說明:SD/iNand是同步的,SD/iNand的工作速率是由主機(jī)給它的CLK頻率決定的。
2.命令響應(yīng)的操作模式
SD協(xié)議事先定義了很多標(biāo)準(zhǔn)命令(CMD0、CMD1·····),每個(gè)命令都有它的作用和使用條件和對(duì)應(yīng)的響應(yīng)。SD卡工作的時(shí)候就是一個(gè)一個(gè)的命令周期組合起來(lái)的,在一個(gè)命令周期中,主機(jī)先發(fā)送CMD給SD卡,然后SD卡解析這個(gè)命令并且執(zhí)行這個(gè)命令,然后SD卡根據(jù)結(jié)果回發(fā)給主機(jī)SoC一個(gè)響應(yīng)。(有些命令是不需要響應(yīng)的,這時(shí)SD卡不會(huì)給主機(jī)回發(fā)響應(yīng),主機(jī)也不用等待響應(yīng))。
標(biāo)準(zhǔn)的命令+響應(yīng)的周期中,主機(jī)發(fā)完一個(gè)命令后應(yīng)該等待SD卡的響應(yīng)而不是接著發(fā)下一條命令。
3.SD/iNand的體系結(jié)構(gòu)圖
SD卡內(nèi)部有一個(gè)接口控制器,這個(gè)控制器類似于一個(gè)單片機(jī),這個(gè)單片機(jī)的程序功能就是通過CMD線接收外部主機(jī)SoC發(fā)給SD卡的命令碼,然后執(zhí)行這個(gè)命令并且回發(fā)響應(yīng)給主機(jī)SoC。
這個(gè)單片機(jī)處理命令及回發(fā)響應(yīng)遵循的就是SD協(xié)議。這個(gè)單片機(jī)同時(shí)可以控制SD卡內(nèi)部的存儲(chǔ)單元,可以讀寫存儲(chǔ)單元。
4.SD/iNand的寄存器(重點(diǎn)是RCA寄存器)
1、注意這里說的是SD卡內(nèi)部的寄存器,而不是主機(jī)SoC的SD控制器的寄存器。(很多外置芯片內(nèi)部都是有寄存器的,這些寄存器可以按照一定的規(guī)則訪問,訪問這些寄存器可以得知芯片的一些信息)。
2、RCA(relative address,相對(duì)地址寄存器)。我們?cè)谠L問SD卡時(shí),實(shí)際上SD卡內(nèi)部每個(gè)存儲(chǔ)單元的地址沒有絕對(duì)數(shù)字,都是使用相對(duì)地址。相對(duì)地址由SD卡自己決定的,存放在RCA寄存器中。
5.SoC的SD/MMC/iNand控制器簡(jiǎn)介
1、不同的SoC可能在SD/MMC/iNand等支持方面有差異,但是如果支持,都是通過內(nèi)部提供SD控制器來(lái)支持的。
2、S5PV210的SD卡控制器在Section8.7部分
SD/iNand代碼實(shí)戰(zhàn)分析1
1.命令碼CMD和ACMD1、SD卡工作在命令+響應(yīng)的模式下。
2、SD協(xié)議的命令分2種:CMDx和ACMDx。CMD是單命令命令,就是單獨(dú)發(fā)一個(gè)CMD即可表示一個(gè)意思。ACMD是一種擴(kuò)展,就是發(fā)2個(gè)CMD加起來(lái)表示一個(gè)意思。可以認(rèn)為ACMDx = CMDy+CMDz(y一般是55)
2.卡類型識(shí)別SD or MMC?
1、MMC協(xié)議、SD協(xié)議、eMMC協(xié)議本身是一脈相承的,所以造成了一定的兼容性,所以當(dāng)我們SoC控制器工作時(shí)連接到SoC上的可能是一個(gè)MMC卡、也可能是SD卡、也可能是iNand芯片。主機(jī)SoC需要去識(shí)別這個(gè)卡到底是什么版本的卡
2、SoC如何區(qū)分卡種類?因?yàn)椴煌姹镜目▋?nèi)部協(xié)議不同的,所以對(duì)卡識(shí)別命令的響應(yīng)也是不同的。SoC通過發(fā)送一些命令、聽取響應(yīng)就可以根據(jù)不同的響應(yīng)判定卡的版本。
3.卡狀態(tài)
SD卡內(nèi)部的接口控制器類似于一個(gè)單片機(jī),這個(gè)單片機(jī)其實(shí)是一個(gè)狀態(tài)機(jī)。所以SD卡任何時(shí)候都屬于某一種狀態(tài)(空閑狀態(tài)、準(zhǔn)備好狀態(tài)、讀寫狀態(tài)、出錯(cuò)狀態(tài)····都是事先定義好的),在這種狀態(tài)下能夠接受的命令是一定的,接受到命令之后執(zhí)行一定的操作然后根據(jù)操作結(jié)果會(huì)跳轉(zhuǎn)為其他狀態(tài)。
如果主機(jī)發(fā)過來(lái)的命令和當(dāng)前狀態(tài)不符狀態(tài)機(jī)就不響應(yīng),如果收到命令和當(dāng)前狀態(tài)相符就會(huì)執(zhí)行相應(yīng)操作,執(zhí)行完之后根據(jù)結(jié)果跳轉(zhuǎn)為其他狀態(tài)。
4.卡回復(fù)類型
1、一般來(lái)說,SD卡的命令都屬于:命令+響應(yīng)的模式。也有極少數(shù)的SD卡命令是不需要回復(fù)的。
2、卡回復(fù)有R1、R7、R1B等8種類型,每種卡回復(fù)類型都有自己的解析規(guī)則。然后卡在特定狀態(tài)下響應(yīng)特定命令時(shí)有可能回復(fù)哪種響應(yīng)都是SD協(xié)議事先規(guī)定好的,詳細(xì)細(xì)節(jié)要查閱協(xié)議文檔。
SD/iNand代碼實(shí)戰(zhàn)分析2
1.linux內(nèi)核風(fēng)格的寄存器定義1、定義一個(gè)基地址,然后定義要訪問的寄存器和基地址之間的偏移量,在最終訪問寄存器時(shí)地址就等于基地址+偏移量。
2、給大家提供的代碼中宏定義是不完整的,很多宏定義只能從字面意思來(lái)理解對(duì)應(yīng),無(wú)法通過語(yǔ)法完全獲得。這樣寫代碼的好處是可以見名知意,就算代碼不全都能讀。
2.SD/iNand相關(guān)的GPIO初始化
1、GPG0相關(guān)的GPIO初始化,參考LED部分的設(shè)置技術(shù)
2、時(shí)鐘設(shè)置參考裸機(jī)第六部分時(shí)鐘那一章,設(shè)置時(shí)使用到了位操作技巧,參考C高級(jí)第二部分
3、要求能夠在兩三分鐘之內(nèi)完全看懂這些代碼涉及到的知識(shí),要能夠在數(shù)據(jù)手冊(cè)、原理圖中找到相對(duì)應(yīng)的點(diǎn),要能夠瞬間明白代碼中涉及到的C語(yǔ)言語(yǔ)法技巧,這樣才叫融會(huì)貫通,才能夠從代碼中學(xué)到東西。
3.SD/iNand相關(guān)的時(shí)鐘系統(tǒng)設(shè)置
參考圖片。
4.SD/iNand的時(shí)鐘設(shè)置
1、SD卡本身工作需要時(shí)鐘,但是自己又沒有時(shí)鐘發(fā)生單元,依靠主機(jī)SoC的控制器通過SD接口中的CLK線傳一個(gè)時(shí)鐘過來(lái)給SD卡內(nèi)部使用。所以主機(jī)SD卡控制器先初始化好自己的時(shí)鐘,然后將自己的時(shí)鐘傳給SD卡。
2、因?yàn)榇藭r(shí)剛開始和SD卡通信,主機(jī)不清楚SD卡屬于哪個(gè)版本(高版本和低版本的SD卡的讀寫速率不同,高版本的可以工作在低版本的速率下,低版本的SD卡不能工作在高版本速率下),所以先給SD卡發(fā)400KHz的低速率時(shí)鐘,SD卡拿到這個(gè)時(shí)鐘后就能工作了。然后在后面和SD卡進(jìn)行進(jìn)一步通信時(shí)去識(shí)別SD卡的版本號(hào),識(shí)別后再根據(jù)SD卡的版本進(jìn)一步給它更合適的時(shí)鐘。
總結(jié)
以上是生活随笔為你收集整理的NandFlash和iNand的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机无法检测到键盘,检测到不兼容的键盘
- 下一篇: 加个ing是什么意思_恋爱ing什么意思