USB для AVR. Часть 1. Вводная


Здравствуйте, решился я испытать свои творческие таланты :) Речь пойдет об популярном интерфейсе USB, а именно как заюзать этот самый USB на простых микроконтроллерах AVR. Планирую написать несколько топиков с примерами кода и разъяснениями как со стороны микроконтроллера, так и со стороны компьютера. Конечно на просторах интернета полно всяческих примеров на данную тематику, но как писал DI HALT в правилах конкурса: «в лучшем случае это исходник в котором сам черт ногу сломит, да краткое, на страничку, его описание.»

Начну с того, что ранее широко распространенные интерфейсы как COM, LPT, MIDI в настоящее время морально устарели, но ещё нередко присутствует на современных компьютерах и используется в промышленном и узкоспециализированном оборудовании. Так что для связи какой нибудь собственной железки с компьютером давно уже пора осваивать что-то другое. Как вариант ещё можно использовать всякие конверторы/переходники/эмуляторы, но они не всегда работают как оригинальный интерфейс, порождая массу проблем.

Всё хватит пустой болтовни, приступим к делу. Как использовать USB в собственных устройствах?
  1. Можно взять микроконтроллер, который имеет аппаратную поддержку USB интерфейса (например AT90USB* ). Далее нужно знать как с ним работать и написать для него специальную прошивку. Ну и на последок также необходимо написать драйвер для компьютера, если ваше устройство не стандартного класса USB.
  2. Использовать универсальный конвертор USB в «другой» интерфейс (например Преобразователь USB-UART на FTDI FT232RL). В качестве «другого» может быть RS232, I2C,… При таком раскладе нам не нужно знать как работает USB, не нужно писать специальную прошивку и драйвер для компьютера. За нас всю работу делает конвертор, и как правило драйвер уже написан производителем конвертора.
  3. Взять обычный микроконтроллер без аппаратной поддержки USB и программно эмулировать интерфейс USB. Тут возникает проблема в производительности нашего микроконтроллера. Скорость USB очень большая: LowSpeed — 1.5Mbit/s, FullSpeed — 12Mbit/s, HighSpeed — 480Mbit/s. Я вообще молчу за USB 3.0 :) Поэтому дома на коленке получится только LowSpeed USB, и то з некоторыми трудностями. Правда в большинстве случаев для самодельных устройств этого более чем достаточно.
Мы настоящие джедаи, поэтому пойдем по пути эмуляции :) На данный момент уже существует три готовых проекта для программной эмуляции USB на микроконтроллерах AVR:
Проект от Igor Češko был первым, написан полностью на ассемблере и он послужил своего рода вдохновением для V-USB. На его основе сделан заслуживающий внимания универсальный ИК приемник для компьютера, а также множество других проектов. V-USB в свою очередь написан на C, правда с использованием ассемблерного кода в местах критических к производительности и точности эмуляции. USBtiny является производным от более ранней версии V-USB, имеет меньше возможностей из-за чего теоретически он проще для понимания.

Я остановился на реализации от V-USB, думаю вот основные преимущества:
  • V-USB опубликован на засадах GNU General Public License Version 2, так же имеется коммерческая лицензия
  • полная эмуляция USB 1.1 low-speed устройств за исключением обработки ошибок связи и электрических характеристик
  • запускается практически на всех AVR-ках, нужно минимум 2 килобайта флеша, 128 байт RAM и частота не меньше 12 MHz
  • V-USB предоставляет свободную пару идентификаторов (Vendor-ID и Product-ID)
  • хорошо задокументированный код на C, легче разбираться

Я у своих экспериментах с USB прошивку для МК писал языком C на AVR-Studio 4 + WinAVR, программу для ПК разрабатывал при помощи Borland C++ Builder 6.0 как самый быстрый и простой вариант. Соответственно такими будут все будущие примеры (кстати ATMEL уже выпустила 5-ю версию студии). Вообще выбор средств разработки очень ответственный шаг, но холивар по поводу что лучше C или Assembler устраивать не нужно. Я скажу просто: это лишь инструменты в наших руках. Нужно владеть всеми а использовать тот что удобней и правильней в поставленных перед собой целях. Естественно в умелых руках любой инструмент эффективный :)

Также нужно отдельно сказать про идентификаторы VID и PID. Это 16-битные числа, при помощи которых операционная система определяет устройства и подгружает нужный драйвер. Для того, чтобы получить Vendor-ID нужно заплатить usb.org 2000$. Интересные мысли по поводу легальности использования VID/PID можно прочитать на страничке эмбеддера BSVi. Тот факт, что V-USB предоставляет свободную пару VID/PID (легально купленную в usb.org) очень греет душу. Но что делать когда нужно одновременно подключить несколько USB устройств с одинаковыми VID/PID? Ничего страшного, помимо этих VID/PID каждое USB устройство имеет VENDOR_NAME и DEVICE_NAME идентификаторы, потом в примерах я покажу как этим воспользоваться.

Несколько ссылок по сабжу:
www.usb.org/developers/docs — официальная документация по USB. Не легкая для чтения, но наиболее полная.
www.beyondlogic.org/usbnutshell/usb1.htm — хороший обзор важных частей USB спецификации. Легче раскуривать чем официалку…
www.lvr.com/usb.htm — много хороших ссылок связанных с USB

В заключение напишу, что все условия для создания USB 1.1 устройств доступны каждому:
  • дешевые микроконтроллеры AVR
  • программная эмуляция USB, выберем V-USB
  • свободная пара Vendor-ID и Product-ID (вместе с V-USB)
  • множество примеров как для микроконтроллера так и для компьютера
Остается только одно — желание разобраться! А потом творить чудеса на копеечных микроконтроллерах всем мажорам на зависть :)
Продолжение: USB для AVR. Часть 2. HID Class на V-USB
  • +9
  • 11 марта 2011, 20:27
  • XANDER

Комментарии (49)

RSS свернуть / развернуть
Очень интересная тема! С нетерпением жду новых статей на тему USB!
0
абсолютно солидарен. интересно узнать все в последовательном изложении.
0
Планирую написать how-to по USB HID Class (это такие устройства как мышь, джойстик, клава...) правда в нестандартном применении :) Тогда вообще не нужно писать/устанавливать драйвер устройства для компьютера — он уже встроен в операционку.
0
Ждем ждем. Но учти, что статья без особого содержания (вводные и тыды) оценивается в что-то около нуля. Так что чем дробить тему на 100500 частей лучше бы родил сразу все одним мега куском и огреб максимум от максимума моей оценки :)

З.Ы.
Никогда не поздно дописать все в эту статью, хотя бы USB HID и как с ним работать. Остальное можно и додробить ;)
0
Статья в процессе :)
Вопрос: как удалить лишний коммент? Интернет тупанул и я от нетерпения случайно два раза одно и тоже отправил…
0
А где? Скажи я грохну.
0
Thanks.
0
Ещё UsbTiny забыл упомянуть:
Попреще чем Obdev V-USB.
0
www.xs4all.nl/~dicks/avr/usbtiny/
0
Вот что пишут авторы V-USB:

www.xs4all.nl/~dicks/avr/usbtiny — This is Dick Streefland’s driver which is derived from an earlier version of V-USB. Dick’s driver has less options and the code is therefore easier to read.

Проще говоря это ранняя версия V-USB с меньшими возможностями, из-за чего теоретически он проще.
0
Вот такое ощущение дежавю. Ну хоть убей а остаётся. Где-то я уже читал эту статью с таким же текстом и иллюстрациями, а ссылки на источники информации отсутствуют.
0
Статья написана собственноручно. Использовались многие источники, основные из них:
www.obdev.at/products/vusb/index-de.html
www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20%28AVR%29_eng.htm
www.xs4all.nl/~dicks/avr/usbtiny/
http://bsvi.ru/pismo-v-usb-org/
http://ru.wikipedia.org/wiki/USB
www.beyondlogic.org/usbnutshell/usb1.shtml
0
Ну все эти ссылки мне известны (кроме Beyond Logic'а) сам когда-то прошерстил всё это добро. Но в то же время и читал фразы один в один с вашими. Ссылки найти не могу оттого и написал что дежавю. вы ни где не писались по поводу usb больше?

Да, а почему тот же микросин не читали? там есть переводы многих проектов, тот же USB-CDC, и статью по использованию V-USB.
0
Нет, пишу впервые. Бывал и на microsin AVR :)
0
А есть шансы запустить какой-либо из USB-стеков на МК с килобайтом флеша, тини15 например?
0
  • avatar
  • Vga
  • 11 марта 2011, 22:25
Скажите: А НА КОЙ?
Ну утоптаете вы USB стек, как вариант из USBtiny выкинуть дублирующие функции (V-USB вроде 1.3к минимум просит при урезки файлом конфигурации), и что с того? какую полезную функцию будет выполнять ваше устройство?
сопоставьте время затраченное на шаманство с кодом, компиляцию и отладку с разностью в цене той же tiny45 (а она на мой взгляд дороговата) гораздо проще взять 45-ю для которой есть уже довольно много примеров.
0
У Vga был простой вопрос, если бы все спрашивали «А НА КОЙ?» то не было б чудес в мире этом :) Чтобы сделать что то необычное не нужно себя ограждать какими либо рамками, условностями. Надо выйти за пределы невозможного, только так можно достигнуть великих открытий.

Что то заболтался я, возможно ему НА КОЙ нужно…
0
Это то понятно, но тут имхо задача лишена смысла. авры с 1к памяти марально устарели, пока код допилишь и добъешься работы они скорее всего и продаваться больше не будут. или вы надеетесь на чудо что кто-то увидит данную разработку и вернет контроллеры на конвеер? :)
0
Здравый смысл… Хмм… Гениальность и безумие ходят бок о бок. USB-люстра тоже заслуживает внимания :) Я за то, что нельзя человека принуждать к чему либо, пусть сам решит есть смысл или нету.
0
Ваша правда, Гениальные люди выглядят безумцами :)
Сам начинал USB с подобной люстры, ничуть не жалею, ни затраченного времени ни денег.
И заставлять я никого не собирался. Я потратил много времени на в итоге бесполезные занятия, и это время можно было бы потратить на более разумные занятия. Но это из рода «знать где упасть...». Вот я и высказал свое мнение по данному поводу, что бы человек мог подумать насколько разумно он собирается тратить своё время.

P.S.: davehillier.wordpress.com/2009/03/30/building-the-cube/
0
Интересный блог, мне люстры понравились :)
0
Ну это довольно известный проект. E-mail notify'ер широко расползся по интернету. Я хотел его к миранде прифигачить под винду и на пинг сервака, но программирование под комп меня достало на работе — так мой проект и умер :(
А простая мигалка aka Лампа настроения прекрасно и без USB обходится. Вот проект который достоен разработки и который можно попробывать поместить в 1к памяти. мигать то не обязательно просто 7-ю цветами :)
0
Тини15 есть. Тини25-45-85 в радиусе 100км — нет. Все просто.
Алсо, решение сложной задачи само по себе удовольствие. Иначе требуемое можно просто купить. И даже не факт что дороже.
0
купить готовое в последнее время действительно порою дешевле благодаря китайцам. И я понимаю что сделать своими руками гораздо интерестнее, сам такой. Тут просто другой момент. Если вам надо «просто поиграться» то смысла и нет париться с упаковкой стека в столь малый объем памяти, есть и другие не мение интерестные задачи, но с большей практической ценностью. И сами довольны останетесь, и другие спасибо скажут.
Ну а если вы хотите освоить юсб с перспективой на будущие проекты, то я сомневаюсь что проекты будут столь простенькоми, что им будет достаточно 100-200 байт кода. Ну разве что USB-люстру делать :) потому имхо лучше сразу через инет купить за 200-2000км полее толстенький контроллер и играть с ним уже. А тини15 оставить на потом и скорее всего как «сопроцессор» в более сложной системе.
0
Я все это знаю. Но мне интересно поэкспериментировать с впихиванием.
0
Поясните для начинающего — со стороны РС будет создан virtual COM после подключения описываемого способа?
0
  • avatar
  • DVF
  • 11 марта 2011, 22:35
Нет, я планирую описать USB HID Class. Со стороны host-софта на PC никакой virtual COM не нужен. Работать будем напрямую.
0
Жду продолжения, даже уже придумал где применю программный USB — wiegand сниффер.
0
Какой, простите, сниффер?
0
Странный какой то протокол wiegand: передача односторонняя, двухпроводная…
1-Wire от Dallas интересней смотрится: один провод, передача в обе стороны (правда инициирует всё хост), длина проводки примерно такая же.
0
Благодарю. Думал там опечатка. счас глянул — есть такое. В принципе даже понятно почему там 2 линии — так проще.
nightmare, скорости я так понимаю тан не выше 400байт/с, да еще и таймаут в пол секунды. HID устройства будет вполне достаточно. А нет, так подождем пока XANDER напишет про AVR-CDC :)
0
Длины кабелей у виганда и далласа разные. Даллас загибается на 10-15 метрах (во всяком случае при работе заводских контроллеров с заводскими считывателями). На виганд производители дают длину до 150 метров.
0
XANDER, не отвлекайтесь, пожалуйста, на комменты, а то долго нам придется ждать продолжения статьи. :)
0
  • avatar
  • DVF
  • 12 марта 2011, 00:05
Пожалуй хорошее замечание, а время летит так быстро…
0
Интересная тема. Буду следить за продолжением.
0
  • avatar
  • Rom
  • 12 марта 2011, 18:22
Послушай Джедай, ты правильную тему завел, особенно она интересна будет как данные на комПУтере обрабатывать однако… надо чтобы было понятно и со стороны МК и со стороны ПК… особенно USB очень интересный протокол однако, много информации было прочитано, понято мало было жалко, ты уж пожалуйста напиши нам статей побольше желательно чтобы USB под XP было и не желей API функций и объяснений(особенно со стороны ПК)))ДА ПРИБУДЕТ СИЛА С ТОБОЙ!('')
0
Давай уже скорее следующую часть :-)
0
При подключении к USB2.0 устройства с LowSpeed последний будет предупреждать, что устройство могло бы работать быстрее?
0
  • avatar
  • DVF
  • 13 марта 2011, 11:51
Поправка: «последний» заменить на «РС»
0
Нет, он предупреждает только когда HS в USB 1.1 тыкаешь. Даже про SS не предупреждает) Хотя хрюшка о нем скорее всего просто не знает.
0
Уважаемый DI HALT имеется драйвер USB1.1 CDC для AT90USB162 переработанный то есть выкинуто все лишнее ifdef и тому подобное, код стал более читабельный, скорость CDC интереснее чем HID. Библиотеку распотрошил атмеловскую компилятор AVR Studiя 4. Планирую дергать ножками AT90USB162 и писать в различные регистры контроллера через Labview. Ваше мнениена счет полезности данного проекта?
0
а причем тут дихальт? Статью писал ув. XANDER. А если интересует мнение хальта, то спросите у него в приват.
0
AT90USB162 имеет на борту аппаратный USB модуль и этим все сказано… По поводу полезности сразу вспомнил авторитетное мнение анонимуса по любой проблеме ;) Шутки шутками, но действительность сурова, смотрю это Ваша первая публикация в сообществе :)
0
В таком случае анонимус обычно применяет несколько другое мнение :)
0
На мой взгляд как минимум в целях обучения будет полезно :)
0
Ну мы же говорим про анонимуса. На «в целях обучения будет полезно» ему как раз таки.

А как посетитель сообщества мое мнение — пиши конечно. Лишних статей не бывает (ну, кроме некоторых переводов...)
0
Да первая публикация в проекте. Давно на этот сайт захожу как гость. Атмеловский драйвер работает на прерываниях, действительно AT90USB162 имеет на борту аппаратный USB модуль только исходников драйверов нет ни у кого или не выкладывают вот в чем проблема, если хочешь что то подключить к компу возникает проблема с USB драйвером так как ком поры как и LPT или как там их на новых компах отсутствуют.
0
Под эти контроллеры есть ещё LUFA, стоит обратить на неё внимание.
0
Пишите, пригодится!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.