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屬性
}