Cube+SDIO+FATFS使用时SD卡读块卡死问题!!
本帖最后由 adlu 于 2016-3-26 15:09 编辑MCU型号:STM32F407ZET6开发软件:STM32CubeMX V4.11,MDK V5
使用STM32CubeMX配置生成程序框架,使用SDIO 4bit模式操作SD卡,并配置了使用FATFS。截图如下
SDIO时钟分频系数为2,即SDIO_CK=48MHz/(2+2)=12MHz.SDIO其他配置默认。FATFS配置,仅改变CODE_PAGE为简体中文,其他默认。
问题描述:SD卡读写操作时,经常出现卡死的情况。通过J-Link调试,发现卡死时程序在HAL_SD_ReadBlocks()函数的两个语句之间来回运行,如下图。
/* Read block(s) in polling mode */
if(NumberOfBlocks > 1)
{
。。。
}
else
{
/* Check for error conditions */
errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
if (errorstate != SD_OK)
{
return errorstate;
}
/* In case of single block transfer, no need of stop transfer at all */
#ifdef SDIO_STA_STBITERR
while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) /*卡在此句1*/
#else /* SDIO_STA_STBITERR not defined */
while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
#endif /* SDIO_STA_STBITERR */
{
if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) /*卡在此句2*/
{
/* Read data from SDIO Rx FIFO */
for (count = 0; count < 8; count++)
{
*(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
}
tempbuff += 8;
}
}
}
降低SDIO的时钟或配置为1bit模式,也无法避免该现象的发生。
请高人指点迷津!!
adlu 发表于 2016-3-30 18:21
已经解决。
CubeMX生成的代码SDIO polling模式可能真的有问题。
配置SDIO使用DMA模式,SDIO_RX和SDIO_TX配 ...
找到while(hsd->SdTransferCplt == 0)这个语句并屏蔽....
你的SDIO global interrupt的优先级是多少? SDIO的Tx,Rx的DMA的中断优先级又是多少?
我也碰到你的问题,但我将SDIO global interrupt的优先级设置为小于或等于SDIO的Tx,Rx的DMA的中断优先级后,问题好像解决了。 参考 https://www.stmcu.org.cn/module/forum/thread-604576-1-1.html
,看能不能帮助你...
power568 发表于 2016-3-26 15:45
参考 https://www.stmcu.org.cn/module/forum/thread-604576-1-1.html
,看能不能帮助你...
这个贴我看过,只是讲SD卡读写的基本操作。这部分操作我已经实现,包括FATFS对文件的读和写操作。
而且已经实现文件的读取,创建,写入,保存,删除等操作。
我遇到的问题是:很容易卡死在上面贴出的那两行代码中。 明白,好像是什么状态不满足时卡死了,有没有可能是硬件原因,如信号不稳定等... 本帖最后由 adlu 于 2016-3-30 18:22 编辑
问题已解决。
本帖最后由 adlu 于 2016-3-30 18:23 编辑
已经解决。
CubeMX生成的代码SDIO polling模式可能真的有问题。
配置SDIO使用DMA模式,SDIO_RX和SDIO_TX配置相同。
生成代码,然后需要手动修改部分代码。
1.如果是用CubeMX 4.11及更早版本的,要修改stm32f4xx_hal_msp.c中HAL_SD_MspInit( )函数的两个DMA配置参数,将DMA_NORMAL改为DMA_PFCTRL。
2.修改sd_diskio.c中SD_read( )和SD_write( )函数,
分别将BSP_SD_ReadBlocks( )改为BSP_SD_ReadBlocks_DMA( );
将BSP_SD_WriteBlocks( )改为BSP_SD_WriteBlocks_DMA( ).
3.全局搜索SdTransferCplt变量,找到while(hsd->SdTransferCplt == 0)这个语句并屏蔽,否则会卡死在词句,我也不知道为什么。
经过上述步骤,就可以顺利的使用SDIO DMA功能进行SD卡读写了。
配合CubeMX生成的FATFS架构,就可以进行SD卡的文件操作了。目前未发现其他问题。
估计F103可以用来参考。先谢谢经验分享! 按照您的方法没有解决呢 谢谢分享!!!
页:
[1]
2