嵌入式裸机NandFlash和 SD/iNand学习笔记
一. Nandflash
1.1 定義
Nand-flash存儲(chǔ)器是flash存儲(chǔ)器的一種,其內(nèi)部采用非線性宏單元模式,為固態(tài)大容量?jī)?nèi)存的實(shí)現(xiàn)提供了廉價(jià)有效的解決方案。Nand-flash存儲(chǔ)器具有容量較大,改寫速度快等優(yōu)點(diǎn),適用于大量數(shù)據(jù)的存儲(chǔ),因而在業(yè)界得到了越來越廣泛的應(yīng)用,如嵌入式產(chǎn)品中包括數(shù)碼相機(jī)、MP3隨身聽記憶卡、體積小巧的U盤等。
1.2 Nand的型號(hào)與命名
(1)Nand的型號(hào)命名都有含義,就拿K9F2G08來示例分析一下:K9F表示是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit(256MB)。08表示Nand是8位的(8位就是數(shù)據(jù)線有8根)
 (2)Nand命名中可以看出:廠家、系列型號(hào)、容量大小、數(shù)據(jù)位數(shù)等。
 (3)Nand有8位數(shù)據(jù)位的,有16位數(shù)據(jù)位的。做電路時(shí)/寫軟件時(shí)應(yīng)該根據(jù)自己實(shí)際采購(gòu)的Nnad的位數(shù)來設(shè)計(jì)電路/寫軟件。
 (4)說明Nand是并行接口的(8/16位)
 (5)Nand的數(shù)據(jù)線上傳遞的不一定全部是有效數(shù)據(jù),也可能有命令、地址等。
更多詳情可參考:http://www.360doc.com/content/15/0209/16/6828497_447485125.shtml
1.3 Nand的功能框圖
 
 (我們通過從小到大的方式來認(rèn)識(shí)Nand的結(jié)構(gòu))
 (1)Nand的結(jié)構(gòu)可以看成是一個(gè)矩陣式存儲(chǔ)器,其中被分成一個(gè)一個(gè)的小塊,每一小塊可以存儲(chǔ)一個(gè)bit位,然后彼此以一定單位組合成整個(gè)Nand。
 (2)Nand中可以被單次訪問的最小單元(就是說對(duì)Nand進(jìn)行一次讀寫至少要讀寫這么多,或者是這么多的整數(shù)倍)叫做Page(頁),在K9F2G08芯片中,Page的大小是2KB+64B。也就是說我們要讀寫K9F2G08,每次至少要讀寫2KB或者n*2KB,即使我們只是想要其中的一個(gè)字節(jié)。這就是我們說的典型的塊設(shè)備(現(xiàn)在有些塊設(shè)備為了方便,提供了一種random read模式,可以只讀取1個(gè)字節(jié))。
 (3)頁往上還有個(gè)Block(塊)的概念,1個(gè)塊等于若干個(gè)頁(譬如在K9F2G08中1個(gè)塊等于64頁)。
 (4)頁往上就是整個(gè)Nand芯片了,叫做Device。一個(gè)Device是若干個(gè)Block,譬如K9F2F08一個(gè)Device有2028個(gè)block。所以整個(gè)Device大小為:2048×64×2K = 256MB
(5)塊設(shè)備分page、block有什么意義?
(6)Nand芯片中主要包含2部分:Nand存儲(chǔ)顆粒+Nand接口電路。存儲(chǔ)顆粒就是純粹的Nand原理的存儲(chǔ)單元,類似于倉庫;Nand接口電路是用來管理存儲(chǔ)顆粒,并且給外界提供一個(gè)統(tǒng)一的Nand接口規(guī)格的訪問接口的。
 (7)Nand中有多個(gè)存儲(chǔ)單元,每個(gè)單元都有自己的地址(地址是精確到字節(jié)的)。所以Nand是地址編排精確到字節(jié),但是實(shí)際讀寫卻只能精確到頁(所以Nand的很多操作都要求給的地址是頁對(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ǔ)空間,并且有電路來管理這些存儲(chǔ)空間,向外部提供統(tǒng)一的Nand接口的訪問規(guī)則,然后外部的SoC可以使用Nand接口時(shí)序來讀寫這個(gè)Nand存儲(chǔ)芯片。Nand接口是一種公用接口,是一種標(biāo)準(zhǔn),理論上來說外部SoC可以直接模擬Nand接口來讀寫Nand芯片,但是實(shí)際上因?yàn)閚and接口對(duì)時(shí)序要求非常嚴(yán)格,而且時(shí)序很復(fù)雜,所以一般的SoC都是通過專用的硬件的Nand控制器(這些控制器一般是作為SoC的內(nèi)部外設(shè)來存在的)來操控Nand芯片的。
1.4 帶內(nèi)數(shù)據(jù)和帶外數(shù)據(jù)(ECC與壞塊標(biāo)記)
(1)Nand的每個(gè)頁由2部分組成,這2部分各自都有一定的存儲(chǔ)空間。
 譬如K9F2G08(Figure2)中為2K+64字節(jié)。其中的2K字節(jié)屬于帶內(nèi)數(shù)據(jù),是我們真正的存儲(chǔ)空間,將來存儲(chǔ)在Nand中的有效數(shù)據(jù)就是存在這2K范圍內(nèi)的(我們平時(shí)計(jì)算nand的容量時(shí)也是只考慮這2KB);64字節(jié)的帶外數(shù)據(jù)不能用來存儲(chǔ)有效數(shù)據(jù),是作為別的附加用途的(譬如用來存儲(chǔ)ECC數(shù)據(jù)、用來存儲(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è)頁的帶外數(shù)據(jù)區(qū)。然后等將來讀取數(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ì)壞掉(這些塊無法擦除了,或者無法讀寫了),nand的壞塊非常類似于硬盤的壞道。壞塊是不可避免的,而且隨著Nand的使用壞塊會(huì)越來越多。當(dāng)壞塊還不算太多時(shí)這個(gè)Nand都是可以用的,除非壞塊太多了不劃算使用了才會(huì)換新的。所以我們?yōu)榱斯芾鞱and發(fā)明了一種壞塊標(biāo)志機(jī)制。Nand的每個(gè)頁的64字節(jié)的帶外數(shù)據(jù)中,我們(一般是文件系統(tǒng))定義一個(gè)固定位置(譬如定位第24字節(jié))來標(biāo)記這個(gè)塊是好的還是壞的。文件系統(tǒng)在發(fā)現(xiàn)這個(gè)塊已經(jīng)壞了沒法用了時(shí)會(huì)將這個(gè)塊標(biāo)記為壞塊,以后訪問nand時(shí)直接跳過這個(gè)塊即可。
1.5 Nand的地址時(shí)序
 (1)nand的地址有多位,分4或5期通過IO引腳發(fā)送給Nand芯片來對(duì)Nand進(jìn)行尋址。尋址的最小單位是字節(jié),但是讀寫的最小單位是頁。
 (2)nand的地址在寫代碼時(shí)要按照Nand要求的時(shí)序和順序去依次寫入。
1.6 Nand的命令碼
(1)外部SoC要想通過Nand控制器來訪問Nand(實(shí)質(zhì)就是通過Nand接口),就必須按照Nand接口給nand發(fā)送命令、地址、數(shù)據(jù)等信息來讀寫Nand。
 (2)Nand芯片內(nèi)部的管理電路本身可以接收外部發(fā)送的命令,然后根據(jù)這些命令來讀寫Nand內(nèi)容與外部SoC交互。所以我們對(duì)nand進(jìn)行的所有操作(擦除、讀、寫···)都要有命令、地址、數(shù)據(jù)的參與才能完成,而且必須按照Nand芯片規(guī)定的流程來做。
 
1.7 NandFlash的常見操作及流程分析
1.7.1 壞塊檢查
(1)Flash使用之前要先統(tǒng)一擦除(擦除的單位是塊)。Flash類設(shè)備擦除后里面全是1,所以擦干凈之后讀出來的值是0xff。
 (2)檢查壞塊的思路就是:先塊擦除,然后將整塊讀出來,依次檢測(cè)各自節(jié)是否為0xff,如果是則表明不是壞塊,如果不是則表明是壞塊,如上圖所示,如果不是就會(huì)建立一個(gè)壞塊表或者更新最初的壞塊表。
1.7.2 頁寫(program)操作
(1)寫之前確保這個(gè)頁是被擦除干凈的。如果不是擦除干凈的(而是臟的、用過的)頁,寫進(jìn)去的值就是錯(cuò)的,不是你想要的結(jié)果。
 (2)寫操作(write)在flash的操作中就叫編程(program)
 (3)SoC寫Flash時(shí)通過命令線、IO線依次發(fā)送寫命令、寫頁地址、寫數(shù)據(jù)等進(jìn)入NandFlash。
 (4)寫的過程:SOC通過Nand控制器和Nand芯片完成順序?qū)?#xff0c;然后按照時(shí)序要求將一頁數(shù)據(jù)發(fā)給Nand芯片內(nèi)部的接口電路。接口電路先接收收據(jù)到自己的緩沖區(qū),然后再集中寫入Nand芯片的存儲(chǔ)區(qū)域中。Nand接口電路將一頁數(shù)據(jù)從緩沖區(qū)中寫入Nand存儲(chǔ)系統(tǒng)中需要一定的時(shí)間,這段時(shí)間Nand芯片不能再響應(yīng)SOC發(fā)過來的其他命令,所以SoC要等待Nnad接口電路忙完。等待方法是SoC不斷讀取狀態(tài)寄存器(這個(gè)狀態(tài)寄存器有2種情況:一種是SoC的Nand控制器自帶的,另一種是SoC通過發(fā)命令得到命令響應(yīng)得到的),然后通過檢查這個(gè)狀態(tài)寄存器的狀態(tài)位就能知道Nand接口電路剛才寫的那一頁數(shù)據(jù)寫完了沒、寫好了沒。直到SoC收到正確的狀態(tài)寄存器響應(yīng)才能認(rèn)為剛才要寫的那一頁數(shù)據(jù)已經(jīng)ok。(如果SoC收到的狀態(tài)一直不對(duì),可以考慮重寫或者認(rèn)為這一頁所在的塊已經(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頁數(shù)據(jù)讀出來,和寫入的內(nèi)容進(jìn)行逐一對(duì)比。如果讀出的和寫入的完全一樣,說明剛才的寫入過程正確完成了;如果讀出來的和寫入的不完全一樣那就說明剛才的寫入有問題。
 (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ū)即可;在將來讀取這塊Nand芯片時(shí),同樣要打開硬件ECC開關(guān),然后開始讀,在讀的過程當(dāng)中硬件ECC會(huì)自動(dòng)計(jì)算讀進(jìn)來的一頁數(shù)據(jù)的ECC值并將之放到相應(yīng)的寄存器中。然后我們?cè)僮x取帶外數(shù)據(jù)區(qū)中原來寫入時(shí)存入的ECC值,和我們剛才讀的時(shí)候得到的ECC值進(jìn)行校驗(yàn)。校驗(yàn)通過則說明讀寫正確,校驗(yàn)不通過則說明不正確(放棄數(shù)據(jù)或者嘗試修復(fù))。
1.7.3 擦除(erase)操作/頁讀(read)操作
 (1)擦除時(shí)必須給塊對(duì)齊的地址。如果給了不對(duì)齊的地址,結(jié)果是不可知的(有些Nand芯片沒關(guān)系,它內(nèi)部會(huì)自動(dòng)將其對(duì)齊,而有些Nand會(huì)返回地址錯(cuò)誤)。
 (2)讀寫時(shí)給的地址也是一樣,要求是頁對(duì)齊地址。如果給了不對(duì)齊的,也是有可能對(duì)有可能錯(cuò)。
1.8 S5PV210的NandFlash控制器
1.8.1 SoC的Nand控制器的作用
(1)Nand芯片本身通過Nand接口電路來存取數(shù)據(jù),Nand接口電路和SOC之間通過Nand接口時(shí)序來通信。Nand接口時(shí)序相對(duì)復(fù)雜,如果要SoC完全用軟件來實(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自己來處理接口時(shí)序,編程很麻煩,需要程序員看Nand芯片的接口時(shí)序圖,嚴(yán)格按照接口時(shí)序圖中編程(尤其要注意各個(gè)時(shí)間參數(shù));在SoC有Nand控制器時(shí)SoC只需要編程操控Nand控制器的寄存器即可,Nand控制器內(nèi)部硬件會(huì)根據(jù)寄存器值來生成合適的Nand接口時(shí)序和Nand芯片通信。所以在有Nand控制器時(shí)編程要簡(jiǎn)單很多,我們讀寫Nand芯片時(shí)再也不用關(guān)注Nand接口時(shí)序了,只要關(guān)注SoC的Nand控制器的寄存器即可。
 (3)擴(kuò)展來講,現(xiàn)在的技術(shù)趨勢(shì)就是:幾乎所有的外設(shè)在SoC內(nèi)部都有對(duì)應(yīng)的控制器來與其通信,那么SoC內(nèi)部集成的各種控制器(也就是各種內(nèi)部外設(shè))越多,則SoC硬件能完成的功能越多,將來用這個(gè)SoC來完成相應(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)),我們可以利用這些硬件編碼器來進(jìn)行快速編解碼,這樣軟件工作量和難度降低了很多(這就是所謂的硬件加速)。
1.8.2 結(jié)構(gòu)框圖分析
 (1)結(jié)構(gòu)框圖中關(guān)鍵點(diǎn):SFR(我們后續(xù)編程的關(guān)鍵,編程時(shí)就是通過讀寫SFR來產(chǎn)生Nand接口時(shí)序以讀寫Nand芯片的) + Nand interface(硬件接口,將來和Nand芯片的相應(yīng)引腳進(jìn)行連接) + ECC生成器
1.8.3 S5PV210的Nand控制器的主要寄存器
NFCONF、NFCONT、NFCMMD、NFADDR、NFDATA、NFMECCD0&NFMECCD1、NFSECCD、NFSTAT
 
1.8.4 Nand操作代碼解析
(1)擦除函數(shù)
 結(jié)合擦除的流程框圖
 
(2)頁讀取函數(shù)
 框圖見1.7.3
(3)頁寫入函數(shù)
int nand_page_write(unsigned int pgaddr, const unsigned char *buf, unsigned int length) {int i = 0;// 1 發(fā)出片選信號(hào) nand_select_chip();// 2 write cmd 1st nand_send_cmd(NAND_CMD_WRITE_PAGE_1st);// 3 write page addrrNFADDR = 0;rNFADDR = 0;rNFADDR = pgaddr&0xff;rNFADDR = (pgaddr>>8)&0xff;rNFADDR = (pgaddr>>16)&0xff;// 4 寫入一頁內(nèi)容for(; i<NAND_PAGE_SIZE && length!=0; i++,length--)nand_write8(*buf++);// 5 clear RnBrNFSTAT = (rNFSTAT)|(1<<4);// 6 write cmd 2nand_send_cmd(NAND_CMD_WRITE_PAGE_2st);// 7 wait idlenand_wait_idle();// 8 讀狀態(tài) unsigned char status = nand_read_status();if (status & 1 ){// 取消片選信號(hào) nand_deselect_chip();printf("nand random write fail\r\n");return -1;}else{nand_deselect_chip();return 0;}}1.8.5 總結(jié)
(1)像NandFlash這類芯片,通過專用的接口時(shí)序和SoC內(nèi)部的控制器相連(這種連接方式是非常普遍的,像LCD、DDR等都是類似的連接)。這種接法和設(shè)計(jì)對(duì)我們編程來說,關(guān)鍵在于
兩點(diǎn):SoC的控制器的寄存器理解和Nand芯片本身的文檔、流程圖等信息。
 (2)對(duì)于我們來說,學(xué)習(xí)NandFlash,要注意的是:
 第一,要結(jié)合SoC的數(shù)據(jù)手冊(cè)、Nand芯片的數(shù)據(jù)手冊(cè)、示例代碼三者來理解。
 第二,初學(xué)時(shí)不要嘗試完全不參考自己寫出Nand操作的代碼,初學(xué)時(shí)應(yīng)該是先理解實(shí)例代碼,知道這些代碼是怎么寫出來的,必要時(shí)對(duì)照文檔來理解代碼。代碼理解之后去做實(shí)踐,實(shí)踐成功后以后再考慮自己不參考代碼只參考文檔來寫出nand操作的代碼。
二. iNand介紹
2.1 iNand/eMMC/SDCard/MMCCard的關(guān)聯(lián)
(1)最早出現(xiàn)的是MMC卡,卡片式結(jié)構(gòu),按照MMC協(xié)議設(shè)計(jì)。(相較于NandFlash芯片來說,MMC卡有2個(gè)優(yōu)勢(shì):第一是卡片化,便于拆裝;第二是統(tǒng)一了協(xié)議接口,兼容性好。)
 (2)后來出現(xiàn)SD卡,兼容MMC協(xié)議。SD卡較MMC有一些改進(jìn),譬如寫保護(hù)、速率、容量等。
 (3)SD卡遵守SD協(xié)議,有多個(gè)版本。多個(gè)版本之間向前兼容。
 (4)iNand/eMMC在SD卡的基礎(chǔ)上發(fā)展起來,較SD卡的區(qū)別就是將SD卡芯片化了(解決卡的接觸不良問題,便于設(shè)備迷你化)。
 (5)iNand和eMMC的關(guān)聯(lián):eMMC是協(xié)議,iNand是Sandisk公司符合eMMC協(xié)議的一種芯片系列名稱。
2.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í)自己不用寫代碼來進(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的操作速度很快。
2.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é)議幾乎一樣)。
結(jié)論
 iNand/eMMC其實(shí)就是芯片化的SD/MMC卡,軟件操作和SD卡相同。
 分析iNand芯片的操作代碼時(shí),其實(shí)就是以前的SD卡的操作代碼。一些細(xì)節(jié)的區(qū)別就是為了區(qū)分各種不同版本的SD卡、iNand的細(xì)節(jié)差異。
2.4 SD卡/iNand操作
2.4.1 硬件接口:DATA、CLK、CMD
(1)iNand的IO線有8根,支持1、4、8線并行傳輸模式;SD卡IO線有4根,支持1、4線并行傳輸模式。
 (2)CMD線用來傳輸命令、CLK線用來傳輸時(shí)鐘信號(hào)。
 (3)接口有CLK線,工作時(shí)主機(jī)SoC通過CLK線傳輸時(shí)鐘信號(hào)給SD卡/iNand芯片,說明:SD/iNand是同步的,SD/iNand的工作速率是由主機(jī)給它的CLK頻率決定的。
2.4.2 命令響應(yīng)的操作模式
(1)SD協(xié)議事先定義了很多標(biāo)準(zhǔn)命令(CMD0、CMD1·····),每個(gè)命令都有它的作用和使用條件和對(duì)應(yīng)的響應(yīng)。SD卡工作的時(shí)候就是一個(gè)一個(gè)的命令周期組合起來的,在一個(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ā)下一條命令。
2.4.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ǔ)單元。
2.4.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寄存器中。
 (3)OCR ,操作情況寄存器,強(qiáng)制。
 (4)CID ,卡的 ID;用于識(shí)別卡的 ID ,強(qiáng)制.
 (5)DSR,驅(qū)動(dòng)器級(jí)寄存器;配置卡的輸出驅(qū)動(dòng)器??蛇x
 (6)CSD,卡的專用數(shù)據(jù);關(guān)于卡的操作情況信息。強(qiáng)制
 (7)SCR,SD 配置寄存器;關(guān)于 SD 存儲(chǔ)卡的專用特性信息。強(qiáng)制
注意:不同的SoC可能在SD/MMC/iNand等支持方面有差異,但是如果支持都是通過內(nèi)部提供SD控制器來支持的,S5PV210的SD卡控制器在Section8.7部分。
2.5 SD/iNand 實(shí)戰(zhàn)知識(shí)點(diǎn)
2.5.1.1 命令碼CMD和ACMD
(1)SD卡工作在命令+響應(yīng)的模式下。
 (2)SD協(xié)議的命令分2種:CMDx和ACMDx。CMD是單命令命令,就是單獨(dú)發(fā)一個(gè)CMD即可表示一個(gè)意思。ACMD是一種擴(kuò)展,就是發(fā)2個(gè)CMD加起來表示一個(gè)意思。可以認(rèn)為ACMDx = CMDy+CMDz(y一般是55)。
2.5.1.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)判定卡的版本。
2.5.1.3 卡狀態(tài)
(1)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ā)過來的命令和當(dāng)前狀態(tài)不符狀態(tài)機(jī)就不響應(yīng),如果收到命令和當(dāng)前狀態(tài)相符就會(huì)執(zhí)行相應(yīng)操作,執(zhí)行完之后根據(jù)結(jié)果跳轉(zhuǎn)為其他狀態(tài)。
2.5.1.4 卡回復(fù)類型
(1)一般來說,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é)議文檔。
- 代碼分析
 
注: 以上內(nèi)容來自朱老師物聯(lián)網(wǎng)大講堂裸機(jī)課件
總結(jié)
以上是生活随笔為你收集整理的嵌入式裸机NandFlash和 SD/iNand学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: activex 控件 过期,解决“无法注
 - 下一篇: RGB YUV [转]