|
|
  |
Проблема с MicroSD картой. Кто поможет? |
|
|
|
Jan 23 2008, 11:53
|
Группа: Участник
Сообщений: 14
Регистрация: 23-01-08
Пользователь №: 34 349

|
Уважаемые форумчане, есть к вам вопрос.
Итак, есть микроконтроллер msp430FG4618 и MicroSD карта Transcend. Я пытаюсь организовать поддержку FAT16/32. Для работы с карточкой я использовал техасовский пример для MMC, однако переделанный для моего конкретного применения и использования SDHC (ну это на будущее). Для FAT-а я использовал исходники DOSFS Level 1 Version 1.02 от Lewin-а, однако также достаточно переработанные мною.
Вся эта канитель вроде бы работает нормально - создает файлы и папки, удаляет их, пишет в них небольшое количество данных.
Однако когда я запускаю запись, скажем, мегабайт 10, то в некоторый момент с карточкой что-то происходит: на ее выходе постоянно 0, не реагирует ни на какие команды, даже CMD0. Помогает только передергивание питания. Единственное похожее состояние карточки что я нашел в спецификации - это "Inactive State". Однако согласно той же спецификации карточка не может просто так войти в это состояние - только по CMD15 или несовпадения напряжения питания в команде CMD8. Но во время записи у меня посылаются только 2 команды - чтение блока CMD17 и запись блока CMD24.
Возникает такая ситуация каждый раз по-разному - может 100 секторов записать, может 5000. Но происходит все время при перезаписи сектора таблицы размещения - т.е. секторов, которые используются многократно. Может есть какая-то хитрость при работе с карточками? У кого есть опыт, поделитесь.
Заранее спасибо
|
|
|
|
|
Jan 24 2008, 05:13
|

Профессионал
    
Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952

|
Проверьте: 1)наличие подтягивающих резисторов и антизвоновых конденсаторов на сигнальных линиях карточки памяти, как это указано в прилагаемой документации. 2) наличие керамического конденсатора 1uF параллельно питанию карточки рядом с контактами разъёма карточки. У меня непрерывная запись в файл длиной 1Гигабайт идёт устойчиво (использую FAT16). Напишите тестовую программу: непрерывная запись и чтение сектора по абсолютному адресу. Если она проходит удачно, значит у вас ошибка в реализации FAT. Хотя может быть просто плохой контакт карточки в разъёме.
|
|
|
|
|
Jan 24 2008, 07:12
|
Группа: Участник
Сообщений: 14
Регистрация: 23-01-08
Пользователь №: 34 349

|
Цитата(etoja @ Jan 24 2008, 07:13)  Проверьте: 1)наличие подтягивающих резисторов и антизвоновых конденсаторов на сигнальных линиях карточки памяти, как это указано в прилагаемой документации. 2) наличие керамического конденсатора 1uF параллельно питанию карточки рядом с контактами разъёма карточки.
У меня непрерывная запись в файл длиной 1Гигабайт идёт устойчиво (использую FAT16).
Напишите тестовую программу: непрерывная запись и чтение сектора по абсолютному адресу. Если она проходит удачно, значит у вас ошибка в реализации FAT.
Хотя может быть просто плохой контакт карточки в разъёме. Хорошая у вас документация. А в даташите на мой Transcend TS1GUSD вообще рекомендуемой схемы подключения нет. Резисторы подтягивающие не ставил, т.к. 430 хорошо удерживает свои порты, еще ни разу не видел чтобы они у него плыли. Но попробую, если ничего не поможет. Конденсаторы на линии - это же только для больших частот обмена. Я пробовал запускать на 250 кГц SPI синхросигнала - и все равно то же самое. Питание я заподозрил с самого начала, хотя там стоит 0,1 + 2,2 мкф параллельно. Даже тектрониксом смотрел насчет проседаания питания в моменты стирания/записи. И ничего не увидел. Но сегодня с утра пропаял конденсаторы еще раз - может поможет? Ошибки в ФАТ нет, уже проверял. Виснет именно на низкоуровневых функциях чтения/записи сектора. Да и сомнительно, что неправильная реализация ФАТ могла бы так повесить карту. А вот с контактами это грустно - надо выпаивать разъем, ведь так не проверить контакт. Хотя я шатал плату в момент работы и зависимости между зависанием и механическим воздействием не заметил.
|
|
|
|
|
Jan 24 2008, 09:27
|

Местный
  
Группа: Участник
Сообщений: 215
Регистрация: 13-12-06
Из: fghgfh
Пользователь №: 23 476

|
Цитата(М430 @ Jan 24 2008, 10:12)  Хорошая у вас документация. А в даташите на мой Transcend TS1GUSD вообще рекомендуемой схемы подключения нет. Резисторы подтягивающие не ставил, т.к. 430 хорошо удерживает свои порты, еще ни разу не видел чтобы они у него плыли. Но попробую, если ничего не поможет. Конденсаторы на линии - это же только для больших частот обмена. Я пробовал запускать на 250 кГц SPI синхросигнала - и все равно то же самое. Питание я заподозрил с самого начала, хотя там стоит 0,1 + 2,2 мкф параллельно. Даже тектрониксом смотрел насчет проседаания питания в моменты стирания/записи. И ничего не увидел. Но сегодня с утра пропаял конденсаторы еще раз - может поможет?
Ошибки в ФАТ нет, уже проверял. Виснет именно на низкоуровневых функциях чтения/записи сектора. Да и сомнительно, что неправильная реализация ФАТ могла бы так повесить карту.
А вот с контактами это грустно - надо выпаивать разъем, ведь так не проверить контакт. Хотя я шатал плату в момент работы и зависимости между зависанием и механическим воздействием не заметил. В момент записи ток потребления выростает в 3 раза,может стабилизатор не справляется?
--------------------
|
|
|
|
|
Jan 24 2008, 19:25
|
Группа: Участник
Сообщений: 14
Регистрация: 23-01-08
Пользователь №: 34 349

|
Цитата(etoja @ Jan 24 2008, 07:13)  Проверьте: 1)наличие подтягивающих резисторов и антизвоновых конденсаторов на сигнальных линиях карточки памяти, как это указано в прилагаемой документации. 2) наличие керамического конденсатора 1uF параллельно питанию карточки рядом с контактами разъёма карточки.
У меня непрерывная запись в файл длиной 1Гигабайт идёт устойчиво (использую FAT16).
Напишите тестовую программу: непрерывная запись и чтение сектора по абсолютному адресу. Если она проходит удачно, значит у вас ошибка в реализации FAT.
Хотя может быть просто плохой контакт карточки в разъёме. Сегодня проверил конденсаторы, даже добавил еще один на всякий случай - не помогло. Слепил тестовый прогон - записывал и сразу после записи считывал 2000 секторов, сравнивая результаты. Ошибок, собственно в данных, нет. Однако из 2000 раз 5-25 раз процедура чтения не смогла найти байт начала данных в потоке данных от карточки после команды чтения. Может такие сбои - норма. А вот пару раз карточка вела себя неадекватно - на любую команду начинала выдавать ответ R1 0x05. Это вроде Idle и Illegal command - но не могут же все команды быть иллегальными? Пробовал руками вбивать все команды - на все такой ответ, кроме CMD0. На CMD0 ответ правильный 0x01, но это не помогало - на остальные команды все равно отвечала 0x05. Кому знакомы такие симптомы?
|
|
|
|
|
Jan 25 2008, 06:57
|
Группа: Участник
Сообщений: 14
Регистрация: 23-01-08
Пользователь №: 34 349

|
Цитата(etoja @ Jan 25 2008, 07:07)  Это ненормально. Проверьте правильность временной диаграммы: 1) SPI 2) транзакции команды для карточки памяти. Я тоже думаю, что это не нормально. Однако: 1. Я проверил правильность посылки команд и приема ответов по диаграммам, данным в спецификации на катры от SanDisk-a. Там все четко нарисовано, побитно. У меня все так же и реализовано. Думаю, если бы SPI был бы неправильно реализован, то не проходила бы ни одна команда. 2. Если шагать по функциям чтения/записи в отладчике, то ошибок нет, все работает. А вот когда отладчик отпускает процессор в свободный бег - то появляются такие ошибки, причем не сразу, может пару сотен секторов записать а только потом возникнет ошибка.
|
|
|
|
|
Jan 25 2008, 09:20
|
Группа: Участник
Сообщений: 14
Регистрация: 23-01-08
Пользователь №: 34 349

|
Сегодня добавил еще один коненсатор на питание (хотя подозрения насчет питания и не оправдались) и подтягивающие резисторы на линии входных/выходных данных. Результаты те же. Если подробнее то ситуация такая: 1. Вызывается функция записи сектора и выполняется успешно 2. Затем вызывается функция ожидания освобождения карточки памяти, т.е. отсылает пустые байты и проверяет полученные до появления трех последовательных 0xFF. 3. Вызывается функция чтения. Ошибка происходдит при поиске стартового байта пакета данных. Когда отладчик останавливается на точке останова в подфункции поиска стартового байта я вижу что последний входной байт был равен 0??? Т.е. карточка вроде как еще занята, хотя в пункте 2 было зафиксировано несколько 0xFF, т.е. карточка освободилась. Если в этот момент руками послать пару пустых байт карточке, то входные байты станут 0xFF и будут постоянно такими пока посылаю байты. Если после этого заново послать карте команду считывания блока, то все нормально считается. Как для меня - то я не понимаю что происходит с карточкой. Разве карточка может войти в режим Busy после получения команды о считывании блока?
|
|
|
|
|
Feb 3 2008, 14:26
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 4-03-05
Из: Киев
Пользователь №: 3 078

|
Цитата(М430 @ Jan 25 2008, 11:20)  1. Вызывается функция записи сектора и выполняется успешно 2. Затем вызывается функция ожидания освобождения карточки памяти, т.е. отсылает пустые байты и проверяет полученные до появления трех последовательных 0xFF. 1. в указанном примере после записи, вызывается функция mmcCheckBusy, читайте сразу, без повторного вызова проверки Busy. 2. резисторы лучьше установить.
|
|
|
|
|
Feb 18 2008, 10:50
|

Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729

|
Цитата(NoName @ Feb 3 2008, 17:26)  читайте сразу, без повторного вызова проверки mmcCheckBusy резисторы лучше установить. заработало ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|