SD初始化過程以及Cmd解析
SD:
1條CMD線,所有的命令和迴應都是通過這條線一位一位的傳輸.不同模式或不同版本下,命令有不同含義.(SD(SD[0],SD[3:0]),SPI))
1條時鐘線,時鐘源是來自APH匯流排時鐘
4條資料線,SPI模式下用了兩條(一條輸出,一條輸入),SD的一位模式下一條(輸出輸入),也可以用完四條(輸出輸入,DATA[0]將分時複用).
SD卡是以塊為單位,初始化時有配置,一般為512位元組,一個扇區有4096個塊.
2410_SDI控制器:
封裝了命令和資料的移位操作,支援SDI_1.0規範.有FIFO和DMA模式.當操作某些暫存器時,控制器會自動幫我們轉換成48位的命令包通過移位控制器發給SD
SD命令包格式
----------------------------------------------------------------------------
Bit 位置 47 46 [45:40] [39:08] [07:01] 00
Bit 寬度 1 1 6 32 7 1
值 0 1 x x x 1
說明 Start BitTransmission Bit Command Index ArgumentCRC7 End Bit
----------------------------------------------------------------------------
在S3C2410中要傳送CMD需要設定SDICARG,SDICCON兩個暫存器.
SDICARG: SDI 命令引數暫存器:
SDICCON: SDI 命令控制暫存器:
這兩個暫存器合起來構成SD協議規範中的CMD命令.其中:
SDICARG[31:0] ===================== CMD[39:8] 命令的引數(根據命令所需的引數位格式設定)
SDICCON[7:0] ===================== CMD[47:40]
ACMD命令:
ACMD是特殊命令.雖然傳送方法也是用SDICARG和SDICCON來發.但是,在傳送特殊命令前,
要先發送一條普通的不帶引數的CMD55命令,表示下一條所傳送的命令是特殊命令.
例如:CMD52 SDICARG:
----------------------------------------------------------------------------
Bit 位置 31 [30:28] 27 26 [25:9] 8 [7:0]
Bit 寬度 1 3 1 1 17 1 8
說明 R/W flag Function Number RAW flag Stuff Register Address Stuff Write Data or Stuff Bits
----------------------------------------------------------------------------
SCR 該暫存器儲存的SD的特殊性資訊(例如支援的匯流排位寬,SD卡的版本),MMC卡沒有此暫存器,獲取該暫存器的資料需要從資料線讀的.
CSD 該暫存器儲存著SD卡的詳細資訊,如塊大小,SD卡的容量大小,檔案系統等資訊.
RCA SD的相對地址(SD卡已經儲存在晶片內部)
OCR 該暫存器儲存著SD的可供電範圍,並且區別是否為HC卡(根據返回的ORC迴應第30位是否置1).
CIA (Card I/O Area)
CID SD卡的唯一ID號
CIS (Card Information Structure)跟Linux核心的引數TagList的存放方式很相似,都是以標識號和長度加後續內容表示一個節點.
SD模式的命令說明:
CMD0 GO_IDLE_STATE Mandatory Mandatory Used to change from SD to SPI mode /* 使SD卡進入Idle狀態 */
CMD2 ALL_SEND_CID Mandatory CID not supported by SDIO /* 廣播獲取卡的CID資訊 */
CMD3 SEND_RELATIVE_ADDR Mandatory Mandatory /* 廣播獲取SD卡所分配的相對地址 */
CMD4 SET_DSR Optional DSR not supported by SDIO
CMD5 IO_SEND_OP_COND Mandatory
CMD6 SWITCH_FUNC Mandatory1 Mandatory1 Added in Part 1 v1.10
CMD7 SELECT/DESELECT_CARD Mandatory Mandatory /* 根據獲取指定的RCA,選中SD卡,如果在選中一個卡的狀態下,又選中其他的卡,那麼之前的卡會自動取消選中,如果傳送地址0,則表示取消選中全部卡 */
CMD9 SEND_CSD Mandatory CSD not supported by SDIO /* 獲取SD相關的儲存資訊,如塊大小,容量等. */
CMD10 SEND_CID Mandatory CID not supported by SDIO
CMD12 STOP_TRANSMISSION Mandatory /* 停止多塊傳輸操作 */
CMD13 SEND_STATUS Mandatory Card Status includes only SDMEM information /* 獲取卡的狀態 */
CMD15 GO_INACTIVE_STATE Mandatory Mandatory
CMD16 SET_BLOCKLEN Mandatory /* 設定SD卡的塊大小,CSD暫存器有描述. */
CMD17 READ_SINGLE_BLOCK Mandatory /* 使SD卡進入傳輸狀態,讀取單個塊 */
CMD18 READ_MULTIPLE_BLOCK Mandatory /* 使SD卡進入傳輸狀態,讀取多個塊,直到收到CMD12為止 */
CMD24 WRITE_BLOCK Mandatory /* 使SD卡進入傳輸狀態,寫入單個塊 */
CMD25 WRITE_MULTIPLE_BLOCK Mandatory /* 使SD卡進入傳輸狀態,寫入多個塊 */
CMD27 PROGRAM_CSD Mandatory CSD not supported by SDIO
CMD28 SET_WRITE_PROT Optional
CMD29 CLR_WRITE_PROT Optional
CMD30 SEND_WRITE_PROT Optional
CMD32 ERASE_WR_BLK_START Mandatory
CMD33 ERASE_WR_BLK_END Mandatory
CMD38 ERASE Mandatory
CMD42 LOCK_UNLOCK Optional
CMD52 IO_RW_DIRECT Mandatory
CMD53 IO_RW_EXTENDED Mandatory Block mode is optional
CMD55 APP_CMD Mandatory /* 特殊指令前命令,在傳送ACMD類指令前,需要傳送此命令 */
CMD56 GEN_CMD Mandatory
ACMD6 SET_BUS_WIDTH Mandatory /* 設定SD卡的匯流排位寬,這個需要讀取SCR確定 */
ACMD13 SD_STATUS Mandatory
ACMD22 SEND_NUM_WR_BLOCKS Mandatory
ACMD23 SET_WR_BLK_ERASE_COUNT Mandatory
ACMD41 SD_APP_OP_COND Mandatory /* 獲取SD電壓值 */
ACMD42 SET_CLR_CARD_DETECT Mandatory
ACMD51 SEND_SCR Mandatory SCR not supported by SDIO /* 獲取SD卡的SCR暫存器的值 */
2410 SDI控制暫存器:
SDICON 0x5A000000 R/W SDI control register /* 完成SD卡基礎配置,包括大小端,中斷允許,時鐘使能和重啟FIFO */
SDIPRE 0x5A000004 R/W SDI baud rate prescaler register /* 對SD的時鐘分頻係數設定 */
SDICARG 0x5A000008 R/W SDI command argument register /* 指令的引數存放在這裡,不同的命令,引數的位數格式有不用含義 */
SDICCON 0x5A00000C R/W SDI command control register /* 控制指令形式的暫存器,配置SPI還是SDI指令,指令的反饋長度,是否等待反饋,是否執行指令,指令的索引等 */
SDICSTA 0x5A000010 R/(W) SDI command status register /* 指令狀態暫存器,指令是否超時,傳送,結束,CRC是否正確等 */
SDIRSP0 0x5A000014 R SDI response register 0 /* SD迴應狀態暫存器,R1的迴應都用這個,其他長迴應會用到4個. */
SDIRSP1 0x5A000018 R SDI response register 1
SDIRSP2 0x5A00001C R SDI response register 2
SDIRSP3 0x5A000020 R SDI response register 3
SDIDTIMER 0x5A000024 R/W SDI data / busy timer register /* 設定超時時間 */
SDIBSIZE 0x5A000028 R/W SDI block size register /* 設定Block的大小,FIFO共填充的資料.單位是位元組 */
SDIDCON 0x5A00002C R/W SDI data control register /* 資料控制暫存器,配置是幾線傳輸,資料傳送方向,資料傳送方式,要傳送多少個塊的資料等 */
SDIDCNT 0x5A000030 R SDI data remain counter register /* 資料保持計數器 */
SDIDSTA 0x5A000034 R/(W) SDI data status register /* 資料狀態暫存器,資料是否傳送完,CRC效驗,超時等 */
SDIFSTA 0x5A000038 R SDI FIFO status register /* FIFO狀態暫存器,DMA傳輸時不用判斷FIFO */
SDIDAT 0x5A00003C (Li/W,Li/B, Bi/W) 0x5A00003F(Bi/B) R/W SDI data register /* 資料傳輸暫存器,要嚴格讀完所請求的資料塊,否則遺留的資料位將影響下一次的資料傳輸 */
SDIIMSK 0x5A000040 R/W SDI interrupt mask register /* 中斷遮蔽 */
SD/MMC 初始化流程
步驟是:1)配置時鐘,慢速一般為400K,設定工作模式
2)傳送CMD0,進入空閒態,該指令沒有反饋
3)傳送CMD8,如果有反應,CRC值與傳送的值相同,說明該卡相容SD2.0協議。
4)傳送CMD55+ACMD41,判斷SD卡的上電是否正確,短反饋成功說明該卡為SD卡(短反饋第31位置1為HC卡),否則傳送CMD0,有反應說明是MMC卡
5)傳送CMD2,驗證SD卡是否接入,長反饋(CID)
6)傳送CMD3,讀取SD卡的RCA(地址),短反饋
7)傳送CMD9,讀取CSD暫存器獲取卡的相關資訊
8)傳送CMD7,使能SD卡
9)配置高速時鐘,準備資料傳輸,一般20M~25M
10)傳送CMD55+ACMD51讀取SCR暫存器,SD卡可以通過該值獲得位寬,如果是MMC卡則需要使用主線測試來確定卡的位寬。
11)SD卡傳送CMD55+ACMD6配置為4bit資料傳輸模式(根據SCR讀出來的值確定),MMC卡傳送CMD6來設定位寬
12)傳送CMD7,使能SD卡,使其進入傳輸狀態),接著傳送CMD16設定塊大小(根據前面讀取的CSD資訊確定)。
13) 把命令引數設定為0,再次傳送CMD7,取消選中所有卡。
SD 讀操作(注意:標準卡和HC卡最大區別在於單塊或者多塊讀寫時命令的起始地址引數對齊,標準卡是以位元組計算為起始地址的,而HC則按塊地址作為起始地址.例如,一般情況下從CSD獲取的卡資訊中,塊長度都為512位元組大小,那麼要訪問第一個512位元組時,對於標準卡,命令的引數直接寫512,而HC卡則寫1.另外,標準卡所使用的SD協議有可能是1.0也有可能是2.0,但是HC的卡就一定是2.0的,大部分的SD卡都是2.0的,而最新的XC卡則使用3.0的協議.)
步驟是:1)傳送CMD7,以卡的相對地址為引數,選中該卡,並使其進入Tran狀態
2)傳送CMD17/CMD18,命令的引數需要根據初始化時所判斷的卡型別填寫,按位元組或按塊.
3)迴圈讀取資料
4)傳送CMD12,強制停止所有傳輸.
5)傳送CMD7,以0作為命令引數,取消所有選中.
SD/MMC 初始化流程
步驟是:1)配置時鐘,慢速一般為400K,設定工作模式
2)傳送CMD0,進入空閒態,該指令沒有反饋
3)傳送CMD8,如果有反應,CRC值與傳送的值相同,說明該卡相容SD2.0協議。
4)傳送CMD55+ACMD41,判斷SD卡的上電是否正確,短反饋成功說明該卡為SD卡(短反饋第31位置1為HC卡),否則傳送CMD0,有反應說明是MMC卡
5)傳送CMD2,驗證SD卡是否接入,長反饋(CID)
6)傳送CMD3,讀取SD卡的RCA(地址),短反饋
7)傳送CMD9,讀取CSD暫存器獲取卡的相關資訊
8)傳送CMD7,使能SD卡
9)配置高速時鐘,準備資料傳輸,一般20M~25M
10)傳送CMD55+ACMD51讀取SCR暫存器,SD卡可以通過該值獲得位寬,如果是MMC卡則需要使用主線測試來確定卡的位寬。
11)SD卡傳送CMD55+ACMD6配置為4bit資料傳輸模式(根據SCR讀出來的值確定),MMC卡傳送CMD6來設定位寬
12)傳送CMD7,使能SD卡,使其進入傳輸狀態),接著傳送CMD16設定塊大小(根據前面讀取的CSD資訊確定)。
13) 把命令引數設定為0,再次傳送CMD7,取消選中所有卡。
SD 讀操作(注意:標準卡和HC卡最大區別在於單塊或者多塊讀寫時命令的起始地址引數對齊,標準卡是以位元組計算為起始地址的,而HC則按塊地址作為起始地址.例如,一般情況下從CSD獲取的卡資訊中,塊長度都為512位元組大小,那麼要訪問第一個512位元組時,對於標準卡,命令的引數直接寫512,而HC卡則寫1.另外,標準卡所使用的SD協議有可能是1.0也有可能是2.0,但是HC的卡就一定是2.0的,大部分的SD卡都是2.0的,而最新的XC卡則使用3.0的協議.)
步驟是:1)傳送CMD7,以卡的相對地址為引數,選中該卡,並使其進入Tran狀態
2)傳送CMD17/CMD18,命令的引數需要根據初始化時所判斷的卡型別填寫,按位元組或按塊.
3)迴圈讀取資料
4)傳送CMD12,強制停止所有傳輸.
5)傳送CMD7,以0作為命令引數,取消所有選中