STM32
直播中

张览秀

7年用户 1170经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

STM32H723 SD卡一旦挂载失败,后续无法继续挂载,怎么解决?

运行环境: STM32H723+TCP服务端+SDMMC+FATFS文件系统+其它
SD卡挂载卸载方式:MCU运行后通过网口发送命令到MCU对SD卡进行挂载和卸载
问题现象: 将SD卡移除后使用挂载命令出现失败(正常),插上SD卡后继续使用挂载命令还是挂载失败(不正常)
问题分析: 一旦挂载失败,后续无法继续挂载,可能和挂载失败的第一次有关,寻找第一次挂载出现了什么。
由于第一次挂载失败是因为没有插SD卡,这个时候必然会挂载失败。挂载SD卡属于FATFS文件系统的操作,但是在挂载时它会调用底层的驱动,用来初始化底层驱动SD卡的硬件外设及SD卡。
对比有SD卡正常挂载、无SD卡失败挂载、然后插上SD卡的失败挂载三种情况下的disk和hsd1全局变量的变化及差异。
正常挂载时,无问题
无卡挂载失败时,在执行errorstate = SD_PowerON(hsd)函数返回错误,后续代码全部跳出不执行,且hsd->ErrorCode被置为错误代码HAL_SD_ERROR_UNSUPPORTED_FEATURE,0x10000000。
失败后插卡重新挂载时,在执行if (HAL_SD_ConfigWideBusOperation(hsd, hsd->Init.BusWide) != HAL_OK)时出错,跳转进去进一步分析,发现:
if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
{
/ Clear all the static flags /
__HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
status = HAL_ERROR;}
该代码判断到了在无卡挂载时保存的错误代码,导致HAL_SD_ConfigWideBusOperation返回了HAL_ERROR错误,最终导致初始化报错,无法继续执行后续的初始化及文件系统挂载。
所以,在进行HAL_SD_Init前将hsd1.ErrorCode错误信息清除在进行后续的初始化操作即可。
hsd1.ErrorCode = 0;
/ HAL SD initialization /
sd_state = HAL_SD_Init( hsd1);
同时,发现在调用底层初始化时做了个判断,初始化过后不在进行初始化,这样就会出现一个问题,如果SD卡插拔了,下次挂载就要初始化SD卡,所以这个逻辑改为,初始化成功就置一initialized,否则清零initialized
DSTATUS disk_initialize (BYTE pdrv        )    / Physical drive nmuber to identify the drive /
{
DSTATUS stat = RES_OK;
if(disk.is_initialized[pdrv] == 0)
{
disk.is_initialized[pdrv] = 1;stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
}
return stat;
}
改为
DSTATUS disk_initialize (BYTE pdrv)                 / Physical drive nmuber to identify the drive /
{
DSTATUS stat = RES_OK;
stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
if(stat == 0) disk.is_initialized[pdrv] = 1;
else disk.is_initialized[pdrv] = 0;
return stat;
}



回帖(1)

赵敏

2024-5-30 16:04:41
要解决STM32H723 SD卡挂载失败的问题,我们可以分为以下几个步骤:

1. 确保硬件连接正确:首先检查STM32H723与SD卡之间的硬件连接是否正确,包括数据线和电源线。确保SD卡插槽与SD卡的接触良好。

2. 初始化SDMMC驱动:在挂载SD卡之前,确保已经正确初始化了SDMMC驱动。这包括配置SDMMC时钟、电源、命令和数据线路等。

3. 检查SD卡检测机制:确保在挂载SD卡之前,已经正确实现了SD卡检测机制。这可以通过检测SD卡插入时的信号或者使用外部中断来实现。当检测到SD卡插入时,再进行挂载操作。

4. 重置SD卡状态:在挂载失败后,尝试重置SD卡的状态。这可以通过发送SDMMC的CMD0命令(GO_IDLE_STATE)来实现。这样可以确保SD卡处于初始状态,便于后续操作。

5. 重新初始化SD卡:在重置SD卡状态后,重新初始化SD卡。这包括发送SDMMC的ACMD41命令(SEND_OP_COND)来设置SD卡的电压范围和频率,以及发送CMD2(ALL_SEND_CID)和CMD3(SEND_RELATIVE_ADDR)命令来获取SD卡的CID和RCA。

6. 重新挂载SD卡:在完成SD卡初始化后,再次尝试挂载SD卡。此时,如果硬件连接和驱动配置正确,挂载操作应该可以成功。

7. 调试和日志记录:如果问题仍然存在,建议添加调试信息和日志记录,以便更好地了解问题所在。这可以帮助你发现潜在的问题,例如驱动配置错误、硬件故障等。

8. 考虑使用其他方法:如果以上方法都无法解决问题,可以考虑使用其他方法来挂载SD卡,例如使用不同的驱动库或者更换SD卡。

通过以上步骤,你应该能够解决STM32H723 SD卡挂载失败的问题。如果问题仍然存在,请仔细检查硬件连接和驱动配置,或者寻求专业人士的帮助。
举报

更多回帖

×
20
完善资料,
赚取积分