Jump to content

    

Снова SD/MMC

Идем дальше, как говорится... Имею на руках две флешки: SanDisk TransFlash через переходник 32 мб и Kingston 1гб (SD, естественно). При записи на флешь наблюдаю странную картину. После подачи пары CRC-байт в конце посылки сектора (шлю FF, т. к. CRC не использую), шлю холостые байты в ожидании Data Response (в случае успешной записи должно быть XXX00101). Так вот SanDisk такое выдает, а Kingston - нет. Последняя вообще ничего не выдает вслед за парой CRC - один лишь вечный '0'. Хотя в обоих случаях фактическая запись происходит (потом считывал). В случае с Kingston, правда, не понятно пока с какого раза - там в программе в случае неполучения правильного Data Response производится повторная запись с самого начала команды (и так 4 раза). В чем может быть причина?

И еще вопрос. Для SanDisk после того как карта вернула XXX00101, заряжаю "пустышки" (байты с FF), пока не получу в ответ что-нибудь отличное от нуля (карта висит в Busy, как я понимаю). Так вот это время ну уж очень болшое! Команду и 512 байт информации выпуливаются у меня меньше чем за 500 мкс. А busy висит все 3000 мкс! Это ведь ненормально много?! Или я не прав?

Share this post


Link to post
Share on other sites

Добрый день.

 

Не хотел создавать новую тему, так как эта показалась подходящей.

 

Вопрос в следующем.

 

При поиске имени файла в области каталогов, когда можно быть уверенным что дальше искать смысла нет. Имеется в виду, следующее. Есть гарантия что при обнаружении пустой записи ( например не все 32 байта обнулены, а только первый символ = 0) за ней не будет какой-нибудь еще валидной записи??? Просто когда флешка пустая (только форматнули), область каталогов занулена. И при поиске файла (на предмет похожего имени) на 8-битнике да 1 гиговой флешке (где секторов под корень отведено много), происходит долгий поиск. Вот думаю останавливать поиск при обнаружении в имени файла первого символа = 0. Правомерно ли это???

Share this post


Link to post
Share on other sites
Вот думаю останавливать поиск при обнаружении в имени файла первого символа = 0. Правомерно ли это???

Правомерно: по стандарту FAT, 0x00 в первом символе имени файла является признаком конца директории.

Share this post


Link to post
Share on other sites
Правомерно: по стандарту FAT, 0x00 в первом символе имени файла является признаком конца директории.

 

Огромное спасибо за ответ.

Share this post


Link to post
Share on other sites

Добрый день.

 

Может быть я плохо искал по форуму или по документации на SD карты, но на свой вопрос ответа не нашел. Вернее что-то нашел. В частности у людей есть разброс во времени записи сектора от нескольких ms до сотен ms. В моем случае (мне необходимо при пропадании входного напряжения успеть скинуть свой промежуточный буфер в 512 байт на карту) карта за 20ms не успевает скинуть блок данных. Ток потребления и так на предельном минимуме, остается наращивать входную емкость. Вот и хочу понять какую минимально достаточную поставить (нехочу ставить банку в 1000uF :).

 

Сколько времени SD/MMC карты тратят максимально на запись блока в 512 байт???

Сколько минимально возможно времени тратят на запись???

 

В документации напоролся на фразу из которой я понял что на запись карта может потратить до 250mS времени. Ужасно много. Может есть более конкретные данные (то что я прочел оказалось где-то в середине документа, а не в таблице электрических и временных характеристик)?????

Share this post


Link to post
Share on other sites

С посекторной записью в SD вопрос неприятный. Мне попадались карты, куда писались данные посекторно со скоростью 7 кбайт/с, хотя другие писали 80 кбайт/с.

Share this post


Link to post
Share on other sites
С посекторной записью в SD вопрос неприятный. Мне попадались карты, куда писались данные посекторно со скоростью 7 кбайт/с, хотя другие писали 80 кбайт/с.

 

Да, но это все же больше чем 2 ms на запись куска в 512 байт. Я столкнулся с тем, что за 2 ms карточка данные на флешь не сбросила, хотя и "всосала" их в себя.

 

Время работы всего процесса 4 ms. За 2 ms я все выплевываю в SD, и по осцилограмме вижу еще 2.4 ms до момента пропадания питания есть у карты. Но после прочтения данных, своего куска информации в файле не обнаруживаю. Затянул процесс до сотен ms. Данные в файле получил. Но банка болшая получилась.

Share this post


Link to post
Share on other sites

Доброго дня.

 

Имею аналогичную проблему с MicroSD картой.

 

Начинаю писать на нее поток данных со скоростью примерно один сектор в 110 мс. Пишет корректно, однако один раз в 28 секунд (это я замерял, какое-то магическое числ небось) карточка держит сигнал BUSY слишком долго (до 80 мс), хотя в остальное время BUSY пропадает практически сразу после записи.

Вот уже несколько дней думаю о причинах такого поведения, но как-то ничего не придумывается. Может кто знает?

Share this post


Link to post
Share on other sites

28/0.11 = 254.

Ну очень похоже на 256 - размер какого-нибудь блока флеш.

Share this post


Link to post
Share on other sites
28/0.11 = 254.

Ну очень похоже на 256 - размер какого-нибудь блока флеш.

Ну в таком случае это какой-то блок из 256 секторов - но я нигде не видел упоминание об этом.

И еще - я пишу непрерывно, начиная с 66 сектора в файле на карте, а этот 66 сектор файла смещен относительно начала карточки на 95 секторов. Получаем начало в 161 секторе от начала карточки.

Отладчикм посмотрел, что длительное ожидание происходит на 373 секторе файла, т.е. на 534 секторе от начала карточки. Но ведь это явно не блок, и явно не кратно 256.

Короче, полная загадка.

Share this post


Link to post
Share on other sites

И еще интересный момент.

В вышеописанных условиях первый сбой происходит на 373 секторе, а вот следующий сбой - на 629, т.е. с интервалом 256 секторов!!!

Из любопытства уменьшил интервал записи секторов с 110 мс до 96. Получил первый сбой на 253 секторе (как-то не пропорционально с интервалом получилось), а вот следующий - на 509 - снова через 256 секторов!!!

 

Что за магическое число 256 секторов для SD карты и почему так происходит вообще?

Share this post


Link to post
Share on other sites

У меня тоже проблемы с недетерменированностью времени записи :05: :05: Пока так и не решил проблемму.

Share this post


Link to post
Share on other sites
Что за магическое число 256 секторов для SD карты и почему так происходит вообще?

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

256 - магическое число только для данной конкретной карты. Контроллер SD-карты весьма сложная штука, ждать от него детерменированного времени записи нельзя, нужно буферизировать данные со своей стороны.

Share this post


Link to post
Share on other sites
На этой границе карта может выполнять стирание следующего блока, контроль целостности данных в только что записанном и т.п.

256 - магическое число только для данной конкретной карты. Контроллер SD-карты весьма сложная штука, ждать от него детерменированного времени записи нельзя, нужно буферизировать данные со своей стороны.

Я это безусловно и так делаю... вот только я никак не могу определить размер при котором все гарантироваано успеется записаться. Ну не мегабайт же мне выделять, при том, что я пишу пачками по 150 байт за раз и в 99% случаев он записать эти 150 байт успевает еще до того как новые 150 байт накопятся с АЦП. Весь вопрос в этом 1 % случаев... мегабайта конечно хватит, но я не готов в крохотном МСП430 выделять 1М памяти чтоб он простаивал попросту. :)

Share this post


Link to post
Share on other sites

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

Делаю поддержку флешек microSD на MSP430. Сначала использовал легкодоступный Sham176.zip. Все работало практически без глюков, но флешки более 512 МБ эта библиотека не видела, поэтому я решил портировать FatFs (не tiny). Взял diskio отсюда, переделал, чтобы он работал на F1611 и получил кучу глюков, убив кучу времени. Один из них - карточка инициализируется строго через раз, или каждый раз, если ее вынуть-вставить. А сначала вообще инициализировалась когда хотела, обычно на 10 неудачных попыток была одна удачная. После чего она стала работать через раз - уже не помню. Конечно, можно всю инициализацию засунуть в цикл, но мне кажется, что это - "костыли".

Есть две флешки: PQI на 512 МБ и Kingston на 1 ГБ. Инициализируются обе в разных "ветках" (см. ниже). Компьютер и другие девайсы работают с ними без всяких проблем.

Спецификации читал, вроде у меня все правильно.

С чтением тоже проблемы: вместо сектора всегда получаю одни нули.

diskio.zip

Edited by LCD

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
Sign in to follow this