Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пропадают данные с microSD
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам
scout
Возникла проблема с sd картой Mirex 2Gb в spi режиме.

Суть в следующем: карта нормально работает на запись в течении
неск. часов, потом в какой то момент вообще перестает подавать признаки жизни
(держит busy).
Делаю reset по питанию, считываю данные. Вижу, что часть ранее записанных
данных пропала, причем пропала не полностью, а кусками примерно по 64к,
т.е часть данных есть, потом "дырка", потом снова идут данные.
Т.o проблемы две - зависание карты и пропадание данных. В первую очерень
хотелось бы разобраться с пропаданием данных.

Данные пишу раз в секунду порциями по 256 байт.
Просадок по питанию во время работы нет, неиспользуемые линии через 10к подтянуты к +3.3В.
Частота spi = 12,5МГц.

P.S. C картами других производителей такой проблемы не наблюдается. Дело в том, что часть устройств
уже выпущена с этой картой, поменять ее можно, но это долго и затратно, поэтому хотелось бы найти программный
способ решения проблемы.

P.S.S. Какого размера внутренние буферы записи у карты? Т.е интересует сколько данных
может теоретически потеряться при внезапном пропадании питания.

Кто что может посоветовать?
adnega
Цитата(scout @ May 9 2018, 09:37) *
Кто что может посоветовать?

А файловая система используется или пишите сырыми секторами?
Размер сектора обычно 512 байт. Видимо, для записи 256 байт вы используете буферизацию или ФС.
scout
Пишу в raw, размер сектора 512. Когда пишу порциями по 256б, то сначала читаю сектор, модифицирую данные и снова записываю.
mantech
Цитата(scout @ May 9 2018, 09:37) *
Вижу, что часть ранее записанных
данных пропала, причем пропала не полностью, а кусками примерно по 64к,
т.е часть данных есть, потом "дырка", потом снова идут данные.
Т.o проблемы две - зависание карты и пропадание данных. В первую очерень
хотелось бы разобраться с пропаданием данных.


Может устроить нагрузочное тестирование данных карт? Например прогой h2testw, на несколько часов и посмотреть, может вы пытаетесь решить чужую проблему?
scout
Спасибо, попробую.

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

Я думал может кто - то сталкивался с подобным поведением и подскажет в чем может быть дело..
iosifk
Цитата(scout @ May 9 2018, 09:37) *
Возникла проблема с sd картой Mirex 2Gb в spi режиме.

Кто что может посоветовать?

А могут ли быть аппаратные проблемы?
Питание?
Фронты импульсов, особенно клоки? Согласование линий?
Частоту понижать пробовали?
Пробовали ли эти карты в каком-нибудь другом стартовом наборе?

В конце концов обращались ли в техподдержку изготовителя микросхем?
И нет ли у них ерраты именно на эту партию микросхем?
_4afc_
Цитата(scout @ May 9 2018, 19:48) *
Пишу в raw, размер сектора 512. Когда пишу порциями по 256б, то сначала читаю сектор, модифицирую данные и снова записываю.


Вот в пишу/читаю может крыться проблема.

может паузы между этими действиями надо делать, может статус читать, может стоп посылать...

Вы каким набором команд пользуетесь?
jcxz
Цитата(scout @ May 9 2018, 19:48) *
Пишу в raw, размер сектора 512. Когда пишу порциями по 256б, то сначала читаю сектор, модифицирую данные и снова записываю.

А какой смысл? Зачем читать/модифицировать/записывать, а не просто записывать?
И размер стирания в SD вроде как больше чем размер записи. Может быть 64К, а может и больше. Вы при записи каждых 256 байт заново весь блок стирания перетираете и переписываете??? wacko.gif
scout
iosifk, аппаратно все вроде нормально. Частота и так достаточно низкая.
Устройство где используются эти карты не новое, проблема именно с этой партией.

_4afc_, что значит делать паузы? В документации я ничего не нашел по этому поводу.
Каждую отдельную операцию чтения/записи я и так делаю внутри своего цикла CS.
Данные пишу с cmd24, читаю c помощью cmd17.
Никаких проблем не было, пока не поставили эти карты mirex. Самое неприятное,
что пропадают уже записанные данные, зависания не так критичны. В новой партии мы, конечно,
будет ставить другие карты, а в старом тираже хотелось бы решить проблему программно, по крайней мере временно.

jcxz, а как записывать внутри блока, если адресация блочная? Вот и приходится
читаю блок, модицифировать данные и писать его снова.
mantech
Цитата(jcxz @ May 10 2018, 08:01) *
А какой смысл? Зачем читать/модифицировать/записывать, а не просто записывать?


Дык смысл есть, как бы ФС так и делает вообще-то, если нужно что-то поменять внутри 512и байтного сектора считывает в оконный буфер модифицирует и записывает обратноrolleyes.gif

Попробуйте записать на сдшку, скажем только 16 байт?? wink.gif
_4afc_
Цитата(scout @ May 10 2018, 12:10) *
_4afc_, что значит делать паузы? В документации я ничего не нашел по этому поводу.
Каждую отдельную операцию чтения/записи я и так делаю внутри своего цикла CS.
Данные пишу с cmd24, читаю c помощью cmd17.


Разнесите чтение и запись на 500мс.

Modify_Block(int N)
{
if (needRead) {stop_cmd12();wait_ms(250);Read_cmd17(N);wait_ms(250);stop_cmd12();wait_ms(250);
}
Write_cmd24(N);
}
jcxz
Цитата(scout @ May 10 2018, 12:10) *
jcxz, а как записывать внутри блока, если адресация блочная? Вот и приходится
читаю блок, модицифировать данные и писать его снова.

Вы что-то путаете: блок стирания - это блок размером обычно несколько десятков КБ (64 или больше), а страница для записи - это обычно 512 байт.
Блок содержит много страниц. Если его стереть заблаговременно, то читать ничего не надо. И если у вас последовательная запись (типа кольцевого буфера на SD), то как раз и можно стирать блоки перед началом буфера и писать целые страницы.

Цитата(mantech @ May 10 2018, 16:24) *
Дык смысл есть, как бы ФС так и делает вообще-то, если нужно что-то поменять внутри 512и байтного сектора считывает в оконный буфер модифицирует и записывает обратноrolleyes.gif
Попробуйте записать на сдшку, скажем только 16 байт?? wink.gif

Я так понял: автор пишет в последовательную цепочку страниц, раз в секунду по 256 байт. Если заранее стереть блоки перед головой записываемой цепочки, то читать ничего не надо.
И в чём проблема записать хоть 16 хоть 1 байт если заранее известно, что пишем в стёртую область?
adnega
Цитата(jcxz @ May 10 2018, 17:50) *
И в чём проблема записать хоть 16 хоть 1 байт если заранее известно, что пишем в стёртую область?

1. Адрес должен быть выровнен на границу сектора.
2. Записать можно только сектор целиком.
3. При записи сектора нужно передать 16 бит контрольной информации.
jcxz
Цитата(adnega @ May 10 2018, 17:57) *
1. Адрес должен быть выровнен на границу сектора.
2. Записать можно только сектор целиком.
3. При записи сектора нужно передать 16 бит контрольной информации.

и что?
adnega
Цитата(jcxz @ May 10 2018, 18:02) *
и что?

1. Адрес должен быть выровнен на границу сектора.
Как записать произвольный байт? Типа отправить весь сектор где иные байты задать erase-default-value?
2. Записать можно только сектор целиком.
см. п.1
3. При записи сектора нужно передать 16 бит контрольной информации.
Контрольная информация нужна только для контроля ошибок связи, а не хранения?

Мне представляется NAND как хранилище данных с корректирующими кодами размером с сектор.
Если дописать данных и корректирующих кодов, то в итоге данные будет не восстановить.
Делает ли карта чтение-модификацию-запись и применение логики с учетом erase-default-value - сомневаюсь.

На некоторых картах может быть WRITE_BL_PARTIAL, но это скорее экзотика, чем правило.
Возможно, из-за доводов предыдущего абзаца.
jcxz
Цитата(adnega @ May 10 2018, 18:13) *
1. Адрес должен быть выровнен на границу сектора.
Как записать произвольный байт? Типа отправить весь сектор где иные байты задать erase-default-value?

Естественно.

Цитата(adnega @ May 10 2018, 18:13) *
2. Записать можно только сектор целиком.
см. п.1

см.п.1

Цитата(adnega @ May 10 2018, 18:13) *
Мне представляется NAND как хранилище данных с корректирующими кодами размером с сектор.

Это можно проверить. И если так - тогда просто накапливать данные в ОЗУ до полного сектора.
scout
jcxz, у меня буфер в ОЗУ размером с запись, т.е 256 байт.
Вы, по сути, предлагаете писать страницей, под которую нужно постоянно держать буфер в ОЗУ,
которого у меня в обрез. Но это уже детали реализации, которые сейчас не существенны,
мне бы проблему пропадания данных решить...

Кстати, у меня sd карта сидит на spi, к которому подключено еще 2 устройства, cs у карты, разумеется, свой.
Может ли "паразитное" тактирование карты(при поднятом cs) при обращении к другим устройствам на шине приводить
к нарушениям в логике работы карты(зависаниям, пропаданиям данных)? Кто нибудь сталкивался?
jcxz
Цитата(scout @ May 11 2018, 11:29) *
Может ли "паразитное" тактирование карты(при поднятом cs)

А зачем у Вас это тактирование при поднятом CS?
Если на других устройствах поднят CS, то обычно не должно. Хотя это зависит от того, как реагируют на CS те устройства (см. доки на них). Обычно при поднятом CS слэйв-устройства не должны никак реагировать на любые внешние сигналы.
aaarrr
Цитата(scout @ May 11 2018, 11:29) *
Может ли "паразитное" тактирование карты(при поднятом cs) при обращении к другим устройствам на шине приводить
к нарушениям в логике работы карты(зависаниям, пропаданиям данных)? Кто нибудь сталкивался?

К разнообразным нарушениям работы может приводить отсутствие этого тактирования после снятия CS, когда карта еще не перевела выход в Z.
То есть правильная последовательность: сняли CS - выдали "холостой" байт. Это выполняется?
scout
jcxz, под "паразитным" тактированием я имел в виду клоки при обращении к другим устройствам на шине,
когда cs карты поднят.

aaarrr, да, выполняется. Вы не сталкивались на практике с произвольным пропаданием данных?
aaarrr
Цитата(scout @ May 11 2018, 16:44) *
aaarrr, да, выполняется. Вы не сталкивались на практике с произвольным пропаданием данных?

Нет. Но никогда и не вешал карту на одну шину с другими устройствами. Маловероятно, что это
является причиной такого поведения, больше похоже на аппаратную проблему - питание, целостность
сигналов. Контроль CRC включен?
iosifk
Цитата(scout @ May 11 2018, 11:29) *
Кстати, у меня sd карта сидит на spi, к которому подключено еще 2 устройства, cs у карты, разумеется, свой.
Может ли "паразитное" тактирование карты(при поднятом cs) при обращении к другим устройствам на шине приводить
к нарушениям в логике работы карты(зависаниям, пропаданиям данных)? Кто нибудь сталкивался?

Достаточны ли паузы после кадра с одного устройства и до другого кадра на другое устройство? Ведь после снятия CS абонент должен перевести свой выход в 3-е состояние... И для этого нужно время. Есть ли подпор по входной шине данных?
scout
Цитата(aaarrr @ May 11 2018, 16:51) *
Контроль CRC включен?


Который включается 59-й командой? Да, включен.

Насчет аппаратной проблемы я думал, но фронты нормальные, питание в норме,
да и карты других вендоров работают нормально...

Цитата(iosifk @ May 11 2018, 17:26) *
Достаточны ли паузы после кадра с одного устройства и до другого кадра на другое устройство? Ведь после снятия CS абонент должен перевести свой выход в 3-е состояние... И для этого нужно время. Есть ли подпор по входной шине данных?


В последнем эксперименте я оставил на шине только sd карту. Проблема осталась...
Подтяжки есть.
jcxz
Цитата(scout @ May 11 2018, 17:32) *
В последнем эксперименте я оставил на шине только sd карту. Проблема осталась...

Вы бы хоть описали - как пишете и что пишете? А то может быть Вы пишете один и тот же сектор, и на картах где есть "Wear leveling" оно спасает от его протирания, а попалась такая, которая не умеет "Wear leveling" - и беда.
Цитата(scout @ May 11 2018, 11:29) *
Но это уже детали реализации, которые сейчас не существенны,мне бы проблему пропадания данных решить...

Без знания этих деталей Вам тут никто не сможет помочь. Угадает разве что....
Чем больше деталей - тем выше вероятность помощи. Как то так.
aaarrr
А отдельно от своего устройства пробовали карты гонять в таком же режиме (т.е. записали 256 байт - сбросили кэш)?
Может, карты сами по себе бракованные.
mantech
Цитата(aaarrr @ May 11 2018, 21:28) *
А отдельно от своего устройства пробовали карты гонять в таком же режиме (т.е. записали 256 байт - сбросили кэш)?
Может, карты сами по себе бракованные.


Я уже ранее предлагал это ТСу, проверить сами карты на работоспособность, проверил он или нет - непонятно...
scout
Цитата
Я уже ранее предлагал это ТСу, проверить сами карты на работоспособность, проверил он или нет - непонятно...


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

Цитата
А отдельно от своего устройства пробовали карты гонять в таком же режиме (т.е. записали 256 байт - сбросили кэш)?
Может, карты сами по себе бракованные.


Что значить "сбросить кэш"?

Цитата
Вы бы хоть описали - как пишете и что пишете? А то может быть Вы пишете один и тот же сектор, и на картах где есть "Wear leveling" оно спасает от его протирания, а попалась такая, которая не умеет "Wear leveling" - и беда.


Пишутся несколько типов записей 128, 256 и 512 байт. Каждый тип пишется в свою область, области выровнены по границе блока.
Естественно, запись НЕ происходит в один сектор, ее адрес постоянно инкрементируется. Области кольцевые, но глюк случается,
когда закольцовка еще не произошла. Пропадание данных происходит строго в тот момент, когда карта зависает.

Пока склоняюсь к мысли, что карта не совсем корректно работает в spi режиме. Других мыслей пока нет.
Карты других вендоров работают нормально.
aaarrr
Цитата(scout @ May 15 2018, 18:37) *
Что значить "сбросить кэш"?

На всех современных ОС записи на диск буферизируются, поэтому для достижения такого же эффекта износа,
как в устройстве, оперирующем блоками по 256 байт, нужно после каждой операции записи принудительно сбрасывать
буфер на диск.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.