roman555 0 9 мая, 2018 Опубликовано 9 мая, 2018 · Жалоба Возникла проблема с sd картой Mirex 2Gb в spi режиме. Суть в следующем: карта нормально работает на запись в течении неск. часов, потом в какой то момент вообще перестает подавать признаки жизни (держит busy). Делаю reset по питанию, считываю данные. Вижу, что часть ранее записанных данных пропала, причем пропала не полностью, а кусками примерно по 64к, т.е часть данных есть, потом "дырка", потом снова идут данные. Т.o проблемы две - зависание карты и пропадание данных. В первую очерень хотелось бы разобраться с пропаданием данных. Данные пишу раз в секунду порциями по 256 байт. Просадок по питанию во время работы нет, неиспользуемые линии через 10к подтянуты к +3.3В. Частота spi = 12,5МГц. P.S. C картами других производителей такой проблемы не наблюдается. Дело в том, что часть устройств уже выпущена с этой картой, поменять ее можно, но это долго и затратно, поэтому хотелось бы найти программный способ решения проблемы. P.S.S. Какого размера внутренние буферы записи у карты? Т.е интересует сколько данных может теоретически потеряться при внезапном пропадании питания. Кто что может посоветовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 9 мая, 2018 Опубликовано 9 мая, 2018 · Жалоба Кто что может посоветовать? А файловая система используется или пишите сырыми секторами? Размер сектора обычно 512 байт. Видимо, для записи 256 байт вы используете буферизацию или ФС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roman555 0 9 мая, 2018 Опубликовано 9 мая, 2018 · Жалоба Пишу в raw, размер сектора 512. Когда пишу порциями по 256б, то сначала читаю сектор, модифицирую данные и снова записываю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 9 мая, 2018 Опубликовано 9 мая, 2018 · Жалоба Вижу, что часть ранее записанных данных пропала, причем пропала не полностью, а кусками примерно по 64к, т.е часть данных есть, потом "дырка", потом снова идут данные. Т.o проблемы две - зависание карты и пропадание данных. В первую очерень хотелось бы разобраться с пропаданием данных. Может устроить нагрузочное тестирование данных карт? Например прогой h2testw, на несколько часов и посмотреть, может вы пытаетесь решить чужую проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roman555 0 9 мая, 2018 Опубликовано 9 мая, 2018 · Жалоба Спасибо, попробую. Только непонятно в каком режиме эта прога пишет: одиночными секторами или мультиблоком, боюсь это будет не совсем корректный тест. Я думал может кто - то сталкивался с подобным поведением и подскажет в чем может быть дело.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 9 мая, 2018 Опубликовано 9 мая, 2018 · Жалоба Возникла проблема с sd картой Mirex 2Gb в spi режиме. Кто что может посоветовать? А могут ли быть аппаратные проблемы? Питание? Фронты импульсов, особенно клоки? Согласование линий? Частоту понижать пробовали? Пробовали ли эти карты в каком-нибудь другом стартовом наборе? В конце концов обращались ли в техподдержку изготовителя микросхем? И нет ли у них ерраты именно на эту партию микросхем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 9 мая, 2018 Опубликовано 9 мая, 2018 · Жалоба Пишу в raw, размер сектора 512. Когда пишу порциями по 256б, то сначала читаю сектор, модифицирую данные и снова записываю. Вот в пишу/читаю может крыться проблема. может паузы между этими действиями надо делать, может статус читать, может стоп посылать... Вы каким набором команд пользуетесь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба Пишу в raw, размер сектора 512. Когда пишу порциями по 256б, то сначала читаю сектор, модифицирую данные и снова записываю. А какой смысл? Зачем читать/модифицировать/записывать, а не просто записывать? И размер стирания в SD вроде как больше чем размер записи. Может быть 64К, а может и больше. Вы при записи каждых 256 байт заново весь блок стирания перетираете и переписываете??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roman555 0 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба iosifk, аппаратно все вроде нормально. Частота и так достаточно низкая. Устройство где используются эти карты не новое, проблема именно с этой партией. _4afc_, что значит делать паузы? В документации я ничего не нашел по этому поводу. Каждую отдельную операцию чтения/записи я и так делаю внутри своего цикла CS. Данные пишу с cmd24, читаю c помощью cmd17. Никаких проблем не было, пока не поставили эти карты mirex. Самое неприятное, что пропадают уже записанные данные, зависания не так критичны. В новой партии мы, конечно, будет ставить другие карты, а в старом тираже хотелось бы решить проблему программно, по крайней мере временно. jcxz, а как записывать внутри блока, если адресация блочная? Вот и приходится читаю блок, модицифировать данные и писать его снова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 10 мая, 2018 Опубликовано 10 мая, 2018 (изменено) · Жалоба А какой смысл? Зачем читать/модифицировать/записывать, а не просто записывать? Дык смысл есть, как бы ФС так и делает вообще-то, если нужно что-то поменять внутри 512и байтного сектора считывает в оконный буфер модифицирует и записывает обратно:rolleyes: Попробуйте записать на сдшку, скажем только 16 байт?? ;) Изменено 10 мая, 2018 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба _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 243 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба jcxz, а как записывать внутри блока, если адресация блочная? Вот и приходится читаю блок, модицифировать данные и писать его снова. Вы что-то путаете: блок стирания - это блок размером обычно несколько десятков КБ (64 или больше), а страница для записи - это обычно 512 байт. Блок содержит много страниц. Если его стереть заблаговременно, то читать ничего не надо. И если у вас последовательная запись (типа кольцевого буфера на SD), то как раз и можно стирать блоки перед началом буфера и писать целые страницы. Дык смысл есть, как бы ФС так и делает вообще-то, если нужно что-то поменять внутри 512и байтного сектора считывает в оконный буфер модифицирует и записывает обратно:rolleyes: Попробуйте записать на сдшку, скажем только 16 байт?? ;) Я так понял: автор пишет в последовательную цепочку страниц, раз в секунду по 256 байт. Если заранее стереть блоки перед головой записываемой цепочки, то читать ничего не надо. И в чём проблема записать хоть 16 хоть 1 байт если заранее известно, что пишем в стёртую область? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба И в чём проблема записать хоть 16 хоть 1 байт если заранее известно, что пишем в стёртую область? 1. Адрес должен быть выровнен на границу сектора. 2. Записать можно только сектор целиком. 3. При записи сектора нужно передать 16 бит контрольной информации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба 1. Адрес должен быть выровнен на границу сектора. 2. Записать можно только сектор целиком. 3. При записи сектора нужно передать 16 бит контрольной информации. и что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 10 мая, 2018 Опубликовано 10 мая, 2018 · Жалоба и что? 1. Адрес должен быть выровнен на границу сектора. Как записать произвольный байт? Типа отправить весь сектор где иные байты задать erase-default-value? 2. Записать можно только сектор целиком. см. п.1 3. При записи сектора нужно передать 16 бит контрольной информации. Контрольная информация нужна только для контроля ошибок связи, а не хранения? Мне представляется NAND как хранилище данных с корректирующими кодами размером с сектор. Если дописать данных и корректирующих кодов, то в итоге данные будет не восстановить. Делает ли карта чтение-модификацию-запись и применение логики с учетом erase-default-value - сомневаюсь. На некоторых картах может быть WRITE_BL_PARTIAL, но это скорее экзотика, чем правило. Возможно, из-за доводов предыдущего абзаца. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться