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

Разрушение FatFS на SD карте

Использую FatFS на картах памяти microSDHC. С картами памяти работаю на процессорах Freescale MK24 и NXP i.MX RT1050. 
Карты используются достаточно интенсивно (запись, чтение, удаление файлов) в нескольких потоках FreeRTOS одновременно.
Через некоторое время работы таблица FAT ломается, один раз поймал, что 0-й блок затерт 0xFF.
Пробовал убрать весь код, который вносит изменения в файловую систему (запись, удаление) (низкоуровневая функция записи блока на SD точно не вызывается), но со временем FAT все равно разрушается.
Помогает только блокировка записи на уровне карты памяти.
 

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


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

8 minutes ago, Developer said:

Пробовал убрать весь код, который вносит изменения в файловую систему (запись, удаление)

Это делать надо не на уровне файловой системы (вдруг что-нибудь пропустите или просто нарушите логику работы), а в драйвере diskio.c. И закомментировать потребуется одну! функцию.

Вопрос: вы эти карты тестировали на ПК? Чтобы исключить/подтвердить проблему с ними?

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


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

Не важно указал ли я дефайн _FS_READONLY в FatFS или выпилил весь код расположенный выше, факт в том, что disk_write не вызывается

13 минут назад, haker_fox сказал:

Вопрос: вы эти карты тестировали на ПК? Чтобы исключить/подтвердить проблему с ними?

Карты использовались самые разные, начиная NoName и заканчивая  классом Industrial. Разные производители, модели, объемы. Но на всех наблюдаются подобные проблемы с развалом FAT. какие-то раньше, какие-то позже, но итог один
На ПК подобные тесты не проводились.

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


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

13 minutes ago, Developer said:

Не важно указал ли я дефайн _FS_READONLY в FatFS или выпилил весь код расположенный выше, факт в том, что disk_write не вызывается

Это вам неважно. А нам - отвечающим на вашу проблему, ещё как важно. Любой нюанс может нести капельку полезной информации. Ладно, поехали дальше. А ioctl ничего не делает с флешкой?

13 minutes ago, Developer said:

На ПК подобные тесты не проводились.

Ну так какой смысл от тестов на вашей железке. Тестировать нужно на ПК, где заранее известно, что драйвер, файловая система, сигналы и всё прочее в порядке. А так как вы сможете узнать источник проблемы? Может быть у вас флешки такие.

 

Дополнительно: проверьте питание карты, подключите туда осциллограф, с настроенным триггером на провал питания и подъём. Также нужно посмотреть на шину данных. Если у вас действительно нет записи, то других причин я пока не вижу. Кстати, какой интерфейс данных вы используете?

 

Я правильно понимаю, что вы в своей железке только читаете карту?

 

Работал с картами. Подобного поведения не наблюдал.

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


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

6 минут назад, haker_fox сказал:

Это вам неважно. А нам - отвечающим на вашу проблему, ещё как важно. Любой нюанс может нести капельку полезной информации. Ладно, поехали дальше. А ioctl ничего не делает с флешкой?

судя по коду FatFS, disk_ioctl вызывается только при форматировании карты (f_mkfs) и при дампе кэша (sync_fs), обе эти функции закрываются дефайном _FS_READONLY

 

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


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

Ну раз так, я бы первым делом сунул эти карты в комп, и погонял интенсивные тесты. Затем, если карты его пройдут, то проверил бы жезеку с точки зрения аппаратной части: питание, шину данных. Пока больше идей нет.

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


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

попробую погонять подобные тесты на ПК.
По питанию все ровно, осциллографом просадки не ловятся
Сигнал шины данных выглядит нормальным. Клоки тоже в норме
Проанализировать шину команд не предоставляется возможным, тот анализатор, который есть в наличии не умеет SDIO, чтобы узнать что на самом деле контроллер SDHC отправляет на карту памяти

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


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

9 minutes ago, Developer said:

SDHC отправляет на карту памяти

А что у вас в качестве микроконтроллера?

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


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

Как организовано разделение карты между потоками? Не работал с SD, но не может получиться так, что при одновременном обращении двух потоков одна команда вклинивается в другую и превращает ее из команды чтения в команду стирания?

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


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

14 minutes ago, Сергей Борщ said:

вклинивается в другую и превращает ее из команды чтения в команду стирания?

Команды защищены CRC7. Вроде бы такого быть не должно. Но, согласен, проверить стоит:angel:

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


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

27 минут назад, haker_fox сказал:

А что у вас в качестве микроконтроллера?

я имел в виду SDHC контроллер, которые внутри Freescale MK24 и NXP i.MX RT1050. 

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


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

8 минут назад, haker_fox сказал:

Команды защищены CRC7. Вроде бы такого быть не должно. Но, согласен, проверить стоит:angel:

Забавно, но в драйвере в комплекте KDS никогда не выставляется бит CCCEN в регистре SDHC_XFERTYP
 

Цитата
Command CRC Check Enable
If this bit is set to 1, the SDHC shall check the CRC field in the response. If an error is detected, it is
reported as a Command CRC Error. If this bit is set to 0, the CRC field is not checked. The number of bits
checked by the CRC field value changes according to the length of the response.

Стоит попробовать добавить.
Но даже если в карту пришла команда стирания, не должно заставить контроллер SD стереть блок. Последовательность команд записи/чтения и стирания разные.
А вот вместо чтения вполне может прилететь запись. 
 

Цитата

 

SDHC_PDD_CMD17_READ_SINGLE_BLOCK   0x11U

SDHC_PDD_CMD24_WRITE_BLOCK          0x18U

 

Спасибо Сергею за наводку

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


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

4 minutes ago, Developer said:

Забавно, но в драйвере в комплекте KDS никогда не выставляется бит CCCEN в регистре SDHC_XFERTYP

Снова не помню уже нюансов, а карте по-барабану, что-ли, на контрольную сумму?!

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


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

17 минут назад, Developer сказал:

А вот вместо чтения вполне может прилететь запись. 

Разве можно записать 0xFF без стирания? Или эти карты стираются нулями?

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


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

3 минуты назад, Сергей Борщ сказал:

Разве можно записать 0xFF без стирания? Или эти карты стираются нулями?

Всю эту магию делает контроллер карточки прозрачно для пользователя. Наружу торчат команды записи блока.

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


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

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

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

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

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

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

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

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

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

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