Перейти к содержанию
    

yachnyymaxim

Участник
  • Постов

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. MSP430F47186 и SD16_A

    Добрый день. Включаю новый процессор от Техаса MSP430F47186. Обнаружил некоторые неожиданности при работе с сигма дельта преобразователем. В документации указано, что АЦП имеет 6 абсолютно независимых каналов, которые можно скоммутировать с любыми аналоговыми входами +-A0 - +-A4. (Интересно, что входов у микросхемы 6, но A5 нельзя ни с кем скоммутировать) с помощью бит SD16INCHx в регистрах SD16INCTLx. Однако после целого дня попыток запустить АЦП выяснилось, что каждый внутренний канал CHANNEL_X можно скоммутировать только с соответствующим ему входом - т.е. если внутренний канал номер 1, то к нему можно подключить только вход А1. А вот внутренний датчик температуры и делитель Vcc/11 можно подключить к любому каналу с помощью бит SD16INCHx. И если я захочу использовать с каналом 1 вход А3, например, то в регистр SD16MEM1 будет попадать нечто, что соответствует закороченному входу + смещение PGA. Я думал что это баг АЦП, почитал Errata - нет никаких багов, связанных с SD16_A. Кто работал с этим процессором - такие же результаты или нет?
  2. День добрый, форумчане. Появился вопрос следующего характера. Купил я новую MicroSD карту от Transcend-а и вставил в свой прибор. И обнаружил неприятную особенность: после выполнения записи одного 512 байтного блока не усыпает, а на протяжении ~300 мс гребет ток в 18 мА, а только потом отключается. Ранее использованные мною карты этого производителя так себя не вели - отключались сразу после записи. Я пишу на карту 10 раз в секунду, и вместо 1,5 мА среднего тока получаю почти 20. Самое интересное, что взятая для сравнения карта с маркировкой NOKIA ведет себя примерно так же, разве что усыпает немного быстрее - за 260 мс. Я так предполагаю, что это некоторая оптимизация для ускорения записи на карту, но как бы ее отключить? Буду признателен за советы.
  3. И еще интересный момент. В вышеописанных условиях первый сбой происходит на 373 секторе, а вот следующий сбой - на 629, т.е. с интервалом 256 секторов!!! Из любопытства уменьшил интервал записи секторов с 110 мс до 96. Получил первый сбой на 253 секторе (как-то не пропорционально с интервалом получилось), а вот следующий - на 509 - снова через 256 секторов!!! Что за магическое число 256 секторов для SD карты и почему так происходит вообще?
  4. Ну в таком случае это какой-то блок из 256 секторов - но я нигде не видел упоминание об этом. И еще - я пишу непрерывно, начиная с 66 сектора в файле на карте, а этот 66 сектор файла смещен относительно начала карточки на 95 секторов. Получаем начало в 161 секторе от начала карточки. Отладчикм посмотрел, что длительное ожидание происходит на 373 секторе файла, т.е. на 534 секторе от начала карточки. Но ведь это явно не блок, и явно не кратно 256. Короче, полная загадка.
  5. Доброго дня. Имею аналогичную проблему с MicroSD картой. Начинаю писать на нее поток данных со скоростью примерно один сектор в 110 мс. Пишет корректно, однако один раз в 28 секунд (это я замерял, какое-то магическое числ небось) карточка держит сигнал BUSY слишком долго (до 80 мс), хотя в остальное время BUSY пропадает практически сразу после записи. Вот уже несколько дней думаю о причинах такого поведения, но как-то ничего не придумывается. Может кто знает?
  6. Удивительно, как у тебя все заработало даже после того, как ты нашел свое EINT(). По-идее если ты хочешь чтобы на P1.1 выдавался сигнал, то надо делать P1OUT = 0х02, иначе дергаться будет P1.0
  7. Сегодня добавил еще один коненсатор на питание (хотя подозрения насчет питания и не оправдались) и подтягивающие резисторы на линии входных/выходных данных. Результаты те же. Если подробнее то ситуация такая: 1. Вызывается функция записи сектора и выполняется успешно 2. Затем вызывается функция ожидания освобождения карточки памяти, т.е. отсылает пустые байты и проверяет полученные до появления трех последовательных 0xFF. 3. Вызывается функция чтения. Ошибка происходдит при поиске стартового байта пакета данных. Когда отладчик останавливается на точке останова в подфункции поиска стартового байта я вижу что последний входной байт был равен 0??? Т.е. карточка вроде как еще занята, хотя в пункте 2 было зафиксировано несколько 0xFF, т.е. карточка освободилась. Если в этот момент руками послать пару пустых байт карточке, то входные байты станут 0xFF и будут постоянно такими пока посылаю байты. Если после этого заново послать карте команду считывания блока, то все нормально считается. Как для меня - то я не понимаю что происходит с карточкой. Разве карточка может войти в режим Busy после получения команды о считывании блока?
  8. Я тоже думаю, что это не нормально. Однако: 1. Я проверил правильность посылки команд и приема ответов по диаграммам, данным в спецификации на катры от SanDisk-a. Там все четко нарисовано, побитно. У меня все так же и реализовано. Думаю, если бы SPI был бы неправильно реализован, то не проходила бы ни одна команда. 2. Если шагать по функциям чтения/записи в отладчике, то ошибок нет, все работает. А вот когда отладчик отпускает процессор в свободный бег - то появляются такие ошибки, причем не сразу, может пару сотен секторов записать а только потом возникнет ошибка.
  9. Сегодня проверил конденсаторы, даже добавил еще один на всякий случай - не помогло. Слепил тестовый прогон - записывал и сразу после записи считывал 2000 секторов, сравнивая результаты. Ошибок, собственно в данных, нет. Однако из 2000 раз 5-25 раз процедура чтения не смогла найти байт начала данных в потоке данных от карточки после команды чтения. Может такие сбои - норма. А вот пару раз карточка вела себя неадекватно - на любую команду начинала выдавать ответ R1 0x05. Это вроде Idle и Illegal command - но не могут же все команды быть иллегальными? Пробовал руками вбивать все команды - на все такой ответ, кроме CMD0. На CMD0 ответ правильный 0x01, но это не помогало - на остальные команды все равно отвечала 0x05. Кому знакомы такие симптомы?
  10. Ну с версией 4.10 у меня не сложилось - постоянно падает. Интересно что проект открывает, если нажать сразу на Debug - то или просто завершается ничего не сказав, или вылетает стандартное окошко с просьбой отослать данные для анализа "что произошло" в IAR. А если сделать Rebuild all а затем Debug - все работает, заливается и отлаживается. Но стоит что-то исправить, то после частичной компиляции снова начинает падать при попытке нажать Debug. Были ли у кого-то такие симптомы?
  11. Хорошая у вас документация. А в даташите на мой Transcend TS1GUSD вообще рекомендуемой схемы подключения нет. Резисторы подтягивающие не ставил, т.к. 430 хорошо удерживает свои порты, еще ни разу не видел чтобы они у него плыли. Но попробую, если ничего не поможет. Конденсаторы на линии - это же только для больших частот обмена. Я пробовал запускать на 250 кГц SPI синхросигнала - и все равно то же самое. Питание я заподозрил с самого начала, хотя там стоит 0,1 + 2,2 мкф параллельно. Даже тектрониксом смотрел насчет проседаания питания в моменты стирания/записи. И ничего не увидел. Но сегодня с утра пропаял конденсаторы еще раз - может поможет? Ошибки в ФАТ нет, уже проверял. Виснет именно на низкоуровневых функциях чтения/записи сектора. Да и сомнительно, что неправильная реализация ФАТ могла бы так повесить карту. А вот с контактами это грустно - надо выпаивать разъем, ведь так не проверить контакт. Хотя я шатал плату в момент работы и зависимости между зависанием и механическим воздействием не заметил.
  12. Да, вы правы. Компилятор все правильно сделал. Я уже и сам потом посмотрел и понял, что это я лапух. Конец дня и все такое, башка не варит. А чего я именно за это ухватился - при переходе на 4,10 версию программа зацикливалась на этом месте, хотя в предыдущей все работало. Буду разбираться что не так. А у вас часто бывает, что при переходе на новую среду разработки что-то перестает работать и надо подправлять исходный код?
  13. Уважаемые, а кто может объяснить такое поведение компилятора: С код: if( !(response & 0x80) ) А вот что сделал компилятор: CMP.B #0x0, R13 Хочу заметить, что компилятор из версии 3.42А давал другой код, но тоже неправильный: TST.B R13 А если поменять немного, другой бит проверять: if( !(response & 0x40) ) То компилятор дает правильный код: BIT.B #0x40, R13 Может я чего не понимаю? response - беззнаковое 8 битное число.
  14. Уважаемые форумчане, есть к вам вопрос. Итак, есть микроконтроллер 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. Но происходит все время при перезаписи сектора таблицы размещения - т.е. секторов, которые используются многократно. Может есть какая-то хитрость при работе с карточками? У кого есть опыт, поделитесь. Заранее спасибо
×
×
  • Создать...