cancel
Showing results for 
Search instead for 
Did you mean: 

FR_DISK_ERROR always is returned by f_open.

Ali Esmailpor
Associate III

Hi all.

My team has been working on a project that contains a SD card based on Standard Library. Recently we've decided to migrate to HAL and it started.

Fortunately, All part of our project were changed as well as possible to HAL and they're working great but we don't know why SD card doesn't work well.

We have not changed peripheral's configuration clocks, but we had to change "clock frequency of the SDMMC controller" to 1.5MHz in HAL while it was 24MHz in STDLibrary. Because, it didn't work at all.

In addition, our customers are using a wide range of SD card types and all of them are OK but not great. I mean, FR_DISK_ERR is returned a lot in during of working but our device tries to get FR_OK.

Unfortunately, we always receive FR_DISK_ERR in some SD cards while, it worked all the time in our STDLibrary version.

Furthermore, we've found if "f_mount" function was called once and after that you take away the SD card and put it again, it will never work until you reset your microcontroller.

My microcontroller is STM32F427VI and SDIO configured as same as this:

 hsd.Instance = SDIO;

 hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;

 hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;

 hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;

 hsd.Init.BusWide = SDIO_BUS_WIDE_1B;

 hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;

 hsd.Init.ClockDiv = 14;

and it's working with 4bits wide bus.

Also, my device's clock is 96MHz and "APB2 Peripheral Clock" is 48MHz.

Edited (2020/02/24):

Finally, it worked when I updated my HAL Library to STM32Cube_FW_F4_V1.24.2. But HAL still doesn't work as well as Standard Peripheral. For example, I can't set 'ClockDiv' to '0' (24MHz) yet. It doesn't work at all. Now I set 'ClockDiv' to '1' (16MHz) that's not good enough for my project but I have to. Or if you take SDCard away and insert it again when program is working you can not init FATFS with f_mount. It's not going to work at all. You have to init SDIO Peripheral again by yourself. Unfortunately, now I can't put any time for getting more detail about what's going on in my schedule. Maybe in future.

32 REPLIES 32

Thank you for this amazing tip and sharing it. I'm going to test it tomorrow. I really needed this.

Ayuks.1
Associate II

thank you brother . you are big man. solved my problem. Allah bless you

I had a same problem when I re-inserting the card and you have the MASTER SOLUTION THX! 
I used SD_PowerOn() and SD_disk_initialize(0) (as a generic number) thx