【Linux驅動學習】SD卡規范學習


摘要:

學習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卡針腳

可以看到,SD卡在MMC卡基礎上增加了8、9兩個針腳,這兩個針腳將被用作數據傳輸,以支持SD傳輸模式。SD卡支持SD模式(4數據線)和SPI模式(2數據線),MMC卡只支持SPI模式。

SD卡針腳對應的功能:(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模式中與主機的連接拓撲圖如下:

image

在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卡命令表class0

讀塊命令:讀單個、多個塊數據,設置塊長度

SD卡命令表class2

寫塊命令:寫單個、多個塊數據,設置塊長度

SD卡命令表class4

擦除塊命令:把對應的塊數據擦除

SD卡命令表class5

寫保護命令:設置、取消對應地址的數據的寫保護,可以使其他程序無法寫入指定的地址,達到保護目的。用的情況不太多。

SD卡命令表class6

鎖卡命令:設置、取消鎖卡。鎖卡后需要密碼才能訪問SD卡。

SD卡命令表class7

應用特殊命令:CMD55,使用ACMD前必須先發送的命令;CMD56是標准的讀、寫命令,會讀、寫一個block的數據。

SD卡命令表class8_thumb[1]

SDIO命令:預留給SDIO設備使用(CMD5也是預留給SDIO設備),在SD卡官方文檔中沒有說明具體用途

SD卡命令表class9

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

SD卡命令表ACMD1

SD卡命令表ACMD2

3.2 命令/數據傳輸方式

命令的傳輸協議大致如下:

  • 0開頭,1結尾
  • 大端傳輸:先MSB,最后LSB
  • CRC校驗

下面這幅圖是無響應和無數據兩種命令的傳輸情況:

SD卡命令傳輸方式(無數據傳輸)

非常清晰易懂,就不贅述了。

下面這幅圖是多塊數據讀的數據傳輸情況:

SD卡命令傳輸方式(有數據傳輸)

主機發送多塊讀命令時,首先sd卡會做出回應,同時准備數據。數據准備完成后開始發送,並在每個block傳輸完成后加入crc校驗碼。傳輸完一個block和crc后緊跟着下一個block的數據傳輸,直到傳輸完成,或主機發送了新的命令。

SD模式有4根數據線,一次可以傳輸半個字節,兩次一個字節。他們的傳輸方式如下圖:

SD卡命令傳輸方式

同樣是先傳MSB,再傳LSB,一次傳半個字節,這樣做可以方便主機做位移組合成一個字節。如果每條線單獨傳一個字節,則需要移位8次才可以獲得一個完整的byte。

3.3 狀態轉換

下圖為SD卡狀態轉換圖。重新上電時為Idle狀態:

SD卡狀態轉換圖1

SD卡狀態轉換圖2

看起來這個狀態圖很復雜,其實我們要走的流程並不復雜。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(電壓信息):

SD卡寄存器

CID:卡信息:生產商,OEM,產品名,版本,出產日期,CRC校驗(所有寄存器都有,下同),常用
RCA:卡地址:在初始化時發布,用於與host通信,0x0000表示與所有卡通信,常用
DSR:驅動相關,總線電流大小,上升沿時間,最大開啟時間,最小開啟時間
CSD:數據傳輸要求:包括讀寫時間,讀寫電壓最大最低值,寫保護,塊讀寫錯誤
SCR:特性支持,如CMD支持,總線數量支持
OCR:支持的電壓,常用
SSR:特有特性,卡類型(OTP,SD等),一次擦除塊數量
CSR:R1返回指令的卡狀態,此寄存器用與傳輸卡狀態給host

命令系統中有對應的指令獲取這6個寄存器。

 

版權所有,轉載請注明出處:

http://www.cnblogs.com/sickworm/p/4015932.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM