STM32F407VET FatFs f_close возвращает FR_DISK_ERR

Я подключаю SD-карту (16Gb Sandisk ultra micro SD) к микроконтроллеру STM32F407 с протоколом SDIO, используя библиотеку chan FatFS. Когда я пытаюсь записать данные в существующий файл, f_write возвращает FR_OK и возвращает количество записанных байтов (это значение равно количеству байтов для записи), но f_close() возвращает FR_DISK_ERR, и в конце файл оказывается пустым. С большим количеством экспериментов я обнаружил, что если я отформатирую карту micro SD, используя размер выделения блока 64 КБ и существующий файл с некоторым текстом в нем, тогда я смогу записать данные 64 КБ в файл, но f_close() возвращает FR_DISK_ERR, и, в конце концов, файл не пусто. Я могу видеть данные в ОС Windows 10. Если в существующем файле нет текста, я получаю пустой файл, даже если f_write возвращает FR_OK, а f_close возвращает FR_DISK_ERR. Короче говоря, когда я пытаюсь использовать f_write для текстового файла, созданного на моем ПК, я могу перезаписать содержимое этого файла до 64 КБ. Но я не могу заставить его работать с пустым файлом, который я создал с помощью f_open

Я наткнулся на похожий пост с той же проблемой

TMS320F2812 FatFs f_write возвращает FR_DISK_ERR

Я попробовал решения, приведенные в сообщении выше, но это не сработало. Поскольку в моем контроллере 192 КБ ОЗУ, я думаю, этого достаточно для работы этого модуля FatFs. Размер моего стека составляет около 13 КБ, а размер кучи 4 КБ, что слишком много для этого приложения. На SD-карту подается напряжение питания 3,3 В.

Я немного углубился в код, чтобы увидеть, где возникает ошибка, и обнаружил, что я получаю ошибку SD_ILLEGAL_CMD при установке размера блока для карты. Внутри f_close(файл ff.c)->f_sync(файл ff.c)->move_window(файл ff.c)->disk_read(файл diskio.c)->SD_ReadBlock(файл sdcard.c) возвращает ошибку SD_ILLEGAL_CMD при установке размер блока для карты.

Любые решения приветствуются. Если требуется дополнительная информация, пожалуйста, не стесняйтесь спрашивать, я обновлю с дополнительной информацией.

Версия Chan FatFs - R0.07e


person Vijay Anand Chandrasekaran    schedule 01.02.2018    source источник
comment
Я пишу 512 байт, а для __MAX_SS (файл ffconf.h) установлено значение 512. Я могу записать 512 байт 128 раз, что дает 64 КБ, но f_close выдает ошибку   -  person Vijay Anand Chandrasekaran    schedule 01.02.2018
comment
Chan FatFS 0.7e действительно старая. Текущая версия на данный момент — R0.13a. Формат кластера 64 КБ несовместим с FAT32 — вам необходимо использовать кластеры 32 КБ на карте объемом более 4 ГБ.   -  person Turbo J    schedule 01.02.2018
comment
Спасибо Турбо за ответ. Как вы сказали, версия, которую я использую, устарела, и я обновлю ее новой. Я отформатировал SD-карту с размером блока 32 КБ, и результат тот же. Я могу перезаписать содержимое этого файла до 32 КБ. Но я не могу заставить его работать с пустым файлом, созданным с помощью f_open. В обоих случаях f_close выдает ошибку из-за того, что SD_ReadBlock возвращает ошибку SD_ILLEGAL_CMD. Я также попытался изменить размер блока на 8 КБ, и результат все еще в порядке.   -  person Vijay Anand Chandrasekaran    schedule 02.02.2018
comment
Я даже пытался обновить версию FatFs до 13a, но безрезультатно. Я застрял с той же проблемой. Любое предложение или помощь оценены   -  person Vijay Anand Chandrasekaran    schedule 02.02.2018