SD初始化過程以及Cmd解析

SD:

1CMD,所有的命令和迴應都是通過這條線一位一位的傳輸.不同模式或不同版本下,命令有不同含義.(SD(SD[0],SD[3:0]),SPI))

1條時鐘線,時鐘源是來自APH總線時鐘

4條數據線,SPI模式下用了兩條(一條輸出,一條輸入),SD的一位模式下一條(輸出輸入),也可以用完四條(輸出輸入,DATA[0]將分時複用).

 

SD卡是以塊爲單位,初始化時有配置,一般爲512字節,一個扇區有4096個塊.

 

2410_SDI控制器:

封裝了命令和數據的移位操作,支持SDI_1.0規範.FIFODMA模式.當操作某些寄存器時,控制器會自動幫我們轉換成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] 包含Start Bit,Transmission Bit,Command Index.

ACMD命令:

ACMD是特殊命令.雖然發送方法也是用SDICARGSDICCON來發.但是,在發送特殊命令前,

要先發送一條普通的不帶參數的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位置1HC),否則發送CMD0,有反應說明是MMC

        5)發送CMD2,驗證SD卡是否接入,長反饋(CID)

        6)發送CMD3,讀取SD卡的RCA(地址),短反饋

7)發送CMD9,讀取CSD寄存器獲取卡的相關信息

        8)發送CMD7,使能SD

        9)配置高速時鐘,準備數據傳輸,一般20M25M

10)發送CMD55+ACMD51讀取SCR寄存器,SD卡可以通過該值獲得位寬,如果是MMC卡則需要使用主線測試來確定卡的位寬。

11SD卡發送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位置1HC),否則發送CMD0,有反應說明是MMC

        5)發送CMD2,驗證SD卡是否接入,長反饋(CID)

        6)發送CMD3,讀取SD卡的RCA(地址),短反饋

7)發送CMD9,讀取CSD寄存器獲取卡的相關信息

        8)發送CMD7,使能SD

        9)配置高速時鐘,準備數據傳輸,一般20M25M

 

10)發送CMD55+ACMD51讀取SCR寄存器,SD卡可以通過該值獲得位寬,如果是MMC卡則需要使用主線測試來確定卡的位寬。

11SD卡發送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作爲命令參數,取消所有選中

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章