STM32 + FatFS + SDIO + CubeMX

时间:2019-01-08 11:54:26

标签: stm32 fatfs cubemx

我试图通过FatFS + SDIO接口将1bit模式的SD卡连接到Stm32l4。 由CubeMX 5.0自动生成的代码。在多维数据集中启用和配置了DMA。 当我像f_mount()或f_open()那样调用FatFS函数时,会得到 FR_DISK_ERR 返回语句。低电平读取返回的时间为 DMA_Timeout 。请帮帮我。

1 个答案:

答案 0 :(得分: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)x​​x.s内(括号中的两个x表示L4的变体),将堆栈大小更改为合适的大小。首先,尝试0x1000。

我遇到了类似的问题,需要将堆栈大小增加到0x3000才能使USB正常工作。

如果能够识别SD,请确保创建变量以跟踪所有FATFS调用,以确保整个方法成功。

要通过FATFS进行读取,您必须: 1.挂载工作区(f_Mount) 2.打开一个文件(f_open) 3.读取打开的文件(f_read)

写操作完全相同,只是与read调用交换了。

希望这会有所帮助。