Отладчик i2c SPI 1-wire

После того как NXP прислали мне кучу всяких микросхем с интерфейсом i2c, я начал их раскуривать некоторые из них. Как известно работа с i2c устройствами сводится к тому, чтоб записать или считать значения хранящиеся в определённых регистрах микросхемы. Обычно на время изучения какой либо микрухи я городил на своей отладочной плате небольшой макет из контроллера, программатора, RS232<-> UART преобразователя и непосредственно самой микросхемы. Через компьютер посылаются команды и контроллер что-то передаёт по шине i2c или наоборот читает, отправляет стартовые и стоповые посылки итд. Примерно таким же образом у меня происходит процесс изучение микросхем с интерфейсами SPI и 1-wire. Чтоб не городить каждый раз тестовый макет было принято решение собрать универсальный отладчик с поддержкой протоколов i2c SPI и 1-wire.

Отладчик i2c SPI 1-wire


Сердцем девайса является микроконтроллер атмега8 в дип корпусе. Почему в дип? Потому что я давно мечтал его куда-то пристроить т.к. выводные детали мной уже почти не используются. Контроллер работает на частоте 8 МГц, этой частоты вполне достаточно да и при пониженном напряжении питания он должен работать вполне стабильно если верить даташиту. У отладчика существуют два рабочих напряжения: 3.3 вольта и 5 вольт. Сделано это для того чтоб не мучиться с согласованием логических уровней у микросхем которые питаются от 3.3 вольт.  Пониженное напряжение создаётся low drop стабилизатором и включается тумблером на плате. Вторая немаловажная микросхема это преобразователь интерфейса USB — UART на новой для меня микросхеме CP2102. Микросхема хорошо себя зарекомендовала: Ком порт не отваливается, скорость передачи данных высокая. И конечно цена тоже вполне адекватная (~2.5$).  Короче вполне достойная альтернатива FT232. Если нет свободного USB порта но есть лишний ком порт, то вполне запросто можно выкинуть эту микросхему и сделать преобразователь уровней на MAX232. Сойдет даже вот такой самодельный преобразователь интерфейсов о котором я писал ранее. Скажу сразу что микросхема очень мелкая:

Отладчик i2c SPI 1-wire

Запаять такое с феном не проблема, на счёт паяльника ничего сказать не могу. Запаивать её нужно так: На контактные площадки равномерно наносятся крошечные шарики припоя. Потом всё это дело щедро смазывается флюсом (я юзал обычный СКФ). После этого надо чтоб флюс немного подсох для загустения. Теперь самое важное — аккуратно поставить микросхему. За счёт флюса она прилипнет и никуда теперь не денется. После этого берем фен и греем до полного припаивания. Греть надо осторожно, следить чтоб флюс не закипал и не брызгался, в противном случае микросхему просто может сместить с её места брызгами. Кстати в процессе работы микросхема тёплая самую малость (едва уловимо если трогать рукой). Кроме этих двух микросхем почти ничего интересного больше в схеме нет:

Отладчик i2c SPI 1-wire

Для шины i2c и 1-wire нужна подтяжка. В данном устройстве она программно отключаемая, т.к. это весьма удобном потому что иногда эти резисторы уже могут быть впаяны в плату с какой либо i2c или 1-wire микросхемой. Так же есть возможность программно управлять питанием подключенного устройства. Для этого служит транзистор T1. Ставить можно любой p-n-p лишь бы тянул через себя нужный ток.  Так же в устройстве есть три светодиода: Зеленый — индикатор питания, Желтый — индикатор активности и Красный индикатор питания подключаемого устройства. В устройстве предусмотрена простенькая защита от короткого замыкания в виде токоограничивающих резисторов на тех линиях микроконтроллера которые являются выходами. Кроме линий входящих в интерфейсы i2c SPI и 1-wire так же присутствует линия f1. Её состояние может управляться программно. Пока не знаю для чего её использовать, просто сделал на будущее. Поскольку корпуса у меня пока нет, (он в пути) то пока юзаю голую платку. Все детали кроме контроллера в SMD исполнении:

Отладчик i2c SPI 1-wire

Самое сложное в этом устройстве это софт. Поскольку в процессе написания прошивки приходилось часто перепрошивать контроллер, то я впервые решил воспользоваться загрузчиком который совместим с программой прошивальщиком AVRPROG которая входит в состав AVR студии. Для того чтоб прошить контроллер в устройстве нужно подсоединить его к порту USB и в течении семи секунд пока горят все три светодиода, запустить прошивальщик. Если всё ок то выскочит окно с интуитивно понятным интерфейсом где нужно выбрать прошивку и нажать кнопку «прошить». Если прошивальщик не видит устройства то нужно поменять номер ком пора у вашего устройства. Желательно установить его в первом десятке ком портов. У меня например он висит на COM5 и всё отлично работает. Если программа для управления отладчиком не хочется конектиться к устройство, то причины и средства устранения те же — сменить номер порта в диспетчере устройств. Прошивка самого устройства не сильно замысловатая: Её задача просто напросто принимать байт по UART и определённым образом дрыгать ногами микроконтроллера. Написана она на микропаскале и подробно рассматриваться тут не будет. Исходник доступен — можете посмотреть сами что там и как. (Больше не доступен. Если очень надо — пишите на почту.) А вот про управляющую программу для компа стоит рассказать подробнее. Существуют три режима работы, по одному на каждый интерфейс: i2c, 1-wire и SPI. О каждом режиме по порядку:

I2C

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

  • i2c_start — отправляет стартовую посылку
  • i2c_stop — отправляет стоповую посылку
  • i2c_write — отправляет байт в шину i2c
  • i2c_read — читает байт из шины i2c
  • i2c_read_last — читает последний байт из шины i2c

Кроме стандартных, было реализованы две дополнительные команды облегчающих работу с шиной:

  • i2c_write_reg — записать определённые данные в определённый регистр
  • i2c_read_reg  — прочитать данные из определённого регистра

Для корректной работы этих двух команд, должен быть верно указан адрес устройства (набор галочек сверху).  Как уже писалось выше — девайс поддерживает программное управление подтяжкой. Для этого используются следующие команды:

  • i2c_pullup_on — включить подтяжку
  • i2c_pullup_off  — выключить подтяжку

Для любого из трёх режимов существуют три одинаковые команды:

  • delay — задерживает выполнение следующей команды на заданное время
  • power_on — включает питание подключенного устройства
  • power_off — отключает питание

Отладчик i2c SPI 1-wire

Сейчас к отладчику подключена платка часов реального времени. На часах 15:47:33.

1-wire

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

  • 1-wire_read — читаем байт из шины
  • 1-wire_write — пишем байт
  • 1-wire_reset — подаем в шину импульс сброса
  • 1-wire_pullup_on — подтянуть шину
  • 1-wire_pullup_off — выключить встроенную подтяжку

Поскольку ничего с данным интерфейсом кроме датчика DS18B20 у меня не было то подключил его:

Отладчик i2c SPI 1-wire

Сейчас датчик показывает температуру 26 градусов выше ноля.

SPI

Команды вполне очевидные:

  • spi_read — читаем байт из SPI
  • spi_write — пишем байт
  • spi_set_cs_1 — устанавливаем ChipSelect в единицу
  • spi_set_cs_0 устанавливаем ChipSelect в ноль

Ни какого девайса со SPI интерфейсом под руку не попалось, но судя по показаниям осциллографа всё работает адекватно.  Поэтому картинки тут не будет :-)

Чтоб всё заработало, нужно установить фьюзы.  Есть два варианта настройки фьюзов:  С использованием загрузчика  и без его использования. Пока я отлаживал весь этот софт, контроллер прошивался бесчисленное количество раз и постоянно подключать программатор мне надоело и я залил загрузчик. Это позволило прошивать контроллер прямо через USB порт. Загрузчик совместимый с AvrProg (есть в папке с AVR студией). Рекомендую сделать так же. Для того чтоб юзать загрузчик нужно прошить фьюзы так:

Отладчик i2c SPI 1-wire

После включения устройства с прошитым загрузчиком все три светодиода будут гореть около 7 секунд. За это время нужно успеть запустить AvrProg.  Если прошивальщик обнаружил загрузчик то откроется окно в котором нужно просто выбрать файл прошивки и нажать запись.

Если возможность прошивки через USB вам не нужна, то фьюзы можно ставить так:

Отладчик i2c SPI 1-wire

Ни каких других настроек не требуется. Ну разве что указать номер порта в настройках программы.

P.S. софт еще очень и очень сырой, поэтому скорее всего встретятся глюки о которых прошу сообщать сюды.

Скачать файлы проекта

Отладчик i2c SPI 1-wire: 177 комментариев

  1. Medved выручай, собрал отладчик,преобразователь интерфейса USB–UART использую на FT232RL, прошил МК файлом mu_debug.hex (прошивал CodeVision programmer` ом)
    фьюзы выставил вроде правильно горит зеленый светодиод, преобразователь исправен в проге «терминал» замыкаю rxd и txd все предаю и получаю, подключаю к отладчику ничего. Пробовал отправлять через «терминал» в отладчик «a» как описано выше «борода», что делать? хотел с помощью отладчика разобраться c LM75

    1. пока все также, изменил прошивку, сейчас контроллер постоянно шлет р на ком-порт, а приходит мусор. Правда я не поставил керамику на питание, смд под рукой нет

  2. я думаю это не критично, я уже не знаю что делать, кварц поменял, осцилом проверил генерация 8Мгц есть, и все также горит зеленый светодиод, а ответ тишина

    1. Я использую PL2303 проблем быть не должно, а на те — мусорит в Терминал пишет вместо буквы, но при замыкании — эхо есть, проблема похоже либо в плате (от канифоли еще не отмывал), либо в прошивке (что тоже маловероятно если у автора она работает).

  3. сейчас заметил питание +5В беру с USB, отключаю питание +5В которое беру с преобразователя в терминале появляется ответ отладчика в виде «мусора», наверное надо здесь копать

    1. Проблема таки в прошивке, надо копать, сейчас залил простую программу эхо из примеров microPascal — работает замечательно, т.е. и плата и конвертер живее всех живых, без внешнего питания ( тоже от ЮСБ) сыплет мусором. Сейчас опять оригинальную прошивку залью и если не заработает — буду ковырять по полной, возможно ошибка связана с буфером, в общем будем посмотреть) когда до ума доведу — выложу потестишь.

  4. Победил таки девайс. Дело было в прошивке. А точнее в кривой реализации функции UART1_Read_Text. Не желала она работать как указано в описании, и соответственно пришлось ее переписать. Так, что заменил ее и плюс добавил эхо и вывел тактовую на желтый светик для контроля. Теперь пошлю исправленный сорц автору. Решение выкладывать мод или нет за ним.

  5. вышли мне на мыло (m_say@mail.ru) хоть протестирую, я уже задолбался, отладчик собирал на макетке с использованием МГТФ, все проверил, поменял преобразователь, даже нашел у себя в хламе преобразователь на мах232 результат ноль, ну думаю все ручонки опускаются-)

    1. Выслал хекс. Кстати, я во всех режимах устройство не тестировал, так глянул, что на шине I2C работает подтяжка, чтение, паузы, а реально смотреть буду уже завтра к вечеру.

      1. заменил UART1_Read_Text на UART1_Read, опрос в терминале пошел нормальный, только вот прога не видит устройство по прежнему =\ кодом измененного
        UART1_Read_Text не поделитесь?

  6. В общем в переделанной функции мне вежливо отказали) Но дебаггер вроде победил, нужны тесты. Заменил UART1_Read_Text на UART1_Read, как и писал выше, а в самой программе — строки которые направляются в МК (ааа -> a). девайс завелся. MicroElectronik’у — на мыло!

    1. Согласен, с продукцией MikroE нужно держать ухо востро. Уже в третий раз нарываюсь на их косяки. Очень напрягает закрытость их встроенных библиотек. А по-поводу замены функции UART_Read_text, я не стал реализовывать весь функционал, а только то, что необходимо для работы именно этой проги — всего-то дюжину строчек кода.

        1. Будут ли нормально отрабатываться команды, если нужно будет передать код 33 (делимитер) в качестве данных? Например:
          ...
          i2c_write(33) или i2c_write_reg(33, 33)
          i2c_read
          ...
          У меня, например, в первой версии исправлений, ошибка была.

            1. Конечно. Дело не в использованном коде, а в том, что делимитер (один или несколько символов) не должен встречаться среди данных. Иначе нет разницы при выделении команды — данные или делимитер.

              1. Полностью согласен, проблема в том, что контроллеру может быть передана любая последовательность байт, соответственно всегда есть шанс, пусть и мизерный, что данная последовательность будет делимитером. Надо подумать, может будет правильным, хоть и не самым производительным решением, делимитером всегда считать 8ой байт?

                1. Мне кажется, самым простым алгоритмом будет, выборка непосредственно командой своих аргументов из входного потока. Тогда делимитеры вообще не нужны. Только начальная последовательность для синхронизации, а затем побайтная выборка — сначала код команды, сразу же ее дешифровка и выборка нужного количества байт аргументов. Затем сразу же во входном потоке идет байт кода следующей команды, без каких либо делимитеров. При ошибочном коде команды, передатчику посылаются код ошибки с каждым байтом, пока не поступит новая последовательность синхронизации.

  7. погорячился) не обратил внимание на то, что не все команды вида ааа, пришлось таки переписать функцию и программу, все работает. Насчет самого UART1_Read_Text разработчику пишут, что это не баг, а фича)

  8. Игорь_707, спасибо почту получил, прошил МК, в терминале отправляю «a» потом 2 раза «ввод» в ответ получаю р (пока все нормально). Запустил программу отладчика пытаюсь определить порт автодетектом в ответ «уст-во обнаружить не удалось», пробую соеденится с отладчиком «соеденение есть» подключаю lm75, коротко прошел по командам питание подает и снимает, с подтягивающими резисторами тоже все нормально, пока все, буду тестить дальше
    еще раз спасибо

    1. На автодетекте, по-моему слишком маленький таймаут стоит — 5ms. А отправить — получить 6 байт на скорости 19200 уже 2,7ms. А еще эти данные нужно по FS USB пропихнуть, вот и проскакивает прога с автодетектом.

      1. Уважаемый Игорь! А можно и мне выслать прошивку и исходник последней версии? Пожалуйста! :) И я так понял что прога тоже претерпела изменений, можно и ее скинуть и исходник тоже?
        «artyombooster@rambler.ru»
        С ув. Артем
        Появилось вновь желание поднять сей девайс

  9. ну вроде все работает, пообщался с LM75 (прочитал Temp, Conf, Thist, Tos, записал Thist, Tos), 1wire пока не пробовал.
    Спсибо автору устройства (прикольная штука), Special thanks Igor_707-)
    за ответы и «оживление» темы.

  10. Случайно заметил, что выполнение команд на шине I2C, происходит с интервалом ~20ms между командами. Могу предположить, что это связано с логикой работы преобразователя USB-UART. Я использую MCP2200 (Microchip)в этом качестве. Хотел бы знать, есть ли задержки с другими чипами преобразователя?

  11. у меня на выполнение двух десятков команд уходит примерно секунда (определяю чисто визуально), хотя не знаю как зрительно заметить задержку в 20 ms, использую 232rl. И еще по доработке софта отладчика если можно было бы добавлять коменты к строчкам команд (в четвертом столбце например), а еще добавить функцию редактирования (типа копировать, вставить строку с командой) было бы вообще здорово, но это вопрос уже к автору отладчика.

    1. Ну, я смотрел «вооруженным» глазом — при помощи самодельного USBee AX/Logic-U. И у вас, похоже, ситуация таже, если 20 команд выполняются за секунду. А по-поводу редактирования, можно сохранить команды в текстовый файл (*.dbg), и его потом редактировать как душе угодно.

  12. никто не подскажет как с помощью отладчика (считать, записть) данные с 24С01 (м/с идет с тубусом тест полосок от глюкометра акучегоу, она там на платке уже распаянная) я попробовал подключить к отладчику руководствуясь статьей с сайта, но что-то не получается, был бы очень признателен…

      1. плохой контакт(когда подпаивал sda и scl МГТФ-ом к ответной части разъема исп-л спиртоканифольный флюс видать затекло внутрь, сейчас промыл нормально) возник вопрос, при первом запуске такого набора команд получаю:
        «i2c_pullup_on»,»NO»,»OK»
        «power_on»,»NO»,»OK»
        «i2c_start»,»NO»,»OK»
        «i2c_write»,»0xA0″,»ASK»
        «i2c_write»,»0x10″,»ASK»
        «i2c_start»,»NO»,»OK»
        «i2c_write»,»0xA1″,»ASK»
        «i2c_read»,»NO»,»0x00″
        «i2c_stop»,»NO»,»OK»
        «power_off»,»NO»,»OK»
        «i2c_pullup_off»,»NO»,»OK»
        при втором запуске уже:
        «i2c_pullup_on»,»NO»,»OK»
        «power_on»,»NO»,»OK»
        «i2c_start»,»NO»,»OK»
        «i2c_write»,»0xA0″,»ASK»
        «i2c_write»,»0x10″,»ASK»
        «i2c_start»,»NO»,»OK»
        «i2c_write»,»0xA1″,»ASK»
        «i2c_read»,»NO»,»0x32″
        «i2c_stop»,»NO»,»OK»
        «power_off»,»NO»,»OK»
        «i2c_pullup_off»,»NO»,»OK»
        почему так?

  13. Добрый день уважаемые.
    Мож кто подскажет чайнику. Собрал устройство (автору отдельное спасибо), но возник следующий трабл. Все работает, кроме самой шины i2c. Т.е. контроллер по командам включает-выключает подтяжку, питание, паузу, а команды шины (старт-стоп- чтение и т.д.)- просто тишина на линии (стабильно высокий уровень, т.к. поддтяжка включена).
    Отличие от авторской схемы только в корпусе меги (корпус TQFP вместо DIP) и FT232 вместо CP2102. Ну и еще мега от внутреннего кварца работает.
    В качестве слейва пока никого не подключал, просто пробывал осцилографом SDA и SCL слушать.
    Еще один странный момент: по командt i2c_write результат приходит »ASK», хотя некому »ASK» то отсылать некому (слейва нет).
    С I2C только начинаю разбираться, по этому прошу помощи. Может кто укажет грабли которые я не заметил?

    1. У корпусов TQFP и дип нумерация ног разная. В это мог быть косяк. Если при i2c_write кто-то отвечает то это говорит о том что на линии SDA постоянно низкий уровень по какой-то причине.

      1. Да нет, про ноги у разных корпусов я знаю, смотрел специально по даташиту чтоб все совпадало. Да я низким уровнем на обоих линиях (SDA и SCL) и не пахло не при каких телодвижениях. Только если подтяжку отключить. Такое впечатление, что никаких команд на шину вообще не поступает.
        Грешу на кристалл (попробую сегодня на DIP переделать). Ну и еще фьюзы перепроверю, а то я не сильно большое внимание им уделил (так, частоту выставил и все).

  14. Слейв молчит ((. т.е. после старта и передачи адреса с битом R\W получаю NASK. Хотя отдельно устройство работает (со сторонней прошивкой)

    Чет не могу догнать. Почему при отсылке даже единственной i2c_start обе линии (SDA и SCL)уходят в ноль и поднимаются только при i2c_stop.

      1. У меня атмега8а, 8меГц кварц, фьюзы DB 6E, мега 8A-PU связь через 2303(USB>COM).
        Вроде как прошивочку чуть доработали и пускается уверено.
        Отладчик i2c SPI 1-wire

  15. Бестолочь я. Вместо полного байта с битом направления в конце, только 7 бит адреса устройства отправлял. и ждал ответа, долго… Все работает!!!. Автору РЕСПЕКТ.

  16. Благодарю полезная в будущем софтина.
    я вот только не понял в режиме I2C если я передаю данные,устройство же должно что-то ответить софт сам переходит в режим слушания что отвечает чип ?

  17. Респект Вам!!!
    Medved & Игорь_707 !!!!
    Medved за идею и вооплощение в реальность.
    Игорь_707 за оживление с PL2303.
    ********************************

    Вопрос к Medved, с ADXL312 как адресация если пытался раскурить ее?
    Одну ужо убил, перестала вообще отвечать.
    Если надумаешь, кн.F1 привяжи как вх/вых инт.( в девайсе произошло действие, F1-инт, симетировал нажатие пуск )

  18. Добрый день.
    Мож кто подскажет в чем трабл.
    debuger подключает устройство только с n-го раза. Т.е. Когда втыкаешь в USB, бывает сразу подключается, а бывает приходится портыкать раз так 20-30.Пока не появится заветная надпись «ПОДКЛЮЧЕНО» Я вобще человек терпеливый, могу и потыкать )), но этож не должно так быть.
    Устройство на FL232. Может с этой микросхемой прога не всегда корректно работает? Или прошивка устройства. Подскажите…
    Судя по сообщениям, исходную прошивку знающие люди уже под свои параметры переделывали. А так как я к таким себя пока не отношу, может кто поделится, конечно если дело в прошивке.

  19. Доброго, вечерка.
    Игорь_707, можно и мне прошивку доработанную. А то не хочет девайс нормально работать.
    атмега8, 8 МГц, связь через FL232(USB>COM).
    Если Игорь_707, не появиться скоро тут, тогда к Вам Aleks обращаюсь, поделитесь пожалуйста…

  20. Еще вопросик: какой компилятор использовался для меги8 и какой версии?
    поставил от микроелектроники версии 1.5 при компиляции вывалил кучу синтаксических ошибок…

  21. Cкачал mikropascal V4.6 Все компилится отлично!
    Изменил немного характер индикации.
    Хочу добавить аппаратные кнопки.
    Но всеравно нужна последняя версия исходника. Так как этого языка почти не знаю… ориентируюсь немного благодаря знанию языка СИ . И он немного похож. Кто нибудь, дайте же мне исходник последней версии! :)

  22. Добавил в исходник кнопку для аппаратного включения питания для девайса.

    if FLAGS_BUTTON=0 then
    begin
    if POWER_BUTTON=0 then
    begin

    if POWER=1 then
    begin
    POWER:=0;
    end
    else POWER:=1;

    FLAGS_BUTTON:=1;
    end;
    end;

    if POWER_BUTTON=1 then
    begin
    FLAGS_BUTTON:=0;
    end;

    delay_ms(50);

    Очень нужен исправленный исходник... :(
    Я-бы прилепил этот кусок к нему и уже залил бы в проц.

  23. Поделитесь пожалуйста исходником на мк и управляющей проги. sdram85@mail.ru
    Хочу совместить функционал работы с SPI c реализацией сниффера через USI отсюда
    http://we.easyelectronics.ru/AVR/sniffer-emulyator-i2c-i-1-wire.html#comment72104
    Тоесть в идеале мастер/сниффер режимы на 1-wire, i2c, SPI а также функции программатора (прошивки из файла) для i2c и SPI флешек

Добавить комментарий