STM32 - SDIO 使用 DMA 傳輸數(shù)據(jù)時卡住
STM32F407 在調(diào)試 SD I/O?卡的數(shù)據(jù)讀寫命令 CMD53 時,發(fā)現(xiàn) DMA?傳輸數(shù)據(jù)時卡在了等待傳輸完成這一步,DMA2_FLAG_TC3 始終未置位。
SDIO 使用四位總線,時鐘為 24 MHz;DMA 使用 LL 庫,配置如下:
在網(wǎng)絡上搜索后,發(fā)現(xiàn)很多人都遇到了這個問題,而且解決方法那叫一個百花齊放——但是全部木大。經(jīng)過不斷的調(diào)試,這里也為各位提供一種全新的方法。

首先,懷疑 DMA 提供的標志位 DMA2_FLAG_TC3 與 SDIO 狀態(tài)不同步,于是改為?SDIO_FLAG_DATAEND,結(jié)果還是卡在同樣的地方。
想了一遍數(shù)據(jù)傳輸過程,似乎操作 SDIO 接口的順序有問題,修改后如下圖所示。


可以看到,讀取時 SDIO_FLAG_CMDACT 和 SDIO_FLAG_DATAEND 可以一起判斷,不必先等待命令發(fā)送再傳輸數(shù)據(jù)。其實是我寫反了......但是能用( ̄▽ ̄)

然而,SDIO 卡住的問題仍然沒有解決。既然 CMD53 已經(jīng)找不到問題了,那就看看初始化過程:
看起來平平無奇,對吧?但是注意,“如果在 CMD53 中不停啟用 DMA,DMA 將鎖住”,DMA?已經(jīng)提前啟用的情況下依然鎖住,說明問題不在于此,至少不僅在于此。完全沒有頭緒的我開始來回翻看參考手冊,突然發(fā)現(xiàn) SDIO 一章幾乎每個寄存器下都有這樣一句話:

經(jīng)過查看,只有 __SDIO_OPERATION_ENABLE 和 __SDIO_DMA_ENABLE 在短時間內(nèi)連續(xù)寫入同一寄存器,而之前的?SDIO 中斷配置恰好將這段間隔補上了——這也解釋了為什么不能等到調(diào)用?CMD53 時再啟用 DMA。

解決方法很簡單,同時寫入即可:
這件事告訴我們,遇到問題時數(shù)據(jù)手冊和參考手冊比網(wǎng)絡搜索有用多了,當然也別忘記查看庫函數(shù)實現(xiàn)!
參考手冊內(nèi)容摘自:https://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf

插個題外話,為什么要關注庫函數(shù)實現(xiàn)呢?看看遠處的?stm32f4xx_ll_sdmmc.h 吧家人們:
__SDIO_GET_IT 后面的空格直接改變了宏定義,在不修改庫函數(shù)的前提下只能使用?__SDIO_GET_FLAG 代替,強迫癥震怒。
最后,小聲罵一句:GPIO 模擬薄紗若至硬件 I2C!