STM32F7 + FatFs = FR_NOT_READY

时间:2018-07-23 19:15:15

标签: stm32 stm32f7 fatfs cubemx

我现在将CubeMx 4.23.0和FW软件包用于STM32F7 1.8.0 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(强制安装),输出为:

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

具有0(现在不挂载)的输出是:

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

0x03的值为FR_NOT_READY,但是官方信息对此却含糊不清

我尝试过的事情:

  
      
  1. 将HAL_SD_Init(&hsd1)添加到MX_SDMMC1_SD_Init(),因为我没有发现SD卡GPIO初始化发生在哪里。
  2.   
  3. 2 GB noname SD卡,1 GB Transcend卡。
  4.   
  5. hsd1.Init.ClockDiv 3到255不同。
  6.   
  7. 完全解决所有问题。
  8.   
  9. 使用HAL_SD_ConfigWideBusOperation(&hsd1,SDMMC_BUS_WIDE_4B)切换到4位宽总线;
  10.   
  11. 打开和关闭上拉。
  12.   

但是卡仍未安装。它以FAT格式格式化,可以在PC上运行,我尝试打开的文件存在,但为空。

如何安装它? 预先感谢!

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以尝试

  

`f_mount(0,“ path”,0);

在f_open调用后

`。它可能会起作用。 如果强制安装的函数因FR_NOT_READY而失败,则表明文件系统对象已成功注册,但

  

该卷目前尚无法正常工作

。将在后续的文件/目录功能上尝试卷安装过程。

如果磁盘I / O层的实现缺少异步媒体更改检测,则应用程序需要在每次媒体更改后强制清除文件系统对象来执行f_mount功能。

答案 2 :(得分:0)

将{SD3_CK以外的所有SDIO引脚更改为This Topic上拉对我来说是有效的

答案 3 :(得分:-1)

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