【SDIO】SD2.0协议分析总结(二)-- SD卡识别数据传输过程
相關(guān)文章
《【SDIO】SDIO、SD卡、FatFs文件系統(tǒng)相關(guān)文章索引》
1. SD卡操作模式
SD 卡系統(tǒng)(包括主機和 SD卡)定義了兩種操作模式:卡識別模式和數(shù)據(jù)傳輸模式。在系統(tǒng)復位后,主機處于卡識別模式,尋找總線上可用的 SDIO 設(shè)備;同時,SD 卡也處于卡識別模式,直到被主機識別到,即當 SD卡接收到 SEND_RCA(CMD3)命令后,SD卡就會進入數(shù)據(jù)傳輸模式,而主機在總線上所有卡被識別后也進入數(shù)據(jù)傳輸模式。在每個操作模式下,SD卡都有幾種狀態(tài),如下圖所示,通過命令控制實現(xiàn)卡狀態(tài)的切換。
| 操作模式 | SD 卡狀態(tài) |
| 無效模式(Inactive) | 無效狀態(tài)(Inactive State) |
| 卡識別模式(Card identification mode) | 空閑狀態(tài)(Idle State) |
| 準備狀態(tài)(Ready State) | |
| 識別狀態(tài)(Identification State) | |
| 數(shù)據(jù)傳輸模式(Data transfer mode) | 待機狀態(tài)(Stand-by State) |
| 傳輸狀態(tài)(Transfer State) | |
| 發(fā)送數(shù)據(jù)狀態(tài)(Sending-data State) | |
| 接收數(shù)據(jù)狀態(tài)(Receive-data State) | |
| 編程狀態(tài)(Programming State) | |
| 斷開連接狀態(tài)(Disconnect State) |
2. SD卡識別模式
當處于卡識別模式時,主機將所有處于卡識別模式的卡重置,驗證操作電壓范圍,識別卡并詢問它們發(fā)布的Relative Card Address(RCA)。這個操作是在每個卡各自的CMD命令行上分別執(zhí)行。在卡識別模式下,所有數(shù)據(jù)通信都只使用CMD命令行。
在SD卡的識別過程中,SD時鐘頻率在100KHz ~ 400KHz范圍內(nèi)工作。
2.1 SD卡Reset
命令GO_IDLE_STATE (CMD0)是軟件復位命令,無論當前卡處于什么狀態(tài),它將每個卡都設(shè)置為 Idle狀態(tài)。處于Inactive 狀態(tài)的卡不受此命令影響。主機上電后,所有卡都處于 Idle狀態(tài),包括之前處于Inactive 狀態(tài)的卡。
上電或CMD0后,所有卡的CMD數(shù)據(jù)線都處于輸入模式,等待接收下一條命令。這些卡被初始化為一個默認的SD卡相對地址(RCA=0x0000),并設(shè)置SD卡驅(qū)動級寄存器(DSR)默認為最低的速度和最高的驅(qū)動能力。
2.2 SD卡操作條件的確認
在主機和SD卡開始通信時,主機可能不知道SD卡支持的電壓,SD卡也可能不知道它是否支持當前提供的電壓。主機發(fā)出一個復位命令(CMD0),同時假定它電壓可能被SD卡支持。為了驗證電壓,在《 Physical Layer Specification Version 2.00》文檔中定義了以下新命令(CMD8)。
SEND_IF_COND (CMD8)用于驗證SD卡接口操作條件。SD卡通過分析CMD8的參數(shù)來檢測操作條件的有效性,主機通過分析CMD8的響應來檢測操作條件的有效性。提供的電壓通過命令CMD8的參數(shù)VHS域來指定。SD卡以VHS中指定的電壓作為當前提供的電壓。通過CRC和Check Pattern(‘10101010b’)來檢測主機與SD卡之間通信的有效性。
- 如果SD卡支持在提供的電壓上操作,在響應命令的參數(shù)中會包含提供的電壓和Check Pattern(‘10101010b’)。
- 如果SD卡不支持在提供的電壓下工作,它沒有任何響應返回并保持在Idle狀態(tài)。為初始化大容量SD存儲卡,必須在第一個ACMD41之前發(fā)出CMD8(如下圖4 - 1)。接收CMD8能被SD卡識別到,需要主機支持《 Physical Layer Specification Version 2.00》和SD卡支持該新功能。
SD_SEND_OP_COND (ACMD41)被設(shè)計為為主機提供一種機制來識別和拒絕與主機所提供的VDD范圍不匹配的卡。不能在指定范圍內(nèi)進行數(shù)據(jù)傳輸?shù)腟D卡,應放棄總線操作,進入Inactive 狀態(tài)。OCR寄存器定義了相關(guān)的電壓等級。
注意:ACMD41是特定應用程序的命令,因此APP_CMD (CMD55)應該始終在ACMD41之前被發(fā)送。在idle_state中用于CMD55的RCA將是SD卡的默認值(RCA = 0 x0000)。
通過在命令ACMD41的參數(shù)中將OCR設(shè)置為0,主機可以查詢每個卡并確定公共電壓范圍,然后再將超出范圍的卡發(fā)送到 Inactive 狀態(tài)。ACMD41只是作為查詢發(fā)出,SD卡不會開始初始化。之后,主機可以選擇一個工作電壓,并在這種情況下重新發(fā)出ACMD41,將不兼容的卡發(fā)送到 Inactive 狀態(tài)。在初始化過程中,主機不允許改變工作電壓范圍。
2.3 SD卡初始化和識別過程
總線被激活后,主機開始SD卡的初始化和識別過程(參考下圖4-2)。初始化過程從SD_SEND_OP_COND(ACMD41)開始,通過設(shè)置操作條件和OCR(Operation Conditions Register)中的HCS(Host Capacity Support)位。
HCS(Host Capacity Support)位設(shè)置為 :
- 1: 表示主機支持大容量SD存儲卡。
- 0: 表示主機不支持大容量SD存儲卡。
使用命令CMD8擴展了ACMD41的功能; 發(fā)送命令ACMD41時會帶有參數(shù)HCS,ACMD41對應的響應為R3(OCR register),包含:VDD電壓范圍、SD卡容量狀態(tài)CCS(Card Capacity Status)。如果SD卡沒有相應CMD8,那么ACMD41參數(shù)HCS會被SD卡忽略。但是,如果卡沒有返回對CMD8的響應,主機應該將HCS設(shè)置為0 。標準容量的SD卡將忽略HCS。如果HCS設(shè)置為0,則大容量SD卡永遠不會返回就緒狀態(tài)(保持Busy Bit為0)。OCR中的Busy Bit被SD卡用來告知主機ACMD41的初始化是否完成。
OCR中的Busy Bit設(shè)置為:
- 0:表示該SD卡仍處于初始化狀態(tài)。
- 1:表示該SD卡初始化已經(jīng)完成。
主機反復發(fā)出ACMD41,直到Busy Bit設(shè)置為1。SD卡只在第一個ACMD41檢查OCR中的Operational Conditions和HCS位。當重復ACMD41時,主機不得發(fā)出除CMD0以外的其他命令。
當卡響應CMD8時,ACMD41的響應中包含CCS字段信息。當SD卡返回Ready(Busy Bit設(shè)置為1)時,CCS生效。
CCS(Card Capacity Status)設(shè)置為:
- 0: 表示該卡為 Standard Capacity SD Memory Card
- 1: 表示該卡為 High Capacity SD Memory Card
主機對系統(tǒng)中的所有新卡執(zhí)行相同的初始化順序,不兼容的卡將被發(fā)送到 Inactive 狀態(tài)。然后主機向每個卡發(fā)出命令ALL_SEND_CID (CMD2),以獲得其唯一的卡標識(CID)號。未識別的卡(即處于就緒狀態(tài)的卡)發(fā)送其CID號作為響應(在CMD線上)。在卡發(fā)送CID后,它進入識別狀態(tài)。然后,主機發(fā)出CMD3 (SEND_RELATIVE_ADDR)請求卡發(fā)布一個新的相對卡地址(RCA),它比CID短,在未來的數(shù)據(jù)傳輸模式中用于給卡尋址。一旦接收到RCA,SD卡狀態(tài)就會變?yōu)?strong>待機狀態(tài)。此時,如果主機希望分配另一個RCA號碼,它可以通過向卡發(fā)送另一個CMD3命令來要求卡發(fā)布一個新號碼。最后發(fā)布的RCA是SD卡的實際RCA號。
3. SD卡數(shù)據(jù)傳輸模式
在SD卡識別模式結(jié)束之前,主機應保持在 fOD (400kHz)頻率,因為在SD卡識別模式期間,有些SD卡可能有操作頻率限制。在數(shù)據(jù)傳輸模式下,主機可以在 fPP (25MHz)頻率范圍內(nèi)對卡進行操作。主機發(fā)出SEND_CSD(CMD9)以獲取與SD卡有關(guān)的數(shù)據(jù)(CSD寄存器),例如塊長度、卡的儲存容量等。
廣播命令SET_DSR (CMD4)配置所有識別卡的 Driver Stage Register。它根據(jù)應用總線的布局(長度)、總線上卡的數(shù)量和數(shù)據(jù)傳輸頻率來編程DSR寄存器。時鐘速率也從 fOD 切換到 fPP。SET_DSR命令是SD卡和主機的一個選項(非必須)。
CMD7用于選擇一張SD卡并將其置于傳輸狀態(tài),在同一時刻只能有一張卡處于傳輸狀態(tài)。如果先前選擇的卡處于傳輸狀態(tài),它與主機的連接將被釋放,它將返回到 Stand-by 狀態(tài)。當CMD7以保留的相對卡片地址“0x0000”發(fā)出時,所有卡片都被退回到 Stand-by 狀態(tài)。
注意:主機預留 RCA = 0x0000 用于退出選擇。
這可以在識別新卡之前使用,而不用重置其他已經(jīng)注冊的卡。處于此狀態(tài)的SD卡已經(jīng)有一個RCA后,將不響應識別命令(例如:ACMD41, CMD2)。
注意:如果確認的SD卡獲取到CMD7不匹配的RCA后,該卡將取消選擇。
下面總結(jié)各種數(shù)據(jù)傳輸模式之間的關(guān)系:
- 所有數(shù)據(jù)讀取命令都可以在任何時候通過停止命令(CMD12)中止。數(shù)據(jù)傳輸將終止,SD卡將返回到 Transfer 狀態(tài)。讀命令包括:塊讀(CMD17)、多塊讀(CMD18)、發(fā)送寫保護(CMD30)、發(fā)送scr (ACMD51)和讀模式的通用命令(CMD56)。
- 所有數(shù)據(jù)寫命令都可以在任何時候通過停止命令(CMD12)中止。在CMD7取消對卡的選擇之前,應該停止寫命令。寫入命令包括:塊寫入(CMD24和CMD25),程序CSD(CMD27),鎖定/解鎖命令(CMD42)和寫入模式下的常規(guī)命令(CMD56)。
- 一旦數(shù)據(jù)傳輸完成,SD卡將退出數(shù)據(jù)寫入狀態(tài),并移動到 Programming 狀態(tài)(傳輸成功) 或 Transfer 狀態(tài)(傳輸失敗)。
- 如果一個塊寫操作被停止,并且最后一個塊的塊長度和CRC是有效的,數(shù)據(jù)將被編程。
- SD卡可以為塊寫入提供緩沖。這意味著在前一個塊被編程時,下一個塊可以被發(fā)送到SD卡。如果所有寫緩沖區(qū)都滿了,只要SD卡處于 Programming 狀態(tài)(見SD卡狀態(tài)圖圖4-3),DAT0線就會保持低(BUSY)。
- 寫CSD、寫保護和擦除沒有緩沖選項。這意味著當SD卡忙著處理這些命令中的任何一條時,其他的數(shù)據(jù)傳輸命令將不會被接受。只要卡忙且處于 Programming 狀態(tài),DAT0線就會保持低電平。
- 當卡在編程時,參數(shù)設(shè)置命令是不允許的。參數(shù)設(shè)置命令包括:設(shè)置塊長度(CMD16),擦除塊開始(CMD32)和擦除塊結(jié)束(CMD33)。
- 當卡在編程時不允許讀命令。
- 將另一張卡從 Stand-by 狀態(tài)轉(zhuǎn)移到 Transfer 狀態(tài)(使用CMD7)不會終止擦除和編程操作??▽⑶袚Q到 Disconnect 狀態(tài),將釋放DAT線。
- 在 Disconnect 狀態(tài)下,可以使用CMD7重新選擇卡。在這種情況下,卡將轉(zhuǎn)移到 Programming 狀態(tài)并重新激活占線指示。
- 重置SD卡(使用CMD0或CMD15)將終止任何掛起的或正在進行的編程操作。這可能會破壞卡上的數(shù)據(jù)內(nèi)容。防止這種情況發(fā)生是主機的責任。
- CMD34-37、CMD50、CMD57預留用于SD命令系統(tǒng)擴容。這些命令的狀態(tài)轉(zhuǎn)換在每個命令系統(tǒng)規(guī)范中都有定義。
4. 參考資料
SDIO參考的資料如下:
下載地址如下:
https://download.csdn.net/download/ZHONGCAI0901/14975835
總結(jié)
以上是生活随笔為你收集整理的【SDIO】SD2.0协议分析总结(二)-- SD卡识别数据传输过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 志宇-springBoot启动
- 下一篇: mondrian mysql驱动,导入M