Управление i2c через usb
Решил на досуге чем-то себя развлечь, а заодно поупражняться в программировании, но немного увлёкся, и вот родился этот проект. Не как обычно какая-нибудь ненужная безеделушка, коих у меня насобиралось в закромах целая куча, а вполне полезная вещь - USB программатор для микроконтроллеров AVR, SPI Flash 25 серии и I2C EEPROM 24ХХ.
"Сердцем" программатора является stm32f103c8t6, многим известный по китайской платке blue pill. Подключен он к компьютеру через USB-UART конвертер (мой любимый CH340G). Кто-то сразу справедливо заметит, что в данном микроконтроллере есть аппаратный USB и можно спокойно реализовать виртуальный COM порт на нём (HID CDC устройство). Но! в "железном" конвертере есть один немаловажный плюс, там есть все линии COM порта, которые (в моём случае DTR) можно использовать для управления микроконтроллером. В соей схеме линия DTR управляет сбросом (NRST) микроконтроллера. Также большой плюс в том, что не возникает проблемы "яйца и курицы" при создании программатора (то есть, чем прошить сам программатор?). Добрые инженеры ST-microelectronics позаботились о нас и добавили USART bootloader в свои контроллеры. А так как на моей плате уже есть подключенный к USART1 STM-ки usb-usart конвертер, то остаётся только скачать STM-овскую программку STMFlashLoadDemonstratot, поставить перемычку "boot" (на моей плате ещё нужно закоротить вывод "reset" ISP разъёма AVR на плюс или минус того же разъёма просто, boot1 - PB0 у меня подключен на данный разъём, а при программировании через встроенный bootloder он не должен болтаться в воздухе) и прошить микроконтроллер готовой прошивкой.
Забежав вперёд, скажу, попутно я начал переделывать программатор на аппаратный USB, который я заблаговременно развёл на плате. USB у меня настроен как Custom HID. Скорость, конечно в 2-3 раза выше, но получить стабильной работы пока не удалось. Одиночные пакеты передаются туда-обратно без проблем, а вот при сплошном потоке во время операций чтения-записи прошивок пакеты иногда теряются. Но я над этим работаю.
Принцип работы моего программатора следующий: хост отправляет микроконтроллеру пакет с запросом, микроконтроллер отправляет пакет с ответом. Сам микроконтроллер без спроса ничего хосту не шлёт, кроме единственного случая - аппаратного сброса (отправляет пакет присутствия программатора). Также в обмене нет отправки пакетов через временные задержки, что могло бы вызвать зависание софта. Только запрос-ответ. Далее пакеты как со стороны хоста, так и со стороны "железа" обрабатываются в конструкции "switch-case" в зависимости от маркерного байта.
Длину пакета я сделал фиксированную (23 байта). Это компромисс между количеством полезной информации в пакете и скоростью его передачи в случае служебных пакетов, несущих всего один полезный байт. Подробно пакет разбирать не буду, скажу только, что полезных байт в нем 16 (то есть тех, которые передают данные прошивок), остальные байты служебные (старт и стоп байты для проверки целостности пакета, маркер пакета, адрес). Конечно, было бы более эффективно сделать пакет не фиксированной длины, но это сильно усложнило бы софт и прошивку "железа".
Скорость обмена выбрал максимальную для CH340G - 2 мегабода. STM-ка на данной скорости работает без проблем. В итоге скорость обмена получилась приемлемая. Читать-писать AVR и I2C EEPROM очень комфортно, а вот SPI Flash - не очень. Уж сильно они ёмкие. Флешка на один мегабайт (не путать с мегабитом) пишется или читается примерно минуты четыре-пять. Соответственно 8 мегабайт будет читаться или писаться порядка 16-20 минут. Благо, что пакеты обмениваются стабильно и ошибок или обрывов при записи/чтении не возникает. В принципе, можно сходить попить чаю, пока пишется (шучу).
Теперь познакомимся по ближе с минимальной схемой программатора:
Минимальная схема представляет из себя микроконтроллер с минимальной обвязкой, USB-USART конвертером также в минимальной обвязке и разъёмами для программирования. В принципе, можно использовать туже плату Blue pill, подключая на проводах программируемое устройство, единственное что нужны подтяжки к плюсу 3v3 линий SCL и SDA I2C1 для программирования EEPROM.
Почему схема минимальная? Потому что изначально устройство разрабатывалось на самодельной оценочной плате с выведенными портами микроконтроллера. И этого было достаточно для программирования "на проводах" перечисленные микросхемы памяти и МК. А вообще, я ещё планировал поддержку микроконтроллеров PIC. Для этого в окончательной плате у меня ещё присутствует преобразователь напряжения на 12 вольт, схема управления питающими напряжениями, и преобразователь уровней 3v3 - 5v для ножек PGC, PGD и PGM PIC контроллеров.
Скажу сразу, с пиками у меня пока не срослось. На поверку они оказались редкостными уб. детьми без отца. Как оказалось в каждой линейке PIC есть куча подсемейств, которые отличаются не только набором команд, но и алгоритмами программирования и ещё кучей параметров. А ещё HEX файлы для PIC разных семейств также отличаются кардинально. В них содержаться и программа, и EEPROM, и биты конфигурации. И всё это по разным адресам и в разных количествах у разных моделей. Например PIC16F84 и PIC16F84A имеют разные алгоритмы записи и стирания, а также у них отличаются несколько команд. В общем, ни о какой стандартизации даже и речи быть не может, такое чувство, что инженеры PIC соревновались, кто сделает сложнее и хуже. Максимум, что я смог выжать из имеющегося у меня PIC16F73 это получить ячейку с ID. И то не совсем корректное, хотя читается стабильно (если кто-то имеет опыт программирования PIC, не написания программ, а именно алгоритмов прошивки, можете поделиться опытом, попробую реализовать хотя бы пару линеек 16-х).
Для полноты картины приведу также схему преобразователя напряжения на 12 вольт:
Это MCP34063 в типовом включении.
А также схему преобразователей уровней и управления напряжениями 5 вольт и 12 вольт:
Преобразователи уровней двунаправленные, сделаны на полевых n-mosfet. Работают в оба направления, так как ножки микроконтроллера, на которых они висят сконфигурированы как Open Drain. А в данном режиме у STM32 даже если пин сконфигурирован как выход, всегда можно прочитать его текущий логический уровень. Получается такой своеобразный псевдо-двунаправленный порт. Очень удобная штука. Полезная для реализации двунаправленных шин (например, 1-Wire).
Ключи для управления напряжениями 5в и 12в я скопировал из схемы программатора К-150. Они сделаны через два элемента "НЕ" микросхемы 74ls06 (у меня работает на 74als05) и транзисторах BC856.
На разъём программирования ICSP для PIC я планирую в ближайшее время ещё повесить Microwire EEPROM. У них с пиками очень похожие протоколы программирования и как раз многие модели требуют именно 5 вольт. Так что, если с пиками не получится, то разъём будет полезен для этих EEPROM.
Основная "фишка" программы - возможность добавления моделей программируемых устройств. Для этого в каталоге с программой есть три xml файла, в которые очень легко добавить новую модель. Для AVR достаточно скачать datasheet на нужную модель. Найти раздел Memory Programming. Найти там количество страниц памяти, объём страницы памяти (16 битных слов), объём EEPROM в байтах и три байта ID микроконтроллера. Также нужны начальные настройки Fuse bits, их можно найти в online калькуляторах, например, AVR fuse calculator. Затем, в соответствующем xml файле (avr.xml) копируем один однотипный блок, вставляем его выше или ниже и подправляем данные. Сделать это можно в простом блокноте "notepad". Пример блока для AVR:
Добавлять модели I2C EEPROM нет необходимости, так как микросхемы разных производителей программируются однотипно. А основные модели до 24х256 уже внесены. А вот новые модели SPI Flash вносятся аналогично AVR. Из datashet необходимо узнать объём флешки в байтах, объём одной страницы данных и количество страниц. Также можно узнать ID, но его можно просто прочитать программатором, а затем внести в xml файл.
Есть некоторые особенности программирования AVR и SPI Flash. Если AVR новый или его fuse bits настроены на внутренний генератор и низкую частоту тактирования, то он не будет реагировать на комманды программатора. Для этого во вкладке настроек необходимо выставить скорость SPI на "6" или ниже - это низкоскоростной Soft SPI, затем прошить фузы и можно лить прошивку на более высокой скорости. Но не рекомендую для AVR ставить скорость больше "8", он просто не справится с ней. Также не напортачьте с Fuse битами, выставляйте внимательно их значения. Если в соответствующих окнах будут установлены неправильные символы (кирилица или символы, кроме 0-9 и A-F), то биту будут программироваться как 0xFF. Значение битов вносится в шестнадцатиричном виде два символа без приставки "0x" или постфикса "h", регистр не важен. Будьте внимательны, неправильные Fuse биты могут окирпичить ваш микроконтроллер. При установленных Lock Bits их сброс производится стиранием чипа. Не забывайте, что в AVR биты инверсные: 0 - запрограммирован, 1 - не запрограммирован.
Во вкладке "SPI Flash" функция чтения/записи Sreg1 и Sreg2 регистров. Это регистры настроек и флагов. Если в них установлены биты защиты, то некоторые или все блоки памяти будут доступны только для чтения и вы не сможете их стереть или записать. Для этого читаем значения Sreg, запоминаем или записываем на бумажку, вводим в оба поля по два нуля, записываем. После этого можно стирать и записывать флешку. После того как записали, возвращаем обратно значения Sreg, если нужно.
При работе с I2C EEPROM - никаких особенностей, только правильно выбирайте модель, иначе при чтении можно повесить шину I2C и она выдаст ошибку. Это связано с разной адресацией байт в EEPROM разного объёма.
Есть общая особенность функции сравнения записанной прошивки для всех устройств: перед проверкой сначала нужно прочитать микросхему. Потому что при нажатии на кнопку "Сравнить" автоматически чтения не происходит. Об этом, если что, напомнят всплывающие MessageBox-ы.
Программа принимает для записи файлы формата intel-HEX или любые другие файлы в сыром виде. Сохраняет только в формате BIN. То есть вы можете записать обычный HEX, при этом он предварительно конвертируется в массив байт или открыть любой другой файл в виде набора байт, например записать на флешку картинку или текстовый файл.
Кстати , в процессе разработки программы родился побочный проект - HEX-to-BIN конвертер. Он конвертирует 16 битные hex в BIN файлы. Его я также выложу вместе с софтом программатора в конце статьи (особых коммерческих надежд на проект я не возлагаю, пользуйтесь на здоровье).
Напоследок - фото готового устройства. Напомню, это "полная" схема со всеми преобразователями, которые не нужны для перечисленных трёх видов программируемых микросхем, а сделаны "на будущее" для возможности добавления новых функций.
Качество платы, конечно не заводское, плата односторонняя с кучей перемычек, но для домашних поделок - пойдёт.
P.S: Софт довольно сырой. Могут возникать не обрабатываемые исключения и программа может завершаться с ошибкой. Всё протестировать я не успел. Из имевшихся у меня AVR а пробовал работать с ATMEGA8, ATMEGA328, ATMEGA128, ATTINY2313. Также подключал AT90USB162, но я не уверен в корректности работы с его Flash памятью из-за bootloader-а. Фузы программируются правильно.
Из флешек я пробовал WINBOND W25Q80, W25Q64, также менее ёмкие AC25512 и мегабитную от MXIC (не помню маркировку).
EEPROM были проверены со всеми вариантами адресации (у меня были в наличии AT24C01, AT24C02, 24C08, 24C16, 24C32 и 24C256).
Разводку платы я также выложу в конце статьи в формате Sprint Layout. Я постарался подписать все элементы на плате, там где не поместилось - подписал в свойствах деталей. У меня есть такая фишка на платах, я рисую и резисторы и конденсаторы макросами конденсаторов, потому что макросы резисторов в спринте очень крупные по сравнению с конденсаторами того же типоразмера, так что не удивляйтесь. Плата сделана под SMD компоненты, самые маленькие - размером 0603, да и у STM-ки ножки очень мелкие. Я делаю платы фоторезистом, поэтому это не проблема. Но если делать ЛУТ, то надо очень постараться. Не каждый возьмётся за такие мелкие детали.
P.P.P.S: Как и обещал, дополняю статью новыми версиями софта, прошивок и плат. Выкладываю версию софта и прошивки под чистый USB на той же плате с stm32f103c8t6. Так же выкладываю новую версию софта под программаторы COM (в первую очередь для варианта на stm32f030k6t6, так как для F103 уже не актуален COM порт). И сама плата и прошивка для F030 (схема аналогичная F103, только без второго USB, все элементы в Lay файле подписаны в их свойствах). И да, новые прошивки с первой версией софта будут работать не совсем корректно (в частности, чтение AVR). В новых версиях также исправлена одна серьёзная ошибка, точнее недочёт с отображением данных HEX.
Все началось с того, что мне надо было подключиться к одному устройству по USART. Я сразу взял адаптер USB to UASRT (ибо в ноутбуке COM порт не предусмотрен) на AtTiny2313 (рекламой заниматься не буду, схема легко находится в интернете), подключил, запустил и внезапно понял, что у адаптера фиксированная скорость 9600, а у девайса, к которому требовалось подключиться, скорость 57600. Дело, естественно, было поздним вечером, и купить что-нибудь вроде FT232 возможности не было. Поэтому после непродолжительного раздумья, было решено изменить скорость UASRT в адаптере обычной перепрошивкой. В итоге соединение было успешно налажено. Но согласитесь - это ведь не выход, программатора может под рукой не оказаться, да и неудобно каждый раз с прошивкой шаманить. В следствие этого я серьезно задумался о создании нормального адаптера, с регулируемой скоростью (и не только).
Конечно, самый простой вариант – купить FT232, но сравнив ее стоимость со стоимостью Mega8, я пришел к выводу, что этот вариант мне не подходит. Поэтому было решено сделать адаптер на МК. А раз он на МК, то делать только USART как-то не рационально. Поэтому неплохо было бы в этот адаптер засунуть еще несколько интерфейсов, если уж делать, то что-то универсальное и полезное. Почти сразу в памяти всплыли “приятные” воспоминания об установке драйверов для адаптера на Tiny2313 (для Windows7 x64 это довольно мучительно). А это значит, что от устройства “виртуальный COM” придется отказаться, следовательно, надо будет написать программу для ПК, иначе работа с устройством будет невозможна. В общем, после обдумывания в течение некоторого времени, сформировалась окончательная идея девайса. Функционал получился вот таким:
- адаптер USB->USART;
- адаптер USB->SPI;
- адаптер USB->I 2 C;
- при этом устройство должно быть HID (Human Interface Device), чтобы не морочить голову с установкой драйверов.
Объектом издевательств стал МК Mega8, т.к. в TQFP корпусе он занимает совсем мало места (намного меньше, чем AtTiny2313) и обладает целыми 8 Кб. памяти. Сначала планировалось сделать все интерфейсы программными, но после разводки платы пришлось отказаться от аппаратного I 2 C, т.к. на односторонней плате вывести его никак не получалось (в будущем все-таки надо будет решить этот вопрос, может отдельно вывести сбоку платы). Поэтому его функциональность несколько ограничена, но USART и SPI остались полнофункциональными. Для связи с ПК была применена библиотека V-USB.
Схема устройства получилась вот такой:
Как видно, ничего сложного в ней нет. МК питается напряжением 5 В., согласование уровней для USB выполнено при помощи делителей напряжения резистор 68 Ом. + стабилитрон 3.3 В.. Тактовая частота МК – 12 МГц. Это минимальная частота для работы с шиной USB. Так же в схеме присутствуют три светодиода для индикации режимов работы. Один из светодиодов показывает, какой режим работы включен, а два других индицируют прием/передачу данных. Никаких кнопок и переключателей в устройстве не предусмотрено, и все настройки выполняются программно, прямо с ПК. Да, на все выводы, используемые для работы интерфейсов включены резисторы на 68 Ом. для защиты МК от КЗ. Как уже было отмечено выше, устройство представляется ПК как HID и не требует установки драйверов. VID и PID были выбраны из предоставляемых V-USB: VID - 0x16c0, PID - 0x05df. В противном случае пришлось бы отдать кругленькую сумму за покупку индивидуального идентификатора для USB устройства. Но т.к. проект Open Source и некоммерческий, совершенно свободно можно использовать идентификаторы, предложенные V-USB.
Плата получилась вот такая:
А в спаянном виде:
Это был тестовый образец да еще и разведенный с ошибками. Я почему-то посчитал, что вывод CE выводить не стоит. Ну ничего, все уже исправлено и к статье приложена правильная плата.
Итак, со схемой все понятно, он простая до предела и паяется за один вечер. Но, как было сказано выше, получившееся устройство определяется ПК как HID, т.е. ОС подбирает под него драйвер из своей базы. Проще говоря, Windows думает, что работает с устройством ввода. Это делает возможным работу на любом ПК без мороки с драйверами. Но с этим связана одна небольшая проблема, ни одна из существующих программ для обмена данными через USART работать с этим устройством не будет. А значит нужна какая-то специальная программа для работы с модулем, иначе он никакой ценности из себя не представляет. Поэтому я открыл свой любимый C++ Builder (нынче его обозвали CodeGear RAD Studio, что в прочем не меняет смысла), версия 2007, и написал вот такую программу:
Ничего особо сложного в ней нет, для каждого интерфейса присутствует некоторое количество настроек. Да, одновременно несколько интерфейсов работать не могут, только по одному. Работает все это дело очень просто, при подключении устройства к ПК в окне программы активизируются кнопки, нажатие на которые запускает соответствующий интерфейс. Потом достаточно написать данные в поле ввода в определенном формате и нажать кнопку "Send". Для каждого интерфейса свой формат данных. Сейчас рассмотрим их более подробно:
USART: (прием данных идет все время, пока активен режим, так сказать, на автомате)
SPI:
- для отправки данных устройству формат строки такой: Адрес (кому передавать и в какую ячейку памяти) А (а) и Данные D (d). Например: aa3 dfa;
- для запроса данных с устройства: Адрес (от кого принимать и из какой ячейки памяти) и идентификатор чтения R (r). Например: aa3 r
I 2 C:
- для отправки данных устройству: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Данные D (d). Например аа2 m03 d15
- запрос данных выглядит вот так: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Адрес устройства (бит чтения в 1) А (а) Идентификатор чтения с количеством ячеек памяти для чтения R (r). Например: aa2 m03 aa3 r1
Для SPI в режиме Slave никаких команд не предусмотрено, просто сидим и ждем, пока нам что-нибудь пришлют. Для работы с девайсом подключаем его к ПК, ждем некоторое время, пока ОС не сообщит, что драйвера успешно найдены и установлены, запускаем программу и начинаем обмен данными. Все предельно просто, ведь простота и была одним из критериев при создании устройства.
Да, кстати, программа совместима со всеми версиями Windows, начиная с Windows XP и заканчивая Windows 8, и не требует для работы различной экзотики, типа NetFramework и т.п. Как, впрочем, и сам модуль.
Вот, собственно, и все, программа, плата и исходники прилагаются.
Фьюзы выставляются для работы от внешнего кварца с высокой частотой. Выглядят вот так:
На картинке LOW фьюзы в 1, когда не отмечены, и в 0, когда отмечены. HIGH фьюзы наоборот. В шестнадцатеричном виде это выглядит вот так: HIGH: D9, LOW: FF.
Ну и конечно же видео, т.к. лучше один раз увидеть, чем. (USART работает в режиме эхотест (Rx и Tx соединены), а SPI и I 2 C тестируются с микросхемой PCA2129T, статья о ней тут)
Когда-то давным-давно я писал пару статей о широко известном в узких кругах чипе FTDI FT232H и различных его применениях. Всем хорош был FT232H для DIY, но и у него нашлось несколько недостатков — относительно неприятный для ручной пайки корпус LQFP48 (для истинных любителей хардкора есть еще вариант в QFN48, паяй — не хочу, DIHALT не даст соврать), цена за оригинальный чип от 250 рублей, вероятность проблем с драйверами на поддельных чипах и некоторая функциональная избыточность, к примеру, поддержка JTAG нужна далеко не всем.
Решение, как обычно, пришло из Поднебесной, в которой после нескольких лет тупого передирания творческой адаптации чужих чипов наконец выпустили свой собственный конвертер USB-TTL — WinChipHead CH341A в корпусе SOP-28 (не DIP, но тоже паяется без проблем).
Производство чипа было начато году приблизительно в 2006, но в поле моего зрения он попал только в 2014, когда I2C/SPI-программаторы на этом чипе наводнили европейский EBAY, причем продавцы предлагали цену от 3,5 евро вместе с доставкой, что при средней стоимости хорошего китайского программатора вроде MiniPro TL866A в 50 евро оказалось настолько заманчивым предложением, что устоять не получилось.
Если вам все еще интересно, что умеет этот китайский чип за 1$ и стоит ли платить больше, если не видно разницы — прошу под кат.
CH341 — мультифункциональный конвертер из USB 2.0 в UART, EPP, I2C и SPI.
В режиме UART поддерживаются не только RX/TX, но и остальные сигналы управления, поэтому на чипе можно сделать USB-модем. В режиме параллельного порта реализован интерфейс EPP и эмуляция принтера (позволяющая подключать принтеры с интерфейсом LPT напрямую к USB без написания дополнительных драйверов). В последовательном режиме поддерживаются интерфейсы I2C и SPI.
Чип требует минимальной дополнительной обвязки (внешний кварц и несколько конденсаторов). Возможно использование внешней EEPROM для хранения пользовательских Vendor ID, Device ID и некоторых настроек чипа. Питание от 5 В (через встроенный LDO-регулятор), либо от 3.3 В напрямую.
Кроме CH341A в корпусе SOP-28 имеются два варианта в SSOP-20 — CH341T и CH341H, первый лишен поддержки SPI, в второй — I2C, поэтому рассматривать их в этой статье я не стану.
Описаны в статье про FT232H, повторяться не стану, только замечу, что на CH341A я проверял только работоспособность TX и RX, а не всего UART-интерфейса целиком, если вдруг найдутся какие-то внезапные подводные грабли, как это было с I2C на FT232H — напишите комментарий, буду рад добавить его в статью.
Для Linux имеются открытые проекты ch341prog (SPI) и ch341eepromtool (I2C), оба работают достаточно хорошо, но весьма неплохо было бы добавить поддержку обоих режимов в flashrom (гляди, xvilka, народные программаторы по цене грязи, а FR их до сих пор не умеет).
Я проверял работу программатора в Windows 8.1 x64 и Xubuntu Core 15.04 x64 на I2C-чипе OnSemi 24C16 и SPI-чипе Winbond W25Q64CV, работа с I2C занимает секунды (т.к. на чипе 2 Кб памяти и его, при желании, можно читать и писать чуть ли не руками), а вот восьмимегабайтный SPI-чип читается за минуту, а пишется за две, что, конечно, далеко не рекорд, но и не слишком долго для устройства за 5 долларов.
Если вам не нужна поддержка JTAG, десятков тысяч различных чипов и ICSP, зато нужно средство быстрого резервного копирования/восстановления прошивок различных устройств от роутеров до ПК и серверов — рекомендую программатор на CH341A к приобретению, свои 5 баксов он отрабатывает сполна. А когда его поддержку добавят в flashrom — станет совсем хорошо.
С другой стороны, я бы не стал закладывать CH341A в дизайн своих устройств, т.к. его надежность при постоянном применении вызывает некоторые сомнения, а если возникнут вопросы, то задавать их будет некому, ведь даже сайт производителя чипа извне Китая открывается через раз.
Иногда дешевле купить готовое устройство, чем собирать его самому. Да и самодельное устройство не всегда и не у всех будет выглядеть аккуратно- это зависит от наличия оборудования/материалов и прямоты рук.
Пользователи, знакомые с микроконтроллерами Atmel или хотя бы с Arduino скорее всего знают о дешевом программаторе USBasp, цена которого на Ebay около $ 3. Распространены две версии программатора:
USBasp 2.0 — с стабилизатором на 3.3 вольта.
USBasp 3.0 — плата поменьше, без стабилизатора. Так же у него не выведены на разъем порты PD0 и PD1(Аппаратный UART).В руках не держал и соответственно рассматривать его тут не будем.
Ниже мы рассмотрим как превратить программатор USBasp в I2C-USB переходник, научимся читать датчики влажности и температуры, получим простой набор портов ввода/вывода (PIO), RS232-USB, а так же попытаемся создать устройство nRF24L01-USB для чтения беспроводных датчиков и управления устройствами. Ну и для любителей Arduino — будем программировать в среде Arduino IDE используя USBasp как макетную плату.Проекты используют популярную библиотеку V-USB для работы с USB в программной реализации.
Архив с прошивками можно скачать в конце статьи. Я намеренно не публикую тут прямые ссылки на свои проекты -вы их найдете в архиве.
Устройство программатора USBasp
Программатор состоит из небольшого числа деталей. Мозгом программатора является микроконтроллер Atmega8, который имеет всего 8 кб флеш памяти и 1 кб ОЗУ(SRAM).Вроде и слабенький микроконтроллер по современным меркам, но столько всего можно на нем сделать.Из-за особенностей работы программного USB м/к работает на частоте 12мгц. Соответственно, при написании своей прошивки необходимо учитывать это.
USBasp имеет 10 контактный разъем, на который выведены 6 выводов микроконтроллера: PB5 (SCK), PB4 (MISO), PB3 (MOSI, PWM), PB2(PWM), PD0 (RXD), PD1 (TXD).Питание 5в или 3.3в, которое переключается перемычкой JP1.
Плата имеет два встроенных светодиода на выводах PC0 и PC1.Выводы м/к PB0,PB1 и PD2 используются для программного USB,PC2 выведен на перемычку JP3.Остальные выводы микроконтроллера не распаяны.
Со схемой устройства можно ознакомится в архиве в конце статьи.
Установка загрузчика на плату
Для быстрой смены прошивки, без сторонних программаторов можно установить загрузчик USBaspLoader.Официальная страница проекта USBaspLoader
К сожалению загрузчик отнимает 2 кб флеш памяти, но для большинства применений нам хватит оставшихся 6 кб.
Установка загрузчика:
Команда программирования используя Arduino как программатор:
Команда программирования через другую USBasp:
После этого уже можно заливать свою прошивку без программатора стандартной командой
Для того, чтобы «залить» прошивку в устройство с установленным USBaspLoader необходимо установить перемычку JP3, которая переводит устройство в режим программирования и сбросить устройство, замкнув контакт ближний к перемычке выбора питания(JP1) на перемычке JP2 на землю.
Использование USBasp как макетную плату в Arduino IDE
Для прошивки в среде Arduino IDE (проверено на версиях 1.0.х) необходимо в файл board.txt вписать следущий текст:
После этого в среде Arduino IDE можно выбрать появившуюся плату ATmega8 USB 12 MHz. Прошивка осуществляется через меню «загрузка с помощью программатора».
Доступные пины по нумерации Arduino: 13 (SCK),12 (MISO),11 (MOSI,PWM),10 PB2(PWM) ,1 (TXD),0 (RXD).Так же доступны цифровые выводы 14 и 15 для управления светодиодами на плате.
Можно задействовать и интерфейс USB, используя библиотеку для Arduino V-USB, но возможностей тут меньше, чем на Си.
nRF24L01-USB
Позволяет обмениваться данными между nRF24L01/nRF24LE1 и компьютером с устройством nRF24L01-USB. Теоретически поддерживается до 22 клиентов(при пакете передачи 32 байта) на базе nRF24L01/nRF24LE1, но пока на практике проверено до 3. Ограничение связано с тем, что для приема и отправки данных используется буфер в ОЗУ устройства, а его как известно у Atmega8 всего 1кб.Размер приемного пакета может быть до 32 байт, а отправки — 4 байта, это ограничение связано со способом реализации работы с библиотекой V-USB.
Работа nRF24L01-USB адаптера основана на временном разделении, когда клиенты отправляют/принимают данные в разное время. При большом количестве клиентов время опроса должно быть бОльшим. Для обмена данными в реальном времени количество клиентов должно быть наименьшим. Пока у устройства имеются некоторые недостатки, но думаю это решаемо.
Клиентская утилита управления, чтения и отправки данных работает как в Linux, так и Windows, но пока, к сожалению, требуется компиляция для настройки принятых данных. Для удобства настройки и отладки через утилиту можно менять канал, скорость и включать/выключать аппаратное подтверждение, работать напрямую с регистрами радио модуля.
Устройство можно применить для беспроводных датчиков или управления в системах умного дома.
Кстати, ранее был разработан и испытан вариант беспроводных датчиков влажности и температуры на базе attiny13 на частоте 315 или 433 мгц, но это уже другая тема.
RS232-USB
На основе программатора USBasp можно создать устройство-переходник RS232-USB на базе проекта cdc-232.
Подойдет для программирования плат Arduino, на которых нет микросхемы FT232RL или другого преобразователя usb-uart.
PIO-USB
6 выводов, которые выведены на разъеме программатора могут использоватся как обычные PIO выводы, для «дерганья» светодиодами и релюшками, а так же считывания логического состояния порта. В архиве в конце статьи имеется мой вариант PIO-USB, который так же позволяет считывать датчик влажности DHT11/DHT22, а так же транслировать код для управления розетками/люстрами, если подключить радио перадтчик на 433/315 мгц. Планируется новая версия, в которой увеличится количество подключаемых датчиков влажности и исправлены ошибки.
DS18B20-USB
Программатор можно «научить» работать с несколькими датчиками температуры DS18B20.Например использовать проект USBTemp.
Возможны и другие варианты реализации схемы и прошивки устройства, а так же интеграция с PIO-USB.
К сожалению из-за размера прошивки загрузка не возможна через USBaspLoader.
I2C-USB
Устройство позволяет подключить практически любые устройства i2c к компьютеру.Проверено как на Linux так и в Windows XP.Прошивка основана на известном проекте i2c tiny usb.
Мои примеры использования устройства:
Чтение датчика давления BMP085.
Управление микросхемой расширителем портов MCP23017, получив тем самым почти тот же PIO на компьютере.
Вариантов применения масса: программирование EEPROM памяти, чтение спецефичных разных датчиков, управление FM приемником.
Это конечно же далеко не все варианты использования программатора в нестандартном функционировании.
Все исходные коды сторонних проектов можно найти на их официальных сайтах. В архиве в конце статьи имеются прошивки, которые адаптированы под выводы платы USBasp.
Вы здесь: Home Железо Прочее I2C-USB переходник
Превращаем программатор USBasp в I2C-USB переходник:
Если Вы уже знакомы с USBasp программатором,то вы знаете,что это очень простое и дешевое устройство для программирования м/к ATmega,но оказывается программатор , используя проект i2c tiny usb можно превратить в полноценный дешевый переходник I2C to USB.
В итоге мы получаем возможность подключать разные устройства I2C к компьютеру всего за 100 рублей (3$).Например мы можем подключить датчик давления BMP085 или микросхемы ввода/вывода MCP23017 для подключения кнопок или управления нагрузкой через реле.
USBasp прошивается стандартно как при обновлении прошивки и прошивается так же через arduino как программатор или используя другой USBasp программатор .Для программирования используются те же выводы SCK,MISO,MOSI ,RESET ,но прошивка идет через утилиту avrdude ,а не из среды Arduino IDE.
Порядок действий для прошивки через arduino:
1. Подключаем выводы SCK,MISO,MOSI ,RESET к Arduino согласно инструкции .
2. Установавливаем перемычку self programming (на фото обозначена как JP2),обычно место для перемычки не распаяно.
3. Качаем скомпилированную прошивку под USBasp тут и кидаем в папку путь_к_папке_ардуины_/hardware/tools/ .
4. Перейдем в консоль (cmd или bash) Вашей операционной системы в папку через команду cd путь_к_папке_ардуины_/hardware/tools/ и далее вводим команды для Windows,не забывем указать верный порт,на котором подключена Arduina:
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -v
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -U flash:w:i2c_tiny_usb.hex -U lfuse:w:0x9f:m -U hfuse:w:0xc9:m
Для прошивки из Linux все аналогично, заменяется часть строки:
./avrdude -C avrdude.conf -c avrisp -P /dev/ttyUSB0 .
Порядок действий для прошивки через другую USBasp:
Подключаем выводы SCK,MISO,MOSI ,RESET один в один.Можно просто подключить через шлейф,идущий в комплекте с программатором.
Указываем опцию -c usbasp вместо -c avrisp
После успешной прошивки устройство опознается как i2c-tiny-usb и выводы программатора будут иметь другое назначение: SDA и SDL ,к которым мы можем уже подключать I2C устройства согласно справочной информации.
Работа переходника I2C-USB в Linux:
Драйвера в Linux не требуются ,но по умолчанию модуль i2c-dev не загружен и его необходимо установить в автозагрузку выполнив команду echo "i2c-dev" >>/etc/modules или/и загрузить модуль немедленно командой modprobe i2c-dev .В папке /dev/ Вы увидите возможно несколько устройств вида -i2c-X,наше скорее всего будет последним.Зная номер сейчас можно работать с устройствами подключенные на данной шине согласно примеров и инструкций к устройствам.Рекомдуется установить пакет программ i2c-tools (через управление ПО Вашей операционной системы) -поможет для поиска I2C устройств командой i2cdetect -y Х ,где Х - это номер i2c шины:
Приложения с данным переходником i2c_tiny_usb могут работать как с USB устройством -в этом случае загрузка модуля i2c-dev не нужна.
Работа переходника I2C-USB в Windows:
Для работы переходника требуются драйвера i2c_tiny_usb .В windows приложения работают только как с USB устройством,а не с шиной I2C.
Материалы и ссылки:
Прошивка i2c_tiny_usb.hex.
Страничка проекта i2c_tiny_usb.
Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.
Читайте также:
- Каким дисплеям и типам телевизоров стоит отдавать предпочтение с точки зрения энергосбережения
- Произошла ошибка при выполнении пакетного файла сообщение об ошибке неверно задано имя папки
- Компьютер живая или неживая природа
- Ноутбук samsung rv520 не заряжается
- Oasis desktop 1607p какие hdd поддерживает