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