Сейчас я использую CubeMx 4.23.0 и пакет FW для STM32F7 1.8.0. MCU - STM32F746 на плате Core746i. Все создается 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, но официальная информация об этом довольно расплывчата
Вещи, которые я пробовал:
- Добавление HAL_SD_Init (& hsd1) в MX_SDMMC1_SD_Init (), так как я не нашел, где происходит инициализация GPIO SD-карты.
- SD-карта noname на 2 ГБ, карта Transcend 1 ГБ.
- Разные hsd1.Init.ClockDiv от 3 до 255.
- Перепаял все полностью.
- Переключение на 4-битную шину с помощью HAL_SD_ConfigWideBusOperation (& hsd1, SDMMC_BUS_WIDE_4B);
- Включение и выключение подтягиваний.
Но карта по-прежнему не монтируется. Он отформатирован в FAT, работает на ПК, файлы, которые я пытался открыть, существуют, но пусты.
Как заставить его смонтировать? Заранее спасибо!