Jump to content

    
Sign in to follow this  
yachnyymaxim

Проблема с MicroSD картой. Кто поможет?

Recommended Posts

Уважаемые форумчане, есть к вам вопрос.

 

Итак, есть микроконтроллер 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. Но происходит все время при перезаписи сектора таблицы размещения - т.е. секторов, которые используются многократно. Может есть какая-то хитрость при работе с карточками? У кого есть опыт, поделитесь.

 

Заранее спасибо

Share this post


Link to post
Share on other sites

Проверьте:

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

2) наличие керамического конденсатора 1uF параллельно питанию карточки рядом с контактами разъёма карточки.

 

У меня непрерывная запись в файл длиной 1Гигабайт идёт устойчиво (использую FAT16).

 

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

Если она проходит удачно, значит у вас ошибка в реализации FAT.

 

Хотя может быть просто плохой контакт карточки в разъёме.

SD_connection.pdf

Share this post


Link to post
Share on other sites
Проверьте:

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

2) наличие керамического конденсатора 1uF параллельно питанию карточки рядом с контактами разъёма карточки.

 

У меня непрерывная запись в файл длиной 1Гигабайт идёт устойчиво (использую FAT16).

 

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

Если она проходит удачно, значит у вас ошибка в реализации FAT.

 

Хотя может быть просто плохой контакт карточки в разъёме.

 

Хорошая у вас документация. А в даташите на мой Transcend TS1GUSD вообще рекомендуемой схемы подключения нет.

Резисторы подтягивающие не ставил, т.к. 430 хорошо удерживает свои порты, еще ни разу не видел чтобы они у него плыли. Но попробую, если ничего не поможет. Конденсаторы на линии - это же только для больших частот обмена. Я пробовал запускать на 250 кГц SPI синхросигнала - и все равно то же самое.

Питание я заподозрил с самого начала, хотя там стоит 0,1 + 2,2 мкф параллельно. Даже тектрониксом смотрел насчет проседаания питания в моменты стирания/записи. И ничего не увидел. Но сегодня с утра пропаял конденсаторы еще раз - может поможет?

 

Ошибки в ФАТ нет, уже проверял. Виснет именно на низкоуровневых функциях чтения/записи сектора. Да и сомнительно, что неправильная реализация ФАТ могла бы так повесить карту.

 

А вот с контактами это грустно - надо выпаивать разъем, ведь так не проверить контакт. Хотя я шатал плату в момент работы и зависимости между зависанием и механическим воздействием не заметил.

Share this post


Link to post
Share on other sites
Хорошая у вас документация. А в даташите на мой Transcend TS1GUSD вообще рекомендуемой схемы подключения нет.

Резисторы подтягивающие не ставил, т.к. 430 хорошо удерживает свои порты, еще ни разу не видел чтобы они у него плыли. Но попробую, если ничего не поможет. Конденсаторы на линии - это же только для больших частот обмена. Я пробовал запускать на 250 кГц SPI синхросигнала - и все равно то же самое.

Питание я заподозрил с самого начала, хотя там стоит 0,1 + 2,2 мкф параллельно. Даже тектрониксом смотрел насчет проседаания питания в моменты стирания/записи. И ничего не увидел. Но сегодня с утра пропаял конденсаторы еще раз - может поможет?

 

Ошибки в ФАТ нет, уже проверял. Виснет именно на низкоуровневых функциях чтения/записи сектора. Да и сомнительно, что неправильная реализация ФАТ могла бы так повесить карту.

 

А вот с контактами это грустно - надо выпаивать разъем, ведь так не проверить контакт. Хотя я шатал плату в момент работы и зависимости между зависанием и механическим воздействием не заметил.

В момент записи ток потребления выростает в 3 раза,может стабилизатор не справляется?

Share this post


Link to post
Share on other sites
Проверьте:

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

2) наличие керамического конденсатора 1uF параллельно питанию карточки рядом с контактами разъёма карточки.

 

У меня непрерывная запись в файл длиной 1Гигабайт идёт устойчиво (использую FAT16).

 

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

Если она проходит удачно, значит у вас ошибка в реализации FAT.

 

Хотя может быть просто плохой контакт карточки в разъёме.

 

Сегодня проверил конденсаторы, даже добавил еще один на всякий случай - не помогло.

Слепил тестовый прогон - записывал и сразу после записи считывал 2000 секторов, сравнивая результаты. Ошибок, собственно в данных, нет. Однако из 2000 раз 5-25 раз процедура чтения не смогла найти байт начала данных в потоке данных от карточки после команды чтения. Может такие сбои - норма.

А вот пару раз карточка вела себя неадекватно - на любую команду начинала выдавать ответ R1 0x05. Это вроде Idle и Illegal command - но не могут же все команды быть иллегальными? Пробовал руками вбивать все команды - на все такой ответ, кроме CMD0. На CMD0 ответ правильный 0x01, но это не помогало - на остальные команды все равно отвечала 0x05. Кому знакомы такие симптомы?

Share this post


Link to post
Share on other sites
Это ненормально.

Проверьте правильность временной диаграммы:

1) SPI

2) транзакции команды для карточки памяти.

 

Я тоже думаю, что это не нормально. Однако:

1. Я проверил правильность посылки команд и приема ответов по диаграммам, данным в спецификации на катры от SanDisk-a. Там все четко нарисовано, побитно. У меня все так же и реализовано. Думаю, если бы SPI был бы неправильно реализован, то не проходила бы ни одна команда.

2. Если шагать по функциям чтения/записи в отладчике, то ошибок нет, все работает. А вот когда отладчик отпускает процессор в свободный бег - то появляются такие ошибки, причем не сразу, может пару сотен секторов записать а только потом возникнет ошибка.

Share this post


Link to post
Share on other sites

Сегодня добавил еще один коненсатор на питание (хотя подозрения насчет питания и не оправдались) и подтягивающие резисторы на линии входных/выходных данных. Результаты те же.

Если подробнее то ситуация такая:

1. Вызывается функция записи сектора и выполняется успешно

2. Затем вызывается функция ожидания освобождения карточки памяти, т.е. отсылает пустые байты и проверяет полученные до появления трех последовательных 0xFF.

3. Вызывается функция чтения. Ошибка происходдит при поиске стартового байта пакета данных. Когда отладчик останавливается на точке останова в подфункции поиска стартового байта я вижу что последний входной байт был равен 0??? Т.е. карточка вроде как еще занята, хотя в пункте 2 было зафиксировано несколько 0xFF, т.е. карточка освободилась. Если в этот момент руками послать пару пустых байт карточке, то входные байты станут 0xFF и будут постоянно такими пока посылаю байты.

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

Как для меня - то я не понимаю что происходит с карточкой.

Разве карточка может войти в режим Busy после получения команды о считывании блока?

Share this post


Link to post
Share on other sites
1. Вызывается функция записи сектора и выполняется успешно

2. Затем вызывается функция ожидания освобождения карточки памяти, т.е. отсылает пустые байты и проверяет полученные до появления трех последовательных 0xFF.

 

1. в указанном примере после записи, вызывается функция mmcCheckBusy,

читайте сразу, без повторного вызова проверки Busy. :)

 

2. резисторы лучьше установить.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this