SD初始化流程

2022-09-01 17:12:11 字數 3578 閱讀 7581

sd初始化是sd卡操作的關鍵。初始化過程需要注意sd卡的型別。sd卡(2g以下)和sdhc卡(2g至32g)分別支援sd協議1.0及2.0,命令和初始化過程略有不同。匯流排模式分為spi和sd兩種,以sdhc卡sd模式通訊為例,介紹sdhc初始化過程。

一、sd specification v2.0中基本概念

1、命令command

命令由主機發往從機,可以點對點,也可以是廣播,用於對sd卡進行設定或者資料傳輸。命令格式如下:

乙個完整的命令由48位組成。

command index命令索引:有6位,可以表示64條命令;

crc7:7位迴圈冗餘校驗位。

sd模式下的命令和資料流都有乙個開始位和結束位。

sd卡的命令分為多個型別。如class0基本命令、class2讀命令、class5擦除命令、class8應用特定命令等。詳細命令及其功能可參考sd協議手冊simplified physical layer specification v2.0(page46-57)。

2、應答response

應答是由從機發往主機,用於響應命令的位元流。根據應答長度和內容不同,應答共有分別為:r1,r1b,r2,r3,r6,r7幾種型別。其中r1,r1b,r3,r6,r7為短響應,長度為48bits;r2為長響應,長度為136bits。(sdio介面支援r4,r5)

r1用於返回卡狀態等資訊,即第8-39位。

r1b與r1相同,只是多了一位忙標誌。

r2長度為136位,用於獲取cid、csd資訊,第1-127位。

r3用於獲取卡的ocr暫存器值,即為acmd41的命令的應答。

r6包含了卡的rca資訊,即argument field中高16位部分。作為cmd3命令應答。

r7為cmd8的應答,其中19-16bits表徵了卡支援的電壓範圍,15-8bits為輸入的check pattern,建議為0x01aa。

3、暫存器registers

sd卡內部定義了ocr,cid,csd,rca,dsr,scr共6個暫存器。這些暫存器可以通過sd卡的相應命令訪問。ocr、cid、csd、scr暫存器儲存卡特性資訊,而rca、ocr暫存器儲存了卡的相關引數。

ocr:operation conditions register操作狀態暫存器

32位ocr暫存器儲存了卡支援的工作電壓範圍,同時該暫存器也包含了狀態資訊。31位:當上電完成後31位置位;30位:表明了卡的容量資訊,是高容量還是標準卡,高容量卡該位置位。

如0x40ff8000即表示支援2.7-3.6電壓範圍。

cid:card identification register卡識別暫存器

cid暫存器有128位長。用於卡識別階段識別卡資訊。每乙個卡都有乙個獨立的識別號用於標識卡的唯一性。

csd:card specific register卡特性暫存器

csd暫存器128位長。提供了卡的相關資訊。如資料格式,錯誤校驗,最大資料傳輸時間等,可以通過cmd27命令改變暫存器值。如下圖中9表示1<<9=512,讀寫每塊傳輸的最大位元組數為512。

3、狀態states

在host與sd通訊過程中,共有3種模式, 10個卡狀態。

操作模式:閒置模式,卡識別模式,資料傳輸模式;

卡狀態:閒置狀態,空閒狀態,準備狀態,識別狀態,等待狀態,傳輸狀態,資料傳送狀態,資料接收狀態,程式設計狀態,斷開狀態。

sd卡的上電,初始化以及資料傳輸都是在這幾個狀態間的轉換。

二、初始化過程

整個過程是乙個傳送命令獲得應答的過程。

1、  傳送cmd0命令,使卡復位。當卡上電或收到go_idle_state(cmd0)後,卡進入idle state,此時卡將其rca設為0。

2、  傳送cmd8命令send_if_cond,用來確定卡的操作條件。在host與sd開始通訊的時候,host並不知道sd卡所支援的電壓範圍,在傳送cmd0使卡進入空閒狀態復位後,sd2.0物理層協議定義了乙個新的cmd8來確定sd卡對電壓範圍的支援。(cmd8是sdhc卡初始化必須的,而標準sd卡不需要此命令,因此該命令的另乙個作用是判斷卡型別,若有對應r7中的響應內容,說明該卡為sdhc卡,支援sd物理層協議2.0,否則,沒有響應,卡保持在idle state)

3、  傳送acmd41命令sd_send_op_cond,用來識別滿足host所提供電壓的卡,argument中所用rca為idle state卡的預設位址rca=0x0000。此命令需要注意以下幾點:當sdhc卡時,需要注意命令的hcs(host capacity support )位,對於sdhc卡,該位必須置1,對於sd卡,該位清零;同時,該命令應答中的busy位(參考ocr暫存器)表示了卡是否準備好,host必須重**送acmd41直到應答中的busy位(ocr暫存器最高位)置1;在應答中,還有乙個ccs(card capacity status)位,該位為1時表示當前卡為高容量sd卡,為0時表示當前卡為標準容量卡。(該命令為應用型命令,在之前需要傳送cmd55)

4、  傳送cmd2命令all_send_cid,該命令使匯流排上的卡傳送其cid,即表徵卡唯一性的資訊,如出廠序列號等,其應答為r2。此時卡由ready state狀態進入identification state。

5、  傳送cmd3命令send_relative_addr,該命令用於設定卡的新位址,sd卡會給卡返回乙個rca,卡收到新位址後自動進入stand by state狀態。

4、5兩個過程即為sd卡識別過程。

多個卡時,回到步驟4,直到把所有的卡識別,分配位址。當某乙個被識別後,host再一次傳送cmd2命令時,其便不再響應,其他沒有被識別到的sd卡依次傳送其cid號,繼續傳送cmd3獲得它們的rca後,便識別所有的卡。

SD初始化流程

sd初始化流程 當host上電後,使所有的卡裝置處於卡識別模式,完成設定有效操作電壓範圍,卡識別和請求卡相對位址等操作。1 傳送指令cmd0使卡裝置處於idle狀態 2 傳送指令cmd8,如果卡裝置有response,說明此卡為sd2.0以上 3 傳送指令cmd55 acmd41,該指令是用來探測卡...

SD卡初始化

傳送指令時可能會有狀態轉換,尤其是初始化時。指令分為兩類 一類為通用指令,另一類為針對某種卡的特定指令,但特定指令的實際數可以通用指令相同,所以cmd55 特定指令來傳送特定指令,1 傳送cmd0指令 go idle state 卡進入idle狀態 2 傳送指令cmd8 send if cond 如...

STM32初始化SD卡流程

1,初始化sdio外設,關閉sdio時鐘。2,上電,開啟時鐘,注意此時時鐘應不能超過400khz,且此時是只有一位資料線,要到初始化完成後再調時鐘與資料線寬度。3,延時最低74個時鐘週期。使時鐘與sd卡穩定,否則會出錯。4,傳送cmd0,需要返回0x01,進入idle狀態 5,為了區別sd卡是2.0...