綱要:學(xué)習(xí)SD卡的相關(guān)規(guī)范,包括定義,硬件特性,數(shù)據(jù)傳輸,命令系統(tǒng)等。不涉及代碼。
文章針對(duì)Linux驅(qū)動(dòng)開發(fā)而寫,以助于理解SD卡驅(qū)動(dòng),不會(huì)涉及過(guò)多硬件內(nèi)容。
1. SD卡介紹 1.1 各類型儲(chǔ)存卡/接口1. SD卡介紹
2. SD卡硬件規(guī)范
3. SD卡指令規(guī)范
4. SD卡寄存器
首先了解一下我們?cè)赟D卡驅(qū)動(dòng)學(xué)習(xí)中會(huì)碰到的主要幾個(gè)儲(chǔ)存卡名詞:
SD:Security Digital Memory Card,新一代多媒體儲(chǔ)存卡,高速,安全(但安全機(jī)制貌似很少用到)MMC:Multimedia Card,SD卡的上一代多媒體儲(chǔ)存卡,已基本被SD卡代替eMMC:Embedded Multimedia Card,內(nèi)嵌式存儲(chǔ)器,一般焊在PCB上。內(nèi)置主控制器,以實(shí)現(xiàn)統(tǒng)一MMC接口(在傳統(tǒng)MMC接口上拓展,集成了整套理論),Nand Flash就是eMMCSDIO:Secure Digital Input and Output Card,SD標(biāo)準(zhǔn)上定義了一種外設(shè)接口,有很多設(shè)備模塊采用。如Wifi,GPS,Bluetooth
1.2 SD卡特性以下是SD卡的部分特性。
更多的特性請(qǐng)閱讀SD卡官方規(guī)范。
2. SD卡硬件規(guī)范 2.1 SD卡物理接口下圖是SD卡和MMC卡的針腳:

可以看到,SD卡在MMC卡基礎(chǔ)上增加了8、9兩個(gè)針腳,這兩個(gè)針腳將被用作數(shù)據(jù)傳輸,以支持SD傳輸模式。SD卡支持SD模式(4數(shù)據(jù)線)和SPI模式(2數(shù)據(jù)線),MMC卡只支持SPI模式。
SD卡針腳對(duì)應(yīng)的功能:(SD模式)
SD模式:數(shù)據(jù)并行傳輸,2地,1電源,1時(shí)鐘,1命令,4數(shù)據(jù)線(4出入)(SD模式的命令通過(guò)命令線傳輸)SPI模式:數(shù)據(jù)串行傳輸,2地,1電源,1時(shí)鐘,1片選,2數(shù)據(jù)線(1入1出)(SPI模式的命令通過(guò)數(shù)據(jù)線傳輸)
以下內(nèi)容,如無(wú)分開說(shuō)明,默認(rèn)指SD模式。(本文不會(huì)涉及SPI模式學(xué)習(xí))
2.2 SD卡與主機(jī)的連接SD模式和SPI模式中與主機(jī)的連接拓?fù)鋱D如下:

在SD模式中,數(shù)據(jù)線和命令線是分開連接到主機(jī)各GPIO口中的。在SPI模式中,片選線分別連接到主機(jī)各GPIO口,數(shù)據(jù)線在同一條總線上。
因?yàn)镾PI模式的數(shù)據(jù)線在同一總線上,所以需要片選來(lái)選擇不同的儲(chǔ)存卡;SD模式分別連接到主機(jī),不需要片選線。
3. SD卡命令規(guī)范 3.1 命令類型SD卡有數(shù)十種指令,但無(wú)非都是一些獲取信息,數(shù)據(jù)傳輸?shù)墓δ埽⒉粫?huì)很難理解。規(guī)范書上有詳細(xì)的狀態(tài)轉(zhuǎn)換圖,下面會(huì)有介紹。
下面是4種指令類型:
官方文檔將命令分成了好幾種功能。下面將所有命令列出,僅作查閱了解用,不需要每個(gè)命令都記?。?/p>
基礎(chǔ)命令:用于重置、切換SD卡狀態(tài),獲取相關(guān)信息

讀塊命令:讀單個(gè)、多個(gè)塊數(shù)據(jù),設(shè)置塊長(zhǎng)度

寫塊命令:寫單個(gè)、多個(gè)塊數(shù)據(jù),設(shè)置塊長(zhǎng)度

擦除塊命令:把對(duì)應(yīng)的塊數(shù)據(jù)擦除

寫保護(hù)命令:設(shè)置、取消對(duì)應(yīng)地址的數(shù)據(jù)的寫保護(hù),可以使其他程序無(wú)法寫入指定的地址,達(dá)到保護(hù)目的。用的情況不太多。

鎖卡命令:設(shè)置、取消鎖卡。鎖卡后需要密碼才能訪問(wèn)SD卡。

應(yīng)用特殊命令:Cmd55,使用ACMD前必須先發(fā)送的命令;CMD56是標(biāo)準(zhǔn)的讀、寫命令,會(huì)讀、寫一個(gè)block的數(shù)據(jù)。
![SD卡命令表class8_thumb[1] SD卡命令表class8_thumb[1]](http://s1.vevb.com/20150728/r331sbil13345.png)
SDIO命令:預(yù)留給SDIO設(shè)備使用(CMD5也是預(yù)留給SDIO設(shè)備),在SD卡官方文檔中沒有說(shuō)明具體用途

SD卡專用命令:MMC卡無(wú)法使用這些命令,里面包括如設(shè)置數(shù)據(jù)總線位寬,獲取SD卡信息(寄存器)。


命令的傳輸協(xié)議大致如下:
下面這幅圖是無(wú)響應(yīng)和無(wú)數(shù)據(jù)兩種命令的傳輸情況:

非常清晰易懂,就不贅述了。
下面這幅圖是多塊數(shù)據(jù)讀的數(shù)據(jù)傳輸情況:

主機(jī)發(fā)送多塊讀命令時(shí),首先sd卡會(huì)做出回應(yīng),同時(shí)準(zhǔn)備數(shù)據(jù)。數(shù)據(jù)準(zhǔn)備完成后開始發(fā)送,并在每個(gè)block傳輸完成后加入crc校驗(yàn)碼。傳輸完一個(gè)block和crc后緊跟著下一個(gè)block的數(shù)據(jù)傳輸,直到傳輸完成,或主機(jī)發(fā)送了新的命令。
SD模式有4根數(shù)據(jù)線,一次可以傳輸半個(gè)字節(jié),兩次一個(gè)字節(jié)。他們的傳輸方式如下圖:

同樣是先傳MSB,再傳LSB,一次傳半個(gè)字節(jié),這樣做可以方便主機(jī)做位移組合成一個(gè)字節(jié)。如果每條線單獨(dú)傳一個(gè)字節(jié),則需要移位8次才可以獲得一個(gè)完整的byte。
3.3 狀態(tài)轉(zhuǎn)換下圖為SD卡狀態(tài)轉(zhuǎn)換圖。重新上電時(shí)為Idle狀態(tài):


看起來(lái)這個(gè)狀態(tài)圖很復(fù)雜,其實(shí)我們要走的流程并不復(fù)雜。Linux驅(qū)動(dòng)對(duì)SD卡做初始化會(huì)經(jīng)過(guò)如下步驟:
CMD0上電重置到idle狀態(tài)(防止一些機(jī)型關(guān)機(jī)不掉電,如某些FPGA平臺(tái))->ACMD41獲取SD卡支持的電壓信息(還需要通過(guò)主機(jī)控制器設(shè)置電壓)->CMD2獲取卡商信息->CMD3請(qǐng)求SD卡發(fā)布相對(duì)地址->CMD9獲取CSD寄存器,即卡的電氣特性數(shù)據(jù)(需要使用SD卡相對(duì)地址)->CMD7通過(guò)相對(duì)地址選擇對(duì)應(yīng)的SD卡,該卡進(jìn)入數(shù)據(jù)傳輸Transfer State狀態(tài)->各種CMD進(jìn)行block讀寫
3.4 流程差異不同種類的卡初始化過(guò)程是不一樣的,通過(guò)流程差異我們可以判斷不同類型的卡。
SDIO:CMD0之后執(zhí)行CMD5,CMD5只有SDIO類型才會(huì)有響應(yīng)。
MMC:ACMD 41換為CMD1,ACMD類命令只有SD或SDIO卡才有響應(yīng)。所以要先檢測(cè)是否是SDIO,再檢測(cè)是否是SD,最后檢測(cè)是否是MMC(core層代碼中也是這個(gè)順序),否則會(huì)出現(xiàn)誤判。
4. SD卡寄存器SD卡一共有6個(gè)寄存器,我們用的對(duì)多的是CID(卡商信息),RCA(相對(duì)地址)和OCR(電壓信息):

CID:卡信息:生產(chǎn)商,OEM,產(chǎn)品名,版本,出產(chǎn)日期,CRC校驗(yàn)(所有寄存器都有,下同),常用RCA:卡地址:在初始化時(shí)發(fā)布,用于與host通信,0x0000表示與所有卡通信,常用DSR:驅(qū)動(dòng)相關(guān),總線電流大小,上升沿時(shí)間,最大開啟時(shí)間,最小開啟時(shí)間CSD:數(shù)據(jù)傳輸要求:包括讀寫時(shí)間,讀寫電壓最大最低值,寫保護(hù),塊讀寫錯(cuò)誤SCR:特性支持,如CMD支持,總線數(shù)量支持OCR:支持的電壓,常用SSR:特有特性,卡類型(OTP,SD等),一次擦除塊數(shù)量CSR:R1返回指令的卡狀態(tài),此寄存器用與傳輸卡狀態(tài)給host
命令系統(tǒng)中有對(duì)應(yīng)的指令獲取這6個(gè)寄存器。
版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處:
http://www.CUOXin.com/sickworm/p/4015932.html
新聞熱點(diǎn)
疑難解答
圖片精選