【问题标题】:STM32F7 + FatFs = FR_NOT_READYSTM32F7 + FatFs = FR_NOT_READY
【发布时间】:2018-12-31 07:35:07
【问题描述】:

我现在正在为 STM32F7 1.8.0 使用 CubeMx 4.23.0 和 FW 包 MCU是Core746i板上的STM32F746。 一切都是 CubeMx 自动生成的。

main.c:

    SCB_EnableICache();
    SCB_EnableDCache();
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SDMMC1_SD_Init();
    MX_USB_DEVICE_Init();
    MX_FATFS_Init();

    HAL_Delay(3000);
    DebugString("start OK");

    uint8_t res = 0;
    FATFS SDFatFs;  
    FIL MyFile;     /* File object */
    char SD_Path[4]; 

    res = f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0);
    sprintf(DebugStr, "f_mount = 0x%02X", res);
    DebugString(DebugStr);

    res = f_open(&MyFile, "test.txt", FA_READ);
    sprintf(DebugStr, "f_open = 0x%02X", res);
    DebugString(DebugStr);

sdmmc.c:

void MX_SDMMC1_SD_Init(void)
    {

      hsd1.Instance = SDMMC1;
      hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
      hsd1.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
      hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
      hsd1.Init.BusWide = SDMMC_BUS_WIDE_1B;
      hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
      hsd1.Init.ClockDiv = 7;

   //HAL_SD_Init(&hsd1);
   // ^^^^^ I also tried this here
   //HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B)
   //^^^^ and this
            }

如果是 f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0)

  1. f_mount = 0x03
  2. f_open = 0x01

使用 0(现在不要挂载)输出为:

  1. f_mount = 0x00
  2. f_open = 0x03

0x03 的值是 FR_NOT_READY,但官方信息很模糊

我尝试过的事情:

  1. 将 HAL_SD_Init(&hsd1) 添加到 MX_SDMMC1_SD_Init() 因为我没有找到 SD 卡 GPIO 初始化发生在哪里。
  2. 2 GB 无名 SD 卡,1 GB Transcend 卡。
  3. 不同的 hsd1.Init.ClockDiv 3 到 255。
  4. 全部重新焊接。
  5. 使用 HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) 切换到 4 位宽总线;
  6. 打开和关闭引体向上。

但是卡仍然没有挂载。它以 FAT 格式格式化,在 PC 上运行,我尝试打开的文件存在,但为空。

如何让它挂载? 提前致谢!

【问题讨论】:

  • 您尝试打开的文件存在吗? “test.txt”是否存在?即使挂载失败?您收到 FR_NOT_READY 是因为 1. 硬件级别有问题,请检查 FAT-FS 引脚是否已映射 2. 未找到 FAT。但你说你已经检查过这些。请尝试像 f_mount(fs, "", 0);即以路径作为根路径安装。我不确定你是否传递了一个空字符数组。
  • 检查代码中的硬件映射。测试 f_mount(fs, "", 0);如果这也失败了,说明你的硬件有问题。

标签: stm32 stm32f7 fatfs cubemx


【解决方案1】:

尝试评论MX_USB_DEVICE_Init(),看看会发生什么。

【讨论】:

  • 您能详细说明一下吗?为什么这可以解决问题?
  • 这将如何解决问题? USB 和 FATFS 完全不相关!由于它是使用 CubeMX OP 生成的,因此可能没有正确配置 SPI 引脚。
【解决方案2】:

cubemx 的确切版本存在问题。 更新 stm32cubemx 有帮助。

【讨论】:

    【解决方案3】:

    你可以试试

    `f_mount(0, "路径", 0);

    ` 在 f_open 调用之后。它可能会起作用。 如果强制挂载函数失败并返回FR_NOT_READY,说明文件系统对象已经注册成功,但是

    音量当前尚未准备好工作

    。卷挂载过程将在后续文件/目录功能上尝试。

    如果磁盘 I/O 层的实现缺少异步介质变化检测,应用程序需要在每次介质变化后执行 f_mount 函数来强制清除文件系统对象。

    【讨论】:

      【解决方案4】:

      根据This Topic 将除 SDIO_CK 之外的所有 SDIO 引脚更改为上拉对我有用

      【讨论】:

        猜你喜欢
        • 2019-07-31
        • 2020-05-20
        • 2022-08-18
        • 2016-10-20
        • 2019-06-03
        • 1970-01-01
        • 2016-07-14
        • 2020-01-29
        • 2018-08-04
        相关资源
        最近更新 更多