stm32stm32f7fatfscubemx

STM32F7 + FatFs = FR_NOT_READY


I am now using CubeMx 4.23.0 and FW package for STM32F7 1.8.0 MCU is STM32F746 on Core746i board. Everything is generated by CubeMx automatically.

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
            }

In case of f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) <- with 1 here (forced mount), output is:

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

With 0 (do not mount now) output is:

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

0x03 value is FR_NOT_READY, but official info is pretty vague about it

Things I've tried:

  1. Adding HAL_SD_Init(&hsd1) to MX_SDMMC1_SD_Init() since i didnt find where is SD card GPIO init happening.
  2. 2 GB noname SD card, 1 GB Transcend card.
  3. Different hsd1.Init.ClockDiv 3 to 255.
  4. Resoldering everything completely.
  5. Switching to 4-bit wide bus using HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B);
  6. Turn on and off pullups.

But card still does not mount. It's formatted in FAT, working on a PC, files i've tried to open are exist, but empty.

How to get it to mount? Thanks in advance!


Solution

  • there was the problem with exact version of cubemx. updating stm32cubemx helped.