【发布时间】:2019-06-03 02:47:13
【问题描述】:
我尝试通过 FatFS+SDIO 接口将 1bit 模式的 SD 卡连接到 Stm32l4。 CubeMX 5.0 自动生成的代码。在 Cube 中启用和配置 DMA。 当我调用像 f_mount() 或 f_open() 这样的 FatFS 函数时,我得到 FR_DISK_ERR 返回语句。 DMA_Timeout 的低级别读取返回。请帮帮我。
【问题讨论】:
我尝试通过 FatFS+SDIO 接口将 1bit 模式的 SD 卡连接到 Stm32l4。 CubeMX 5.0 自动生成的代码。在 Cube 中启用和配置 DMA。 当我调用像 f_mount() 或 f_open() 这样的 FatFS 函数时,我得到 FR_DISK_ERR 返回语句。 DMA_Timeout 的低级别读取返回。请帮帮我。
【问题讨论】:
因此,首先,您可能应该查看 ST 的文档,了解如何准确地让进程树与 SD 卡一起移动。我知道使用 USB,您必须调用主机进程并等待主机状态处于活动状态,然后才能进行任何 FATFS 调用。确保你在等待硬件中断触发存在。
类似的效果,只要确保SD没有挂载的情况下有一个超时参数即可。
// stateOfHost will change depending on the cube generated code, but it should be somewhere in the SD Card code
extern ApplicationTypeDef stateOfHost;
// Set the default state to idle
ApplicationTypeDef stateOfHost = APPLICATION_IDLE;
while(1)
{
// Start USB Host Process
MX_USB_HOST_PROCESS();
if(stateOfHost == HOST_USER_CLASS_ACTIVE)
{
// FATFS Can now be called
}
}
如果在那之后所有其他方法都失败了,这可能听起来有点奇怪,但请尝试增加默认堆栈大小。出现 DMA 超时,因为未调用磁盘的回调。没有要填写的数据。尝试通过 FATFS 的这种实现进行调试是一场噩梦。
如果堆栈大小未增加到超过默认设置 0x400,则 USB OTG 和 SD 卡 FATFS 第三方中间件会出现问题。
在文件 startup_stm32l4(xx)xx.s 内部(括号中的两个 x 代表您的 L4 变体),将堆栈大小更改为合适的值。首先,尝试 0x1000。
我遇到了类似的问题,需要将堆栈大小增加到 0x3000 才能让我的 USB 正常工作。
如果 SD 被识别,请确保创建变量来跟踪您的所有 FATFS 调用,以确保整个过程是成功的。
要通过 FATFS 读取,您必须: 1.挂载工作区(f_Mount) 2.打开一个文件(f_open) 3.读取文件打开(f_read)
写入操作完全相同,只是与读取调用交换。
希望这会有所帮助。
【讨论】: