SDIO
一.SDIO 簡介:
STM32F1 的 SDIO 控制器包含 2 個(gè)部分:SDIO 適配器模塊和 AHB 總線接口,其功能框圖
如圖 40.1.1.1 所示
1.SDIO_D介紹:
a.如果一個(gè) SD 或 SD I/O 卡接到了總線上,可以通過主機(jī)配置數(shù)據(jù)傳輸使用 SDIO_D0 或SDIO_D[3:0]。所有的數(shù)據(jù)線都工作在推挽模式
b.如果一個(gè)多媒體卡接到了總線上,則 SDIO_D0、SDIO_D[3:0]或 SDIO_D[7:0]可以用于數(shù)據(jù)傳輸
所有的數(shù)據(jù)線都工作在推挽模式。
2.SDIO_CMD 介紹:
SDIO_CMD 有兩種操作模式:
① 用于初始化時(shí)的開路模式(僅用于 MMC 版本 V3.31 或之前版本)
② 用于命令傳輸?shù)耐仆炷J?SD/SD I/O 卡和 MMC V4.2 在初始化時(shí)也使用推挽驅(qū)動(dòng))
3.SDIO 的時(shí)鐘:
a. 卡時(shí)鐘(SDIO_CK):對(duì)于 SD 或 SD I/O 卡,時(shí)鐘頻率可以在 0MHz 至 25MHz
間變化 SDIO_CK=SDIOCLK/(2+CLKDIV)
b. SDIO 適配器時(shí)鐘(SDIOCLK):其頻率等于 AHB 總線頻率(HCLK),并用于產(chǎn)生 SDIO_CK 時(shí)鐘一般為72M
c. AHB 總線接口時(shí)鐘(HCLK/2):該時(shí)鐘用于驅(qū)動(dòng) SDIO 的 AHB 總線接口,其頻率為
HCLK/2
二.SDIO 的命令與響應(yīng)
應(yīng)用相關(guān)命令(ACMD)和通用命令(CMD)
注意:必須先發(fā)送通用命令(CMD55),然后才能發(fā)送應(yīng)用相關(guān)命令(ACMD)。
1.SDIO 的命令格式如表 40.1.3.1 所示:
我們需要設(shè)置的就只有命令索引和參數(shù)部分
一般情況下,選中的 SD 卡在接收到命令之后,都會(huì)回復(fù)一個(gè)應(yīng)答(注意 CMD0 是無應(yīng)答的),這個(gè)應(yīng)答我們稱之為響應(yīng),響應(yīng)也是在 CMD 線上串行傳輸?shù)?/p>
2.響應(yīng)格式:
短響應(yīng)(48 位)和長響應(yīng)(136 位)
注意:這兩種響應(yīng)類型都帶 CRC 錯(cuò)誤檢測(注意不帶 CRC 的響應(yīng)應(yīng)該忽略 CRC 錯(cuò)誤標(biāo)志,如 CMD1 的響應(yīng))
長/短響應(yīng)的格式如表 40.1.3.2 所示
說明:
對(duì)于短響應(yīng),命令索引存放在 SDIO_RESPCMD 寄存器,參數(shù)則存放在 SDIO_RESP1 寄存器里面。
對(duì)于長響應(yīng),則僅留 CID/CSD 位域,存放在 SDIO_RESP1~SDIO_RESP4 等 4 個(gè)寄存器
三.SD存儲(chǔ)卡響應(yīng)格式
SD 存儲(chǔ)卡總共有 5 類響應(yīng)(R1、R2、R3、R6、R7)
以R1響應(yīng)為例說明:
在收到 R1 響應(yīng)后,我們可以從 SDIO_RESPCMD 寄存器和 SDIO_RESP1 寄存器分別讀出命令索引和卡狀態(tài)信息
四.SDIO 控制器與 SD 卡之間的傳輸
a.對(duì)于 SDI/SDIO 存儲(chǔ)器,數(shù)據(jù)是以數(shù)據(jù)塊的形式傳輸?shù)?#xff0c;
b.對(duì)于 MMC 卡,數(shù)據(jù)是以數(shù)據(jù)塊或者數(shù)據(jù)流的形式傳
1.SDIO(多)數(shù)據(jù)塊讀操作,如圖 40.1.3.1 所示:
注意:
單個(gè)數(shù)據(jù)塊讀的時(shí)候,在收到 1 個(gè)數(shù)據(jù)塊以后即可以停止了,不需要發(fā)送停止命令(CMD12)。
但是多塊數(shù)據(jù)讀的時(shí)候,SD 卡將一直發(fā)送數(shù)據(jù)給主機(jī),直到接到主機(jī)發(fā)送的 STOP 命令(CMD12)
2.SDIO(多)數(shù)據(jù)塊寫操作,如圖 40.1.3.2 所示:
注意:
和讀操作相比多了一個(gè)繁忙判斷,新的數(shù)據(jù)塊必須在 SD 卡非繁忙的時(shí)候發(fā)送。
這里的繁忙信號(hào)由 SD 卡拉低 SDIO_D0,以表示繁忙,SDIO 硬件自動(dòng)控制,不需要我們軟件處理
五.相關(guān)寄存器
SDIO 的數(shù)據(jù) FIFO 寄存器(SDIO_FIFO)
a.他們由一組連續(xù)的 32 個(gè)地址上的 32 個(gè)寄存器組成
b. 要從 SD 卡讀數(shù)據(jù),就必須讀 SDIO_FIFO 寄存器,要寫數(shù)據(jù)到 SD 卡,則要寫 SDIO_FIFO 寄存器
c.SDIO 將這 32 個(gè)地址分為 16 個(gè)一組,發(fā)送接收各占一半
d.每次讀寫的時(shí)候,最多就是讀取發(fā)送 FIFO 或?qū)懭虢邮?FIFO 的一半大小的數(shù)據(jù),也就是 8 個(gè)(32 個(gè)字節(jié)),這里特別提醒,我們操作 SDIO_FIFO(不論讀出還是寫入)必須是以 4 字節(jié)對(duì)齊的內(nèi)存進(jìn)行操作,否則將導(dǎo)致出錯(cuò)!
六.MIcor SD卡引腳圖
七.SD卡初始化
ACMD41的命令和響應(yīng)
SD 卡在接收到 ACMD41 后,返回 OCR 寄存器內(nèi)容,
如果是 2.0 的卡,主機(jī)可以通過判斷OCR 的 CCS 位來判斷是 SDHC 還是 SDSC;
如果是 1.x 的卡,則忽略該位。
OCR 寄存器的最后一個(gè)位用于告訴主機(jī) SD 卡是否上電完成,如果上電完成,該位將會(huì)被置 1
CMD8命令即響應(yīng)
VHS 位定義如表 40.1.5.2 所示:
如果 SD 卡支持CMD8,且支持該電壓范圍,則會(huì)通過 CMD8 的響應(yīng)(R7)將參數(shù)部分原本返回給主機(jī)
CMD2,用于獲得 CID 寄存器的數(shù)據(jù),CID 寄存器數(shù)據(jù)各位定義如表 40.1.5.5 所示:
SD 卡在收到 CMD2 后,將返回 R2 長響應(yīng)(136 位),其中包含 128 位有效數(shù)據(jù)(CID 寄存器內(nèi)容),存放在 SDIO_RESP1~4 等 4 個(gè)寄存器里面。通過讀取這四個(gè)寄存器,就可以獲得SD 卡的 CID 信息
CMD3,用于設(shè)置卡相對(duì)地址(RCA,必須為非 0),對(duì)于 SD 卡(非 MMC 卡),在收到CMD3 后,將返回一個(gè)新的 RCA 給主機(jī),方便主機(jī)尋址
八.軟件設(shè)計(jì)
a.讀取
寫入
1) SDIO 時(shí)鐘相關(guān)初始化函數(shù) SDIO_Init。
void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct);
設(shè)置 SDIO_InitTypeDef 結(jié)構(gòu)體類型參數(shù)成員變量的值達(dá)到設(shè)置 SDIO 時(shí)鐘控制寄存器 SDIO_CLKCR 的目的,參數(shù)包括旁路時(shí)鐘分頻器,時(shí)鐘分頻系數(shù)等
2) SDIO 發(fā)送命令函數(shù) SDIO_SendCommand。
void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct);
設(shè)置 SDIO 的命令寄存器 SDIO_CMD 和命令參數(shù)寄存器 SDIO_ARG
在發(fā)送命令之前,必須先設(shè)置命令參數(shù),該函數(shù)既可以設(shè)置命令又可以設(shè)置參數(shù)一舉兩得
3) SDIO 數(shù)據(jù)通道配置函數(shù) SDIO_DataConfig
void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct);
設(shè)置 SDIO_DataInitTypeDef 結(jié)構(gòu)體類型參數(shù)成員變量的值來配置 SDIO 的數(shù)據(jù)
通道狀態(tài)機(jī),包括數(shù)據(jù)傳輸使能、傳輸方向、傳輸模式、DMA 使能、數(shù)據(jù)塊長度等信息
4) SDIO 數(shù)據(jù) FIFO 寄存器讀寫函數(shù):SDIO_ReadData 和 SDIO_WriteData
5) 其他常用函數(shù)。
函 數(shù) 包 括 SDIO 時(shí) 鐘 使 能 函 數(shù) SDIO_ClockCmd ,
電源狀態(tài)控制函數(shù)SDIO_SetPowerState,
SDIO DMA 使能函數(shù) SDIO_DMACmd
以及 SDIO 狀態(tài)獲取函數(shù)SDIO_GetFlagStatus
總結(jié)
- 上一篇: java 使用gdal_Java使用GD
- 下一篇: 同步磁阻电机SynRM矢量控制 基于FO