Usb к шине i2c
Конвертер USB-I2C на ATtiny. Часть 1
Устройство позволяет быстро, легко и дешево присоединить к USB порту вашего ПК практически любую микросхему I 2 C клиента (термо датчики, АЦП, дисплеи, схемы управления реле, и т.д.). Доступны драйверы для Linux, Windows и MacOS.
Этот проект является проектом с открытой документацией. Цель проекта – разработать дешевый универсальный I 2 C интерфейс, подключаемый к USB. Устройство должно быть заменой простых и дешевых адаптеров LPT–I 2 C. Использование USB имеет несколько преимуществ, включая встроенное питание и более современный интерфейс. К тому же, не требуется нагружать процессор ПК битовыми операциями. Для этого устройства требуется даже меньше деталей, чем для некоторых вариантов на основе принтерного порта.
Несмотря на то, что устройство разрабатывалось для и под Linux, оно также работает под Windows и MacOS X. Демонстрационный драйвер и программа для Windows включены в проект, чтобы помочь вам начать использовать устройство как можно быстрее.
Этот проект основан на:
Железо
Плата прототипа с датчиком температуры DS1621 | Готовое устройство в сборе. Добавлен тот же самый датчик |
Аппаратная часть устройства сделана на микроконтроллере Atmel AVR ATtiny45. Это дешевый и доступный микроконтроллер с 4 кБ флеш-памяти (из которой 2 кБ заняты программой этого устройства) и 256 байт памяти данных. Микроконтроллер окружен несколькими компонентами.
USB интерфейс
USB интерфейс реализован чисто программно и использует 2 контакта микроконтроллера (PB0 и PB2). Эта программная реализация поддерживает только низкоскоростной USB, о чем компьютеру сообщается с помощью резистора R1.
Интерфейс I 2 C, также программный, основан на побитовом вводе/выводе через обычный порт. Для аппаратного интерфейса TWI контроллера ATtiny45, на котором можно было бы сделать интерфейс I 2 C, пришлось бы использовать выводы, необходимые для работы с USB. Программный интерфейс может оказаться не полностью совместимым с I 2 C, и поэтому некоторые микросхемы – клиенты I 2 C могут не работать с такой шиной. Правда, до сих пор не было обнаружено ни одного несовместимого устройства. В устройстве реализована программно управляемая задержка такта I 2 C, позволяющая конфигурировать тактовую частоту I 2 C. Задержка по умолчанию – 10 мкс. Учитывая другие задержки в коде побитового ввода/вывода, результирующая тактовая частота I 2 C получается около 50 кГц.
Из соображений простоты, вся передача данных по USB выполняется через Control EP (EP0). Так как библиотека AVR-USB поддерживает только медленные USB устройства, она не может использоваться для передачи больших объемов данных, которая возможна только для высоко- и полноскоростых USB устройств. Низкоскоростные устройства поддерживают так называемую передачу по прерываниям, которая ограничена предустановленной шириной канала, в то время как контрольная передача может использовать любую доступную ширину канала.
Устройство, таким образом, использует передачу control для всех данных. Это требует некоторых дополнительных ограничений, чтобы избежать одновременного доступа к устройству множества драйверов (т.е. драйвера ядра и тестовой программы на основе библиотеки libusb ). Под ОС Linux это достигается выбором соответствующих типов запросов. Этот вид контроля доступа может быть не возможен в других операционных системах.
Потребление энергии
Микроконтроллер и микросхемы клиентов I 2 C (одна или несколько) питаются от линии VBUS интерфейса USB.
Сам адаптер потребляет менее 10 мА и сообщает об этом компьютеру через USB дескрипторы. Устройство также может питать микросхемы – клиенты I 2 C. Но так как эти микросхемы имеют различное потребление тока, невозможно точно включить их потребление в дескрипторы устройства. Вы целиком ответственны за контроль над полным энергопотреблением, и в особенности за тем, чтобы оно не превышало допустимый лимит для USB в 500 мА.
В будущих версиях прошивок планируется сделать сообщаемое компьютеру значение энергопотребления программно конфигурируемым, таким образом, значение легко можно будет подогнать под реальные потребности устройства.
Драйвер ядра
Схема и печатная плата
Стабилитроны в схеме необязательны. Они могут потребоваться, если схема будет питаться непосредственно от USB линии VBUS. Линии данных USB (D+ и D-) могут работать только с напряжением 3.3 В. На некоторых компьютерах возникают проблемы при работе с напряжением 5 В. В этом случае может помочь ограничение напряжения до значения не более 3.6 В. В моем прототипе эти диоды отсутствуют, так как мой ПК прекрасно работает с напряжением 5 В на линиях данных USB.
Резистор R1, сопротивлением 2.2 кОм а не 1.5 кОм, по той же причине. Он использовался для подтягивания напряжения к 3.3 В. Нам же необходимо подтянуть выход к 5 В, и сопротивление требуется большее.
Ниже представлена печатная плата. Она состоит только из частей для USB и I 2 C и не содержит микросхемы – клиента I 2 C. Вместо него на плате имеется место для размещения такой микросхемы. Вы можете легко вытравить плату сами. Так как большинство проводников проходит на нижней стороне, подойдет даже односторонняя печатная плата. Понадобится просто сделать 4 недостающих соединения с помощью проводов.
Когда-то давным-давно я писал пару статей о широко известном в узких кругах чипе 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 — напишите комментарий, буду рад добавить его в статью.
Готовые изделия
Китайская промышленность предлагает миллион и один вариант универсального I2C/SPI-программатора на этом чипе, один другого дешевле.
Доставшийся мне за 3,5 евро вариант, по заверениям его производителя умеет программировать чипы серий 24хх (I2C) и 25xx (SPI), которые предполагается вставлять в ZIF-сокет (если они в корпусе DIP-8-300), либо прижимать/припаивать к посадочной площадке на обратной стороне платы (если они в SOIC-8 или SOIC-16), либо подключать проводами. На гребенку выведены только UART и SPI, а I2C придется брать из ZIF-сокета, если нужен (эта недоработка устранена в более новых версиях, но они дороже).
Схема программатора отличается от референсной из даташита только использованием внешнего LDO-регулятора вместо встроенного, видимо, встроенный оказался не очень надежным. На моем экземпляре сэкономлено на всем подряд, и кроме CH341A на плате 2 светодиода (Power и Run), 2 резистора, 5 конденсаторов (2 для кварца и 3 для LDO-регулятора), кварц на 12 Мгц, LDO-регулятор AMS1117 на 1 А и ZIF-сокет на два чипа в корпусе DIP-8-300. Из настроек имеется единственный джампер, переключающий программатор между I2C/SPI и USB-UART, при этом у него меняется Device ID.
В Windows 8.1 драйверы для обоих режимов подтягиваются из сети автоматически, а в Linux они имеются в ядре уже несколько лет.
Для программирования в Windows используется китайский софт авторства некоего SkyGz, который большинством продавцов с EBAY распространяется нелегально, но работать от этого не перестает. Вот ссылка на него — malthus.mooo.com/download/file.php?id=893 — только не забудьте потом покормить попугая-матершинника и поправить повязку на глазу.
Для 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 в дизайн своих устройств, т.к. его надежность при постоянном применении вызывает некоторые сомнения, а если возникнут вопросы, то задавать их будет некому, ведь даже сайт производителя чипа извне Китая открывается через раз.
Спасибо читателям за внимание, и пусть ваши прошивки никогда не падают.