stm32 sdio acmd41 无响应。一直是返回0x3f。解决方法是清除crc错误中断
生活随笔
收集整理的這篇文章主要介紹了
stm32 sdio acmd41 无响应。一直是返回0x3f。解决方法是清除crc错误中断
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.163.com/dreamatic_altezza/blog/static/119304542013112932216498/
首先我來說說初始化sdhc卡(sdsc卡acmd41參數為0x00ff8000)的流程: cmd0 無參數 返回0x00 0x00 cmd8 參數0x1aa 返回0x8 0x1aa cmd55 無參數 返回0x37 0x120 acmd41 參數0x40ff8000 返回0x3f 0x40ff8000 cmd55 無參數 返回0x37 0x120 acmd41 參數0x40ff8000 返回0x3f 0xc0ff8000 (sd卡OCR bit[31] busy位置1 卡進入ready status)
但在實際使用stm32的過程中,我們會遇到發送完第一個acmd41后,返回就一直是0x3f 0x40ff8000。即使是再發送cmd55也是0x3f 0x40ff8000。這不是sd卡不響應,而是stm32的sdio監測到crc錯誤,不再發送命令了。
這是由于sd規范中,Acmd41返回的crc永遠是11111,也就是應該忽略crc,但是Stm32的sdio卻檢查了crc,就出錯了。
為了使crc錯誤后的sdio恢復正常我們可以使用sdio庫函數來清除crc標志位,代碼如下: SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); SDIO_ClearITPendingBit(SDIO_IT_CCRCFAIL);
以下是我寫的cmd55+acmd41循環: 測試用的,請勿就糾結代碼的效率。
希望能夠被sd初始化困擾的朋友帶來曙光!
for(k=0;k<800;k++) {
SDIO_CmdInitStructure.SDIO_Argument = 0x00; SDIO_CmdInitStructure.SDIO_CmdIndex = 0x37; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; SDIO_SendCommand(&SDIO_CmdInitStructure);
for(i=0;i<2000;i++)//發送完命令需要延時才能獲取sd卡的反饋 {
} ?? d5=SDIO_GetCommandResponse();//等待返回 返回是63 d1=SDIO_GetResponse(SDIO_RESP1);//16gb卡返回0x40200000;16gb卡返回0x00ff8000 d2=SDIO_GetResponse(SDIO_RESP2); d3=SDIO_GetResponse(SDIO_RESP3); d4=SDIO_GetResponse(SDIO_RESP4); ? d3=SDIO_GetITStatus(SDIO_IT_CCRCFAIL ); d4=SDIO_GetFlagStatus(SDIO_FLAG_CCRCFAIL); SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); SDIO_ClearITPendingBit(SDIO_IT_CCRCFAIL); d3=SDIO_GetITStatus(SDIO_IT_CCRCFAIL ); d4=SDIO_GetFlagStatus(SDIO_FLAG_CCRCFAIL); // ? SDIO_CmdInitStructure.SDIO_Argument = 0x40ff8000;//16gb卡用0x40000000;2gb用0x00000000 SDIO_CmdInitStructure.SDIO_CmdIndex = 0x29; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; SDIO_SendCommand(&SDIO_CmdInitStructure); for(i=0;i<2000;i++)//發送完命令需要延時才能獲取sd卡的反饋 {
} d5=SDIO_GetCommandResponse();//等待返回 返回是63
d1=SDIO_GetResponse(SDIO_RESP1);//16gb卡返回0x40ff8000;16gb卡返回0x00ff8000 d2=SDIO_GetResponse(SDIO_RESP2); d3=SDIO_GetResponse(SDIO_RESP3); d4=SDIO_GetResponse(SDIO_RESP4); for(i=0;i<5000;i++)//發送完命令需要延時才能獲取sd卡的反饋 {
} d3=SDIO_GetITStatus(SDIO_IT_CCRCFAIL ); d4=SDIO_GetFlagStatus(SDIO_FLAG_CCRCFAIL); SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); SDIO_ClearITPendingBit(SDIO_IT_CCRCFAIL); d3=SDIO_GetITStatus(SDIO_IT_CCRCFAIL ); d4=SDIO_GetFlagStatus(SDIO_FLAG_CCRCFAIL); }
總結
以上是生活随笔為你收集整理的stm32 sdio acmd41 无响应。一直是返回0x3f。解决方法是清除crc错误中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移植fatfs上电复位前两次不能正确打开
- 下一篇: SD卡读写流程