bug

stm32cube sdio 初始化 低版本SD卡 bug

使用stm32cube(V5.2.1)生成的keil5(V5.25.2.0)工程,固件为STM32Cube_FW_F4_V1.24.1,硬件为stm32f407zet,使用自带的sdio驱动,执行时报错,无法找到SD卡,不能读取容量等信息。

debug显示在执行HAL_SD_ConfigWideBusOperation()时出错,实际上前一步执行HAL_SD_Init()时已经出错了。

深入调试发现,HAL_SD_Init()->HAL_SD_InitCard()->SD_PowerON()内部,会依次执行CMD0复位、CMD8判断SD2.0、ACMD41读取条件。debug显示执行ACMD41时,先发CMD55,此时报响应超时错误,导致后续步骤全部跳过,最后却返回了HAL_SD_ERROR_NONE,误导调试。

使用示波器观察发现,发送CMD55时,SD卡有正常响应,MCU却未能识别?多方调试发现,是执行CMD8判断SD2.0时,清除错了标志,导致执行CMD55时,超时标志仍然有效。我的SD卡版本低于SD2.0,MCU执行CMD8时,SD卡不会响应,导致置位SDIO_FLAG_CTIMEOUT,判断不是SD2.0时应清除此位,却清除了SDIO_FLAG_CMDREND(此处注释也有错误),故而后续全部错误。

image.png

解决方法是修改stm32f4xx_ll_sdmmc.c第1455行SDIO_FLAG_CMDREND->SDIO_FLAG_CTIMEOUT,即可。


另外,后续执行CMD55收到响应后,MCU还会判断响应数据内容,只要不是全0就会报其他错误。我的SD卡收到CMD55后返回了一串非零数字,又初始化不过了。这里直接在stm32f4xx_ll_sdmmc.c第1198行添加return SDMMC_ERROR_NONE,不影响后续判断。

image.png


此错误浪费本人(ID: lijuqiang000)3天时间,更新多个库文件,及更新最新的cube都无法解决。最后参考着taobao给的例程和示波器才确定了问题,望遇到此问题的程序猿早早搜到此贴,少浪费时间和精力。


已邀请:

李树兵

赞同来自:

太棒了

Zibet

赞同来自:

太厉害了!!!!成功解决了我的问题

关于第二个,我的做法是屏蔽了其中一个错误,就好了,在1196行这么改的


  /* Clear all the static flags */

  __SDIO_CLEAR_FLAG(SDIOx, SDIO_STATIC_FLAGS);

  

  /* We have received response, retrieve it for analysis  */

  response_r1 = SDIO_GetResponse(SDIOx, SDIO_RESP1);

  response_r1 &= !SDMMC_OCR_ILLEGAL_CMD;


要回复问题请先登录注册