SD初始化过程以及Cmd解析
SD:
1條CMD線,所有的命令和回應(yīng)都是通過這條線一位一位的傳輸.不同模式或不同版本下,命令有不同含義.(SD(SD[0],SD[3:0]),SPI))
1條時(shí)鐘線,時(shí)鐘源是來自APH總線時(shí)鐘
4條數(shù)據(jù)線,SPI模式下用了兩條(一條輸出,一條輸入),SD的一位模式下一條(輸出輸入),也可以用完四條(輸出輸入,DATA[0]將分時(shí)復(fù)用).
?
SD卡是以塊為單位,初始化時(shí)有配置,一般為512字節(jié),一個(gè)扇區(qū)有4096個(gè)塊.
?
2410_SDI控制器:
封裝了命令和數(shù)據(jù)的移位操作,支持SDI_1.0規(guī)范.有FIFO和DMA模式.當(dāng)操作某些寄存器時(shí),控制器會(huì)自動(dòng)幫我們轉(zhuǎn)換成48位的命令包通過移位控制器發(fā)給SD從機(jī).
?
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中要發(fā)送CMD需要設(shè)置SDICARG,SDICCON兩個(gè)寄存器.
SDICARG: SDI?命令參數(shù)寄存器:
SDICCON: SDI?命令控制寄存器:
這兩個(gè)寄存器合起來構(gòu)成SD協(xié)議規(guī)范中的CMD命令.其中:
SDICARG[31:0] ===================== CMD[39:8] ?命令的參數(shù)(根據(jù)命令所需的參數(shù)位格式設(shè)置)
SDICCON[7:0] ?===================== CMD[47:40]?包含Start Bit,Transmission Bit,Command Index.
ACMD命令:
ACMD是特殊命令.雖然發(fā)送方法也是用SDICARG和SDICCON來發(fā).但是,在發(fā)送特殊命令前,
要先發(fā)送一條普通的不帶參數(shù)的CMD55命令,表示下一條所發(fā)送的命令是特殊命令.
?
例如: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卡沒有此寄存器,獲取該寄存器的數(shù)據(jù)需要從數(shù)據(jù)線讀的.
CSD?該寄存器保存著SD卡的詳細(xì)信息,如塊大小,SD卡的容量大小,文件系統(tǒng)等信息.
RCA SD的相對(duì)地址(SD卡已經(jīng)保存在芯片內(nèi)部)
OCR?該寄存器保存著SD的可供電范圍,并且區(qū)別是否為HC卡(根據(jù)返回的ORC回應(yīng)第30位是否置1).
CIA (Card I/O Area)
CID SD卡的唯一ID號(hào)
CIS (Card Information Structure)跟Linux內(nèi)核的參數(shù)TagList的存放方式很相似,都是以標(biāo)識(shí)號(hào)和長(zhǎng)度加后續(xù)內(nèi)容表示一個(gè)節(jié)點(diǎn).
?
SD模式的命令說明:
CMD0 GO_IDLE_STATE ?Mandatory Mandatory ?Used to change from SD to SPI mode /*?使SD卡進(jìn)入Idle狀態(tài)?*/
CMD2 ALL_SEND_CID Mandatory ?CID not supported by SDIO /*?廣播獲取卡的CID信息?*/
CMD3 SEND_RELATIVE_ADDR ?Mandatory Mandatory ?/*?廣播獲取SD卡所分配的相對(duì)地址?*/
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 ?/*?根據(jù)獲取指定的RCA,選中SD卡,如果在選中一個(gè)卡的狀態(tài)下,又選中其他的卡,那么之前的卡會(huì)自動(dòng)取消選中,如果發(fā)送地址0,則表示取消選中全部卡?*/
CMD9 SEND_CSD ?Mandatory ? ?CSD not supported by SDIO /*?獲取SD相關(guān)的存儲(chǔ)信息,如塊大小,容量等. */
CMD10 SEND_CID ?Mandatory ? CID not supported by SDIO?
CMD12 STOP_TRANSMISSION ?Mandatory /*?停止多塊傳輸操作?*/
CMD13 SEND_STATUS ?Mandatory ? ?Card Status includes only SDMEM information /*?獲取卡的狀態(tài)?*/
CMD15 GO_INACTIVE_STATE ?Mandatory Mandatory ?
CMD16 SET_BLOCKLEN ?Mandatory /*?設(shè)置SD卡的塊大小,CSD寄存器有描述. */
CMD17 READ_SINGLE_BLOCK ?Mandatory /*?使SD卡進(jìn)入傳輸狀態(tài),讀取單個(gè)塊?*/
CMD18 READ_MULTIPLE_BLOCK Mandatory /*?使SD卡進(jìn)入傳輸狀態(tài),讀取多個(gè)塊,直到收到CMD12為止?*/
CMD24 WRITE_BLOCK ? Mandatory /*?使SD卡進(jìn)入傳輸狀態(tài),寫入單個(gè)塊?*/ ??
CMD25 WRITE_MULTIPLE_BLOCK Mandatory /*?使SD卡進(jìn)入傳輸狀態(tài),寫入多個(gè)塊?*/ ? ?
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 /*?特殊指令前命令,在發(fā)送ACMD類指令前,需要發(fā)送此命令?*/ ?
CMD56 GEN_CMD ?Mandatory ? ?
ACMD6 SET_BUS_WIDTH ?Mandatory /*?設(shè)置SD卡的總線位寬,這個(gè)需要讀取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卡基礎(chǔ)配置,包括大小端,中斷允許,時(shí)鐘使能和重啟FIFO */
SDIPRE 0x5A000004 ? ?R/W SDI baud rate prescaler register /*?對(duì)SD的時(shí)鐘分頻系數(shù)設(shè)置?*/
SDICARG 0x5A000008 ? R/W SDI command argument register ? ?/*?指令的參數(shù)存放在這里,不同的命令,參數(shù)的位數(shù)格式有不用含義?*/
SDICCON 0x5A00000C ? R/W SDI command control register ? ? /*?控制指令形式的寄存器,配置SPI還是SDI指令,指令的反饋長(zhǎng)度,是否等待反饋,是否運(yùn)行指令,指令的索引等?*/
SDICSTA 0x5A000010 ? R/(W) SDI command status register ? ?/*?指令狀態(tài)寄存器,指令是否超時(shí),傳送,結(jié)束,CRC是否正確等?*/
SDIRSP0 0x5A000014 ? R SDI response register 0 ? ? ? ? ? ?/* SD回應(yīng)狀態(tài)寄存器,R1的回應(yīng)都用這個(gè),其他長(zhǎng)回應(yīng)會(huì)用到4個(gè). */
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 ? /*?設(shè)置超時(shí)時(shí)間?*/
SDIBSIZE 0x5A000028 ?R/W SDI block size register ? ? ? ? ?/*?設(shè)置Block的大小,FIFO共填充的數(shù)據(jù).單位是字節(jié)?*/
SDIDCON 0x5A00002C ? R/W SDI data control register ? ? ? ?/*?數(shù)據(jù)控制寄存器,配置是幾線傳輸,數(shù)據(jù)發(fā)送方向,數(shù)據(jù)傳送方式,要傳送多少個(gè)塊的數(shù)據(jù)等?*/
SDIDCNT 0x5A000030 ? R SDI data remain counter register ? /*?數(shù)據(jù)保持計(jì)數(shù)器?*/
SDIDSTA 0x5A000034 ? R/(W) SDI data status register ? ? ? /*?數(shù)據(jù)狀態(tài)寄存器,數(shù)據(jù)是否發(fā)送完,CRC效驗(yàn),超時(shí)等*/
SDIFSTA 0x5A000038 ? R SDI FIFO status register ? ? ? ? ? /* FIFO狀態(tài)寄存器,DMA傳輸時(shí)不用判斷FIFO */
SDIDAT 0x5A00003C ? ?(Li/W,Li/B, Bi/W) 0x5A00003F(Bi/B) R/W SDI data register /*?數(shù)據(jù)傳輸寄存器,要嚴(yán)格讀完所請(qǐng)求的數(shù)據(jù)塊,否則遺留的數(shù)據(jù)位將影響下一次的數(shù)據(jù)傳輸?*/
SDIIMSK 0x5A000040 ? R/W SDI interrupt mask register ? ? ?/*?中斷屏蔽?*/
?
SD/MMC?初始化流程
步驟是:1)配置時(shí)鐘,慢速一般為400K,設(shè)置工作模式
? ? ? ? 2)發(fā)送CMD0,進(jìn)入空閑態(tài),該指令沒有反饋
3)發(fā)送CMD8,如果有反應(yīng),CRC值與發(fā)送的值相同,說明該卡兼容SD2.0協(xié)議。
? ? ? ? 4)發(fā)送CMD55+ACMD41,判斷SD卡的上電是否正確,短反饋成功說明該卡為SD卡(短反饋第31位置1為HC卡),否則發(fā)送CMD0,有反應(yīng)說明是MMC卡
? ? ? ? 5)發(fā)送CMD2,驗(yàn)證SD卡是否接入,長(zhǎng)反饋(CID)
? ? ? ? 6)發(fā)送CMD3,讀取SD卡的RCA(地址),短反饋
7)發(fā)送CMD9,讀取CSD寄存器獲取卡的相關(guān)信息
? ? ? ? 8)發(fā)送CMD7,使能SD卡
? ? ? ? 9)配置高速時(shí)鐘,準(zhǔn)備數(shù)據(jù)傳輸,一般20M~25M
10)發(fā)送CMD55+ACMD51讀取SCR寄存器,SD卡可以通過該值獲得位寬,如果是MMC卡則需要使用主線測(cè)試來確定卡的位寬。
11)SD卡發(fā)送CMD55+ACMD6配置為4bit數(shù)據(jù)傳輸模式(根據(jù)SCR讀出來的值確定),MMC卡發(fā)送CMD6來設(shè)置位寬
12)發(fā)送CMD7,使能SD卡,使其進(jìn)入傳輸狀態(tài)),接著發(fā)送CMD16設(shè)置塊大小(根據(jù)前面讀取的CSD信息確定)。
13)?把命令參數(shù)設(shè)置為0,再次發(fā)送CMD7,取消選中所有卡。
?
SD?讀操作(注意:標(biāo)準(zhǔn)卡和HC卡最大區(qū)別在于單塊或者多塊讀寫時(shí)命令的起始地址參數(shù)對(duì)齊,標(biāo)準(zhǔn)卡是以字節(jié)計(jì)算為起始地址的,而HC則按塊地址作為起始地址.例如,一般情況下從CSD獲取的卡信息中,塊長(zhǎng)度都為512字節(jié)大小,那么要訪問第一個(gè)512字節(jié)時(shí),對(duì)于標(biāo)準(zhǔn)卡,命令的參數(shù)直接寫512,而HC卡則寫1.另外,標(biāo)準(zhǔn)卡所使用的SD協(xié)議有可能是1.0也有可能是2.0,但是HC的卡就一定是2.0的,大部分的SD卡都是2.0的,而最新的XC卡則使用3.0的協(xié)議.)
步驟是:1)發(fā)送CMD7,以卡的相對(duì)地址為參數(shù),選中該卡,并使其進(jìn)入Tran狀態(tài)
? ? ? ? 2)發(fā)送CMD17/CMD18,命令的參數(shù)需要根據(jù)初始化時(shí)所判斷的卡類型填寫,按字節(jié)或按塊.
3)循環(huán)讀取數(shù)據(jù)
? ? ? ? 4)發(fā)送CMD12,強(qiáng)制停止所有傳輸.
? ? ? ? 5)發(fā)送CMD7,以0作為命令參數(shù),取消所有選中.
?
?
SD/MMC?初始化流程
步驟是:1)配置時(shí)鐘,慢速一般為400K,設(shè)置工作模式
? ? ? ? 2)發(fā)送CMD0,進(jìn)入空閑態(tài),該指令沒有反饋
3)發(fā)送CMD8,如果有反應(yīng),CRC值與發(fā)送的值相同,說明該卡兼容SD2.0協(xié)議。
? ? ? ? 4)發(fā)送CMD55+ACMD41,判斷SD卡的上電是否正確,短反饋成功說明該卡為SD卡(短反饋第31位置1為HC卡),否則發(fā)送CMD0,有反應(yīng)說明是MMC卡
? ? ? ? 5)發(fā)送CMD2,驗(yàn)證SD卡是否接入,長(zhǎng)反饋(CID)
? ? ? ? 6)發(fā)送CMD3,讀取SD卡的RCA(地址),短反饋
7)發(fā)送CMD9,讀取CSD寄存器獲取卡的相關(guān)信息
? ? ? ? 8)發(fā)送CMD7,使能SD卡
? ? ? ? 9)配置高速時(shí)鐘,準(zhǔn)備數(shù)據(jù)傳輸,一般20M~25M
?
10)發(fā)送CMD55+ACMD51讀取SCR寄存器,SD卡可以通過該值獲得位寬,如果是MMC卡則需要使用主線測(cè)試來確定卡的位寬。
11)SD卡發(fā)送CMD55+ACMD6配置為4bit數(shù)據(jù)傳輸模式(根據(jù)SCR讀出來的值確定),MMC卡發(fā)送CMD6來設(shè)置位寬
12)發(fā)送CMD7,使能SD卡,使其進(jìn)入傳輸狀態(tài)),接著發(fā)送CMD16設(shè)置塊大小(根據(jù)前面讀取的CSD信息確定)。
13)?把命令參數(shù)設(shè)置為0,再次發(fā)送CMD7,取消選中所有卡。
?
SD?讀操作(注意:標(biāo)準(zhǔn)卡和HC卡最大區(qū)別在于單塊或者多塊讀寫時(shí)命令的起始地址參數(shù)對(duì)齊,標(biāo)準(zhǔn)卡是以字節(jié)計(jì)算為起始地址的,而HC則按塊地址作為起始地址.例如,一般情況下從CSD獲取的卡信息中,塊長(zhǎng)度都為512字節(jié)大小,那么要訪問第一個(gè)512字節(jié)時(shí),對(duì)于標(biāo)準(zhǔn)卡,命令的參數(shù)直接寫512,而HC卡則寫1.另外,標(biāo)準(zhǔn)卡所使用的SD協(xié)議有可能是1.0也有可能是2.0,但是HC的卡就一定是2.0的,大部分的SD卡都是2.0的,而最新的XC卡則使用3.0的協(xié)議.)
步驟是:1)發(fā)送CMD7,以卡的相對(duì)地址為參數(shù),選中該卡,并使其進(jìn)入Tran狀態(tài)
? ? ? ? 2)發(fā)送CMD17/CMD18,命令的參數(shù)需要根據(jù)初始化時(shí)所判斷的卡類型填寫,按字節(jié)或按塊.
3)循環(huán)讀取數(shù)據(jù)
? ? ? ? 4)發(fā)送CMD12,強(qiáng)制停止所有傳輸.
? ? ? ? 5)發(fā)送CMD7,以0作為命令參數(shù),取消所有選中
總結(jié)
以上是生活随笔為你收集整理的SD初始化过程以及Cmd解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信号量、互斥体和自旋锁
- 下一篇: 设备的阻塞与非阻塞操作