Перейти к содержанию
    

stm32f407 + uSD (SDIO) + FAT

Здравствуйте все!

 

Осваиваю работу stm32f4 с uSD, используя STM32F4-DISCOVERY (stm32f407vgt6) + плата STM32F4DIS-BB

 

Проект собрал, взяв библиотеки из STM32Cube_FW_F4_V1.14.0 и оттуда же из примеров вытащил библиотеки FatFs.

 

Используется работа в полинге.

Из примеров оставил main, где сначала форматируется карта, а потом идет запись текстового файла.

 

В процессе форматирования на n-ном блоке происходит вылет по флагу SDIO_FLAG_TXUNDERR.

 

Если поставить паузы между блоками по 1 мс, вылетов нет, но после завершения работы программы карта при подключении к винде требует форматирования.

 

Если убрать вызов ф-ции f_mkfs на уже отформатированной карте успешно создается текстовый файл.

 

Добавил проверку флага ReadyForData перед каждой записью блока (не нашел к ф-циях HAL такого) -ситуация не изменилась.

Выкинул FreeRTOS, оставил только инициализацию контроллера, проблема осталась.

 

В настройках SDIO:

SDIO_CLOCK_BYPASS_DISABLE

SDIO_HARDWARE_FLOW_CONTROL_DISABLE

 

Что не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

насколько я помню свою битву с подключением SD карточки к SDIO шине в F407, исходники от ST содержат ошибки и их нужно править. Попробуйте в интернете поискать и тут на Электрониксе тоже.

Но было это много лет назад, может уже и поправили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжил возьню с картой.

Перевел обмен на DMA, вылет по флагу исчез. Программа вроде бы как полностью отрабатывает - форматирует, записывает строку на карту, что-то там считывает и говорит ОК.

На это хорошее заканчивается, начинается интересное

 

При проверки карты виндой требуется форматирование. Если карту вставить сразу форматированной и писать на нее строку все норм.

 

Под отладчиком обратил внимание на особенность с количеством блоков, записываемых функцией mkfs. Их количество неуклонно растет, хотя вроде бы должно быть постоянным. Сейчас уже порядка 360 000, хотя при первых попытках было меньше 200 000. Сам процесс форматирования идет минут 20.

 

Скачал библиотеку от Чена, буду ее прикручивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прикрутил, Новый год, новая библиотека - форматирование старое кривое.

 

Код проходит вроде без ошибок, но карта виндой по-прежнему не читается.

Форум смотрел, вроде все настройки DMA и SDIO вроде учел и надо ковырять файл stm32f4xx_hal_sd.c

 

Отсюда вопрос - ни у кого нет исправленной библиотеки или хотя бы подсказки что править?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Форматирование- это самая сложная из возможных функций и, по-моему, самая редко применяемая. То есть мало кто использует и еще меньше кто расскажет о глюках если они не у каждого встречаются.

 

Начните с простого

0. Чтение служебной информации диска и файла

1. Чтение из файла

2. Создание файла

3. Добавление в файл

4. Удаление файла

(1-4) в произвольном порядке, несколько раз, ну скажем раз сто.

 

Работает стабильно? Теперь переходите к форматированию.

 

Для того чтобы понять что не так, советую поставить программу, которая показывает сектора и прочее, сырые данные диска, и стандартные структуры тоже. Мне WinHex нравится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Форматирование- это самая сложная из возможных функций и, по-моему, самая редко применяемая. То есть мало кто использует и еще меньше кто расскажет о глюках если они не у каждого встречаются.

 

Начните с простого

0. Чтение служебной информации диска и файла

1. Чтение из файла

2. Создание файла

3. Добавление в файл

4. Удаление файла

(1-4) в произвольном порядке, несколько раз, ну скажем раз сто.

 

Работает стабильно? Теперь переходите к форматированию.

 

Для того чтобы понять что не так, советую поставить программу, которая показывает сектора и прочее, сырые данные диска, и стандартные структуры тоже. Мне WinHex нравится.

 

Огромное спасибо! Вопрос решился.

Посыпаю голову пеплом. Была ошибка в портировании библиотек в части определения размера карточки. Карточка считывалась верно, но была лишняя локальная переменная в SD_ioctl, из которой подставлялось мусорное значение емкости карты.

 

В любом случае было даже полезно - изучил досконально интерфейс и библиотеки)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огромное спасибо! Вопрос решился.

:)

Кстати, в FatFs нужно внимательно смотреть, чтобы версия документации и сорцов совпадали

Конкретно у меня это был флаг FA_OPEN_APPEND, который был уже описан, но еще не обрабатывался в коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...