Приветствую коллеги!
Возникла надобность поработать с FAT32 на STM32.
Имеется демо плата TE-STM32F103:
TE-STM32F103
Две micro SDCH каждая по 4Гб, Kingston и QUMO. Класс 4.
Для реализации низкоуровневого драйвера я использовал поставляемый к отладочной плате STM3210E_EVAL, файлы stm32_eval_sdio_sd.c и stm32_eval_sdio_sd.h.
Запустится сразу - не получилось. ИМХО карточкам памяти не понравилась частота 24Mhz передачи данных по интерфейсу SDIO. Формула такая:
SDIO_CK = SDIOCLK / (SDIO_INIT_CLK_DIV + 2).
По умолчанию в файле stm3210e_eval.h было определо:
#define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x00)
Я изменил SDIO_INIT_CLK_DIV на 0x01.
При этом карточка QUMO заработала, низкоуровневые функции read/write/erase стали работать корректно. Скорости тоже адекватные. Использую режим данных SDIO data - 4 bit. Карточка Kingston начала работать только после того как я допаял дополнительно 6 подтягивающих резисторов на линии D0-D3, CLK и CMD, подтяжка к VCC.
Проверил запись/чтение/ верификация на весь объем карточек, все корректно.
Теперь подключил FatFs Generic FAT File System Module, R0.09 ©ChaN, 2011.
Реализовал функции
Disk I/O Interface
disk_initialize - Initialize disk drive
disk_status - Get disk status
disk_read - Read sector(s)
disk_write - Write sector(s)
disk_ioctl - Control device dependent features
get_fattime - Get current time.
На ПК подготовил файл около 3,5GB, записал на microSD.
Функцией f_read и f_lseek, считал по блокам и верифицировал – все корректно, скорость чтения получилась около 1,8-2,3 MB/sec.
C функцией f_write возникли затруднения, а именно при дозаписи файлов размер которых становится больше 3,5MB, возникает ошибка записи. Папки, маленькие файлы - создаются нормально и читаются на ПК. Сильно не хочется рыться в «исходниках» FatFs, поэтому приму с благодарностью советы и опыт по устранению этого «косяка».