Jump to content

    

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

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

Share this post


Link to post
Share on other sites
8 minutes ago, Developer said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
13 minutes ago, Developer said:

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

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

13 minutes ago, Developer said:

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

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
6 минут назад, haker_fox сказал:

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
9 minutes ago, Developer said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
14 minutes ago, Сергей Борщ said:

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

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

Share this post


Link to post
Share on other sites
27 минут назад, haker_fox сказал:

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

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

Share this post


Link to post
Share on other sites
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

 

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

Share this post


Link to post
Share on other sites
4 minutes ago, Developer said:

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

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

Share this post


Link to post
Share on other sites
17 минут назад, Developer сказал:

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

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

Share this post


Link to post
Share on other sites
3 минуты назад, Сергей Борщ сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now