天天看點

cmd的發送 mmc_調試SD/MMC host參考文獻總結

SD/MMC描述

flash的出現,誕生了MMC, MMC的出現産生了SD,SD的出現造就了SDHC/SDXC以及後面的TF卡,TF卡容易松動造就了eMMC。eMMC和SSD本質一樣,都内部含有控制器,隻是一個是貼片,一個是硬碟。

注重接口叫sdio,注重卡一側叫SD/MMC。 sdio支援1bit, spi, 4bit模式;而mmc支援1bit,spi,4bit,8bit模式。實體線主要是CMD,CLK, DATA0-DATA7(8bit,mmc)或者 CMD,CLK,DATA0-DATA3(sdio);在MMC中,通常data1複用為中斷線。所有的指令傳輸都在CMD線上,DATA是雙向的主要用于傳資料。(工作模式有點類似于spi/i2c總線,隻需要實作一個transfer函數功能就可以了(負責指令發送,應答接收,資料接收))

SD 總線協定

SD總線通信是基于指令和資料比特流,起始位開始和停止位結束。資料傳輸由host發起,comand->response(可選)->data(可選);  SD總線通信有三個元素:

Command:由host發送到卡裝置,使用CMD線發送;

Response:從card端發送到host端,作為對前一個CMD的相應,通過CMD線發送;

Data:即能從host傳輸到card,也能從card傳輸到host,通過data線傳輸。

Commands

以下是四種用于控制卡裝置的指令類型,每個command都是固定的48位長度:

1、broadcast commands(bc), no response:廣播類型的指令,不需要有響應;

2、broadcast commands with response(bcr):廣播類型的指令且需要響應;

3、addressed(point-to-point) commands(ac):由HOST發送到指定的卡裝置,沒有資料的傳輸;

4、address(point-to-point) data transfercommands(adtc):由HOST發送到指定的卡裝置且伴随有資料傳輸。

指令格式:

Card register

幾個主要的寄存器:OCR,CID,CSD,RCA和SCR。

Operation condition register(OCR):32位的OCR包含卡裝置支援的工作電壓表;

Card identification number register (CID):包含用于在卡識别階段的卡資訊,包括制造商ID,産品名等;

Card specific data register(CSD):CSD寄存器提供了如何通路卡裝置的資訊,包括定義了資料格式,錯誤校驗類型,最大通路次數,資料傳輸率等;

Relative card address register(RCA):存放在卡識别階段配置設定的相對卡位址,預設相對卡位址為0000h;

SD card configuration register(SCR):SCR是一個配置寄存器,用于配置SD memory card的特殊功能。

Response

所有的response都通過CMD線發送到host端,R4和R5響應類型是SDIO中特有的:

1、R1(normal response command):用來響應常用指令;

2、R2(CID,CSD register):用來響應CMD2和CMD10或CMD9,并把CID或CSD寄存器作為響應資料;

3、R3(OCR register):用來響應ACMD41指令,并把OCR寄存器作為響應資料;

4、R6(published RCA response):配置設定相對卡位址的響應;

5、R7(card interface condition):響應CMD8,傳回卡支援的電壓資訊;

6、R4(CMD5):響應CMD5,并把OCR寄存器作為響應資料;

7、R5(CMD52):CMD52是一個讀寫寄存器的指令,R5用于CMD52的響應;

Host 探測SD/MMC指令:

Setting 1-bit bus width (設定成1bit模式)

Setting clock 400000 (199999992/512) (設定初始時鐘為400khz)

CMD0 (0x00000300) arg 0x00000000 issue. // 複位

CMD8 (0x00000408) arg 0x000001aa issue. // 讀取版本号,讀到就為2.0

CMD5 (0x00000705) arg 0x01000000 issue. // 設定ocr屬性,失敗則用CMD1判斷是SD還是MMC

CMD error. INFO2 000000c0

CMD1 (0x00000701) arg 0x00000000 issue. // 設定ocr屬性,失敗則是SD,成功是MMC

CMD error. INFO2 000000c0

SD初始化:

CMD0 (0x00000300) arg 0x00000000 issue.  // 複位SD

CMD8 (0x00000408) arg 0x000001aa issue.  // 重新讀取版本号

while (1s) {

CMD55 (0x00000437) arg 0x00000000 issue. // 配置rca

CMD41 (0x00000729) arg 0x41300000 issue. // 配置電壓相關

}

MMC初始化:

CMD0 (0x00000300) arg 0x00000000 issue.  // 複位SD

while (1s) {

CMD1 (0x00000408) arg 0x000001aa issue.  // 設定MMC ocr屬性

}