USB для AVR. Введение


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

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

Всё хватит пустой болтовни, приступим к делу. Как использовать USB в собственных устройствах?

  • Можно взять микроконтроллер, который имеет аппаратную поддержку USB интерфейса (например AT90USB* ). Далее нужно знать как с ним работать и написать для него специальную прошивку. Ну и на последок также необходимо написать драйвер для компьютера, если ваше устройство не стандартного класса USB.
  • Использовать универсальный конвертор USB в «другой» интерфейс. В качестве «другого» может быть RS232, I2C,… При таком раскладе нам не нужно знать как работает USB, не нужно писать специальную прошивку и драйвер для компьютера. За нас всю работу делает конвертор, и как правило драйвер уже написан производителем конвертора.
  • Взять обычный микроконтроллер без аппаратной поддержки 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, имеет меньше возможностей из-за чего теоретически он проще для понимания.
image
Я остановился на реализации от V-USB, думаю вот основные преимущества:
  • V-USB опубликован на принципах GNU General Public License Version 2, так же имеется коммерческая лицензия
  • полная эмуляция USB 1.1 low-speed устройств за исключением обработки ошибок связи и электрических характеристик
  • запускается практически на всех AVR-ках, нужно минимум 2 килобайта флеша, 128 байт RAM и частота 12, 15, 16, 16.5 или 20 МГц.
  • V-USB предоставляет свободную пару идентификаторов (Vendor-ID и Product-ID)
  • хорошо задокументированный код на C, легче разбираться

image
Я в своих экспериментах с USB прошивку для МК писал языком C на AVR-Studio 4 + WinAVR, программу для ПК разрабатывал при помощи Borland C++ Builder 6.0 как самый быстрый и простой вариант. Соответственно такими будут все будущие примеры. Вообще выбор средств разработки очень ответственный шаг, но холивар по поводу что лучше 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.
Поделиться публикацией

Комментарии 16

    0
    Неплохо было бы упомянуть для сравнения несколько слов об USBtiny…
      +8
      У меня стойкое дежа вю — примерно раз в несколько месяцев на хабре появляется такой вот новый топик от очередного человека, который задался вопросом «как же сделать USB на AVR». Человек приходит к трем вариантам выбора (через Serial-to-USB конверетер, через AVR с аппаратным USB, через дешевый AVR в эмуляции), всегда делает один и тот же выбор «через эмуляцию», затем всегда смотрит на одни и те же V-USB и USBtiny, почти всегда делает выбор в пользу V-USB… Дальше, в лучшем случае человек постит получившиеся схемы и исходники прошивки и драйверов для очередного проекта, по сложности сопоставимого с helloworld, иногда что-то объясняя в этих исходниках в процессе.

      В чем смысл таких топиков — для меня, к сожалению, загадка…
    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          именно так :)
          +1
          А в аппаратной части нет ничего сложного. там ноги МК напрямую вешатся на usb, ставятся подтягивающие резисторы и шунтирующие конденсаторы.
            0
            Есть пару шатких моментов с кварцами и правильной подачей питания. USBTiny нужно давать не более 4В а вот PROTOSS на ATmega8 абсолютно все равно. Но и там и там очень чувствительны к наводкам около кварца
          –2
          Можно сделать простенькое USB АЦП) usbdev.org.ru/?p=download&path=/files/&file=otchet_ADC.doc
            +3
            Статья вызывает противоречивые чувства. С одной стороны — тема USB очень интересная для многих и актуальная (для меня по крайней мере). С другой стороны — много пустой воды. Все, что написано в статье, уже есть в Википедии, на других ресурсах, и даже на Хабре, и описано качественнее, проще и без лишних слов. «Всё хватит пустой болтовни, приступим к делу.» — статья своему девизу как-то не соответствует. Даже ссылки, которые приводит автор — не самые лучшие. Библиотека V-USB давно уже переведена на на русский язык. Есть библиотека LUFA на русском языке. Есть на русском прекрасный документик USB in the Nutshell. Надеюсь, что автор в следующем посте поправит огрехи. Пусть будет поменьше слов, схема, ссылки на исходный код и фотографии.
              +1
              V-USB — тут про библиотеку V-USB написано лучше, чем в статье.

              … запускается практически на всех AVR-ках, нужно минимум 2 килобайта флеша, 128 байт RAM и частота не меньше 12 MHz ...
              Даю поправку: для V-USB подойдут кварцы только из фиксированного ряда частот — на 12, 15, 16, 16.5 и 20 МГц.
                0
                Поправил, спасибо.
                +1
                Второй раз натыкаюсь на подобную статью — всегда начинает глодать вопрос — зачем?
                Еще можно понять, если студент хочет потренироваться в программировании и выбирает какую то бесполезную область — но всегда люди утверждают, что делают это с какой то практической целью отличной от просто тренировки.
                Ну зачем ставить МК, который будет заниматься только тем, что обслуживать эмуляцию USB? А на полезные задачи не останется ни памяти ни вычислительных ресурсов.
                Почему не взять тот МК, пусть и на 50 центов более дорогой, который предназначен для решения поставленной задачи? Тут выбор то не велик — если поддерживаешь старый проект на производстве — то используешь микросхему конвертер, а если делаешь новый проект, где в ТЗ указана связь по USB — то используешь современную элементную базу со встроенным аппаратным контроллером.
                  0
                  Дам совет. По личному опыту V-USB идеально запустился на ATmega8 по проекту PROTOSS. А вот USBTiny хоть и быстрый но очень нежный и глючный…
                    +1
                    Самый лучший вариант взять контроллер с аппаратным USB, который сейчас стоит копейки,
                    хоть AT90USBxxx, используя библиотеку LUFA можно за 1 день скомпилировать приложение для Вашей
                    бегущей строки.
                    Делаете эмулятор CDC или HID со своим репортом и все готово.
                    Все это делается за один день.
                    Ссылка

                    Эмуляция, в настоящее время, для тех у кого много свободного времени ИМХО.
                      0
                      а чем ваш вариант отличается от V-USB????? Да ничем. Обвязку засунули в МК и кусок кода… Вот и все… Не надо тут разводить холивары…
                      0
                      Где же следующий топик?)

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое