FR_DISK_ERROR 总是由 f_open 返回

Posted

技术标签:

【中文标题】FR_DISK_ERROR 总是由 f_open 返回【英文标题】:FR_DISK_ERROR always is returned by f_open 【发布时间】:2020-04-27 23:31:26 【问题描述】:

我的团队一直在处理一个包含基于标准库的 SD 卡的项目。最近我们决定迁移到 HAL 并开始了。

幸运的是,我们项目的所有部分都尽可能地更改为 HAL,它们运行良好,但我们不知道为什么 SD 卡不能正常运行。

我们没有更改外设的配置时钟,但我们必须在 HAL 中将“SDMMC 控制器的时钟频率”更改为 1.5MHz,而在 STDLibrary 中为 24MHz。因为,它根本不起作用。

此外,我们的客户正在使用多种 SD 卡类型,所有这些都可以,但不是很好。我的意思是,FR_DISK_ERR 在工作期间返回了很多,但我们的设备试图获取FR_OK

不幸的是,我们总是在某些 SD 卡中收到FR_DISK_ERR,而它在我们的 STDLibrary 版本中一直有效。

此外,我们发现如果“f_mount”函数被调用一次,然后您将 SD 卡取出并重新放入,它将永远无法工作,直到您重置您的微控制器。

我的微控制器 STM32F427VISDIO 配置如下:

 hsd.Instance = SDIO;

 hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;

 hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;

 hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;

 hsd.Init.BusWide = SDIO_BUS_WIDE_1B;

 hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;

 hsd.Init.ClockDiv = 14;

它适用于 4 位宽的总线。

另外,我设备的时钟是 96MHz,“APB2 外设时钟”是 48MHz。

已编辑:

至于重新插入卡 - 当 f_open 返回 FR_DISK_ERR 时,我通过调用 f_mount 再次进行了初始化。我一直这样做直到给FR_OK,但在这种情况下它从未返回FR_OK

我意识到 f_mount 没有像亲爱的 Jacek Ślimok 所说的那样第二次初始化 SDIO。

因为有一个标志不允许再次调用“SD_initialize”(SD_initialize 函数包括 BSP_SD_Init)。

这是 diskio.c 的代码:

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;


现在我在调用 f_mount 之前使用了 SD_PowerONSD_InitCard,现在它可以正常工作了。 这是一个错误,不是吗? ????

但其他问题仍然存在。它根本不适用于 24MHz 时钟,并且某些 SD 卡仍会返回 FR_DISK_ERR

已编辑(2020 年 2 月 24 日):

最后,当我将我的 HAL 库更新到 STM32Cube_FW_F4_V1.24.2 时,它起作用了。但是 HAL 仍然不如标准外设好用。例如,我还不能将“ClockDiv”设置为“0”(24MHz)。它根本不起作用。现在我将“ClockDiv”设置为“1”(16MHz),这对我的项目来说还不够好,但我必须这样做。或者,如果您将 SDCard 拿走并在程序运行时再次插入,您将无法使用 f_mount 初始化 FATFS。它根本行不通。您必须自己重新初始化 SDIO Peripheral。不幸的是,现在我没有时间详细了解我的日程安排。也许在未来。

【问题讨论】:

至于重新插入卡 - 那是因为它需要再次初始化,然后f_mount-ed。通过初始化,我并不是指 GPIO / DMA 初始化(您可能会忽略它并摆脱它),而是在插入卡后但在挂载文件系统之前需要再次发送到卡的 SD 命令。特别是 - 请参阅 HAL_SD_InitCard 和内部发送 SD 命令的函数 - 主要是 SD_PowerONSD_InitCard 相关:community.st.com/s/question/0D50X0000BEZwxPSQT/… 在社区中,他们说这种方法可以解决类似的问题:community.st.com/s/question/0D50X00009XkWceSAF/… 谢谢,但我已经完成了他们所说的一切。 @AliEsmailpor,看到这些链接可能相关。 ***.com/questions/51100378/…***.com/questions/33681083/… 【参考方案1】:

disk.is_initialized[0] =0; // 强制重新初始化

安装前。这是支持热插拔 sd 卡的简单方法。

【讨论】:

以上是关于FR_DISK_ERROR 总是由 f_open 返回的主要内容,如果未能解决你的问题,请参考以下文章

emwin f_open用法

python 学习分享-文件操作篇

输出是不是总是由 C 中的内联汇编中的 %eax 寄存器确定?

(数据结构判断题)在SQL的嵌套查询中,查询操作的次序总是由里向外(判断正误,并说明理由给出解释)

为啥这个回调中的条件总是返回false?

FATFs怎样重复打开文件写内容?