摘要:
學習SD卡的相關規范,包括定義,硬件特性,數據傳輸,命令系統等。不涉及代碼。
文章針對Linux驅動開發而寫,以助於理解SD卡驅動,不會涉及過多硬件內容。
綱要:
1. SD卡介紹
2. SD卡硬件規范
3. SD卡指令規范
4. SD卡寄存器
1. SD卡介紹
1.1 各類型儲存卡/接口
首先了解一下我們在SD卡驅動學習中會碰到的主要幾個儲存卡名詞:
SD:Security Digital Memory Card,新一代多媒體儲存卡,高速,安全(但安全機制貌似很少用到)
MMC:Multimedia Card,SD卡的上一代多媒體儲存卡,已基本被SD卡代替
eMMC:Embedded Multimedia Card,內嵌式存儲器,一般焊在PCB上。內置主控制器,以實現統一MMC接口(在傳統MMC接口上拓展,集成了整套理論),Nand Flash就是eMMC
SDIO:Secure Digital Input and Output Card,SD標准上定義了一種外設接口,有很多設備模塊采用。如Wifi,GPS,Bluetooth
1.2 SD卡特性
以下是SD卡的部分特性。
- 正向兼容MMC卡:能插SD卡的接口也可以插MMC卡
- 最大10個堆疊的卡
- SD模式和SPI模式
- 可變時鍾(0~25MHz),可變電壓(2.0~3.6V)
- 帶電插拔保護
- 安全系統,雙方認證和“新的密碼算法”技術
更多的特性請閱讀SD卡官方規范。
2. SD卡硬件規范
2.1 SD卡物理接口
下圖是SD卡和MMC卡的針腳:
可以看到,SD卡在MMC卡基礎上增加了8、9兩個針腳,這兩個針腳將被用作數據傳輸,以支持SD傳輸模式。SD卡支持SD模式(4數據線)和SPI模式(2數據線),MMC卡只支持SPI模式。
SD卡針腳對應的功能:(SD模式)
SD模式:數據並行傳輸,2地,1電源,1時鍾,1命令,4數據線(4出入)(SD模式的命令通過命令線傳輸)
SPI模式:數據串行傳輸,2地,1電源,1時鍾,1片選,2數據線(1入1出)(SPI模式的命令通過數據線傳輸)
以下內容,如無分開說明,默認指SD模式。(本文不會涉及SPI模式學習)
2.2 SD卡與主機的連接
SD模式和SPI模式中與主機的連接拓撲圖如下:
在SD模式中,數據線和命令線是分開連接到主機各GPIO口中的。在SPI模式中,片選線分別連接到主機各GPIO口,數據線在同一條總線上。
因為SPI模式的數據線在同一總線上,所以需要片選來選擇不同的儲存卡;SD模式分別連接到主機,不需要片選線。
3. SD卡命令規范
3.1 命令類型
SD卡有數十種指令,但無非都是一些獲取信息,數據傳輸的功能,並不會很難理解。規范書上有詳細的狀態轉換圖,下面會有介紹。
下面是4種指令類型:
- 廣播指令,無應答(代號bc):發送完此類命令后,並不會有反饋,但操作已經生效。
- 廣播指令,有應答(代號bcr):發送完此類命令后,SD卡會給予反饋。可能是一些寄存器信息,可能是
- 尋址(點對點)指令(代號ac):發送完此類命令后,只有指定地址的SD卡會給予反饋(地址通過命令請求SD卡發布,是唯一的)。此時DAT線上無數據傳輸。
- 尋址(點對點)數據傳輸指令(adtc):發送完此類命令后,只有制定地址的SD卡會給予反饋。此時DAT線上有數據傳輸。
3.2命令表
官方文檔將命令分成了好幾種功能。下面將所有命令列出,僅作查閱了解用,不需要每個命令都記住:
基礎命令:用於重置、切換SD卡狀態,獲取相關信息
讀塊命令:讀單個、多個塊數據,設置塊長度
寫塊命令:寫單個、多個塊數據,設置塊長度
擦除塊命令:把對應的塊數據擦除
寫保護命令:設置、取消對應地址的數據的寫保護,可以使其他程序無法寫入指定的地址,達到保護目的。用的情況不太多。
鎖卡命令:設置、取消鎖卡。鎖卡后需要密碼才能訪問SD卡。
應用特殊命令:CMD55,使用ACMD前必須先發送的命令;CMD56是標准的讀、寫命令,會讀、寫一個block的數據。
SDIO命令:預留給SDIO設備使用(CMD5也是預留給SDIO設備),在SD卡官方文檔中沒有說明具體用途
SD卡專用命令:MMC卡無法使用這些命令,里面包括如設置數據總線位寬,獲取SD卡信息(寄存器)。
3.2 命令/數據傳輸方式
命令的傳輸協議大致如下:
- 0開頭,1結尾
- 大端傳輸:先MSB,最后LSB
- CRC校驗
下面這幅圖是無響應和無數據兩種命令的傳輸情況:
非常清晰易懂,就不贅述了。
下面這幅圖是多塊數據讀的數據傳輸情況:
主機發送多塊讀命令時,首先sd卡會做出回應,同時准備數據。數據准備完成后開始發送,並在每個block傳輸完成后加入crc校驗碼。傳輸完一個block和crc后緊跟着下一個block的數據傳輸,直到傳輸完成,或主機發送了新的命令。
SD模式有4根數據線,一次可以傳輸半個字節,兩次一個字節。他們的傳輸方式如下圖:
同樣是先傳MSB,再傳LSB,一次傳半個字節,這樣做可以方便主機做位移組合成一個字節。如果每條線單獨傳一個字節,則需要移位8次才可以獲得一個完整的byte。
3.3 狀態轉換
下圖為SD卡狀態轉換圖。重新上電時為Idle狀態:
看起來這個狀態圖很復雜,其實我們要走的流程並不復雜。Linux驅動對SD卡做初始化會經過如下步驟:
CMD0上電重置到idle狀態(防止一些機型關機不掉電,如某些FPGA平台)->ACMD41獲取SD卡支持的電壓信息(還需要通過主機控制器設置電壓)->CMD2獲取卡商信息->CMD3請求SD卡發布相對地址->CMD9獲取CSD寄存器,即卡的電氣特性數據(需要使用SD卡相對地址)->CMD7通過相對地址選擇對應的SD卡,該卡進入數據傳輸Transfer State狀態->各種CMD進行block讀寫
3.4 流程差異
不同種類的卡初始化過程是不一樣的,通過流程差異我們可以判斷不同類型的卡。
SDIO:CMD0之后執行CMD5,CMD5只有SDIO類型才會有響應。
MMC:ACMD 41換為CMD1,ACMD類命令只有SD或SDIO卡才有響應。所以要先檢測是否是SDIO,再檢測是否是SD,最后檢測是否是MMC(core層代碼中也是這個順序),否則會出現誤判。
4. SD卡寄存器
SD卡一共有6個寄存器,我們用的對多的是CID(卡商信息),RCA(相對地址)和OCR(電壓信息):
CID:卡信息:生產商,OEM,產品名,版本,出產日期,CRC校驗(所有寄存器都有,下同),常用
RCA:卡地址:在初始化時發布,用於與host通信,0x0000表示與所有卡通信,常用
DSR:驅動相關,總線電流大小,上升沿時間,最大開啟時間,最小開啟時間
CSD:數據傳輸要求:包括讀寫時間,讀寫電壓最大最低值,寫保護,塊讀寫錯誤
SCR:特性支持,如CMD支持,總線數量支持
OCR:支持的電壓,常用
SSR:特有特性,卡類型(OTP,SD等),一次擦除塊數量
CSR:R1返回指令的卡狀態,此寄存器用與傳輸卡狀態給host
命令系統中有對應的指令獲取這6個寄存器。
版權所有,轉載請注明出處:










![SD卡命令表class8_thumb[1] SD卡命令表class8_thumb[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNjY3NTMzLzIwMTQxMC8xMDE2MjgxMDgyNzgwODYucG5n.png)








