我试图通过 FatFS+SDIO 接口将 1bit 模式的 SD 卡连接到 Stm32l4。CubeMX 5.0 自动生成的代码。在 Cube 中启用和配置 DMA。当我调用像 f_mount() 或 f_open() 这样的 FatFS 函数时,我得到FR_DISK_ERR返回语句。低电平读取由DMA_Timeout返回。请帮我。
1 回答
因此,首先,您可能应该查看 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)
写入完成完全相同,只是与读取调用交换。
希望这会有所帮助。