Setemefah + FatFs = FR_NOT_READY
STM32F7 + FatFs = FR_NOT_READY
我现在使用的是 CubeMx 4.23.0 和 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(强制挂载)的情况下,输出为:
- f_mount = 0x03
- f_open = 0x01
0(现在不挂载)输出为:
- f_mount = 0x00
- f_open = 0x03
0x03 值为 FR_NOT_READY,但官方信息对此非常模糊
我尝试过的事情:
- Adding HAL_SD_Init(&hsd1) to MX_SDMMC1_SD_Init() since i didnt find where is SD card GPIO init happening.
- 2 GB noname SD card, 1 GB Transcend card.
- Different hsd1.Init.ClockDiv 3 to 255.
- Resoldering everything completely.
- Switching to 4-bit wide bus using HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B);
- Turn on and off pullups.
但是卡还是挂不上。它是 FAT 格式的,在 PC 上工作,我试图打开的文件存在,但是是空的。
如何挂载?
提前致谢!
尝试评论 MX_USB_DEVICE_Init()
,看看会发生什么。
cubemx 的确切版本存在问题。
更新 stm32cubemx 有帮助。
你可以试试
`f_mount(0, "path", 0);
` 在 f_open 调用之后。它可能会起作用。
如果强制挂载函数失败 FR_NOT_READY,这意味着文件系统对象已成功注册,但
volume is currently not ready to work
。将在后续 file/directroy 函数中尝试卷安装过程。
如果磁盘 I/O 层的实现缺少异步媒体更改检测,应用程序需要在每次媒体更改后执行 f_mount 功能以强制清除文件系统对象。
根据This Topic将除SDIO_CK以外的所有SDIO引脚改为上拉对我有效
我现在使用的是 CubeMx 4.23.0 和 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(强制挂载)的情况下,输出为:
- f_mount = 0x03
- f_open = 0x01
0(现在不挂载)输出为:
- f_mount = 0x00
- f_open = 0x03
0x03 值为 FR_NOT_READY,但官方信息对此非常模糊
我尝试过的事情:
- Adding HAL_SD_Init(&hsd1) to MX_SDMMC1_SD_Init() since i didnt find where is SD card GPIO init happening.
- 2 GB noname SD card, 1 GB Transcend card.
- Different hsd1.Init.ClockDiv 3 to 255.
- Resoldering everything completely.
- Switching to 4-bit wide bus using HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B);
- Turn on and off pullups.
但是卡还是挂不上。它是 FAT 格式的,在 PC 上工作,我试图打开的文件存在,但是是空的。
如何挂载? 提前致谢!
尝试评论 MX_USB_DEVICE_Init()
,看看会发生什么。
cubemx 的确切版本存在问题。 更新 stm32cubemx 有帮助。
你可以试试
`f_mount(0, "path", 0);
` 在 f_open 调用之后。它可能会起作用。 如果强制挂载函数失败 FR_NOT_READY,这意味着文件系统对象已成功注册,但
volume is currently not ready to work
。将在后续 file/directroy 函数中尝试卷安装过程。
如果磁盘 I/O 层的实现缺少异步媒体更改检测,应用程序需要在每次媒体更改后执行 f_mount 功能以强制清除文件系统对象。
根据This Topic将除SDIO_CK以外的所有SDIO引脚改为上拉对我有效