Существует два способа добавить USB в проект: использование специализированной интегральной схемы (ASIC) или выбор микроконтроллера со встроенной аппаратной поддержкой USB. Каждый подход имеет свои преимущества и недостатки.
Реализация USB с помощью ASIC:
Один из простых способов добавить USB в проект — использовать ASIC, которая обрабатывает USB-связь внутри себя и выдает необходимые данные и сигналы. Одна из наиболее распространенных USB ASIC — это мост USB-UART, представляющий собой (относительно) прозрачный интерфейс для передачи данных от USB-хоста к встроенной системе. Часто это виртуальный COM-порт на хосте, который может быть открыт приложением последовательного терминала для двусторонней связи. Эти ASIC часто также включают в себя другие функции, такие как USB-I2C, управление линиями ввода-вывода, аналоговая выборка и так далее. Эти устройства готовы к интеграции в проект, требуя минимальных усилий по реализации, что делает их идеальными для добавления в последний момент.
Однако использование этих ASIC имеет некоторые ограничения. Один из недостатков заключается в том, что это универсальный подход. Если какая-либо функциональность не может быть реализована с помощью ASIC, то этот подход нецелесообразен. Другой недостаток — это дополнительные компоненты, добавляемые в спецификацию материалов (BOM). Эти компоненты занимают место на печатной плате и увеличивают стоимость проектирования.
Реализация USB с помощью микроконтроллера:
Если до выбора микроконтроллера известно, что требуется USB-связь, хорошим вариантом будет рассмотреть устройство со встроенными USB-периферийными устройствами. Это можно найти в самых разных микроконтроллерах, от высокоэффективных 8-битных устройств до высокопроизводительных 32-битных. Выбор подходящего микроконтроллера зависит от области применения.
Для простых приложений, таких как клавиатуры, мыши и USB-UART преобразователи, хорошим выбором являются 8-битные микроконтроллеры. Эти устройства сочетают в себе малый размер, низкое энергопотребление, низкую стоимость и работу от сети +5 В.
Для ресурсоемких вычислительных приложений следует рассмотреть 32-битные микроконтроллеры, поскольку они более мощные и содержат больший объем памяти. Однако 32-битные микроконтроллеры могут быть дорогими, большими и иметь ограниченный диапазон рабочего напряжения. Сравнительная таблица преимуществ и недостатков различных подходов приведена ниже.

Рисунок 1: Сравнительная таблица различных подходов к реализации
Создание USB-приложений на AVR DU
Существует множество микроконтроллеров с USB-периферийными устройствами. В этом разделе мы сосредоточимся на семействе микроконтроллеров AVR® DU, идейном преемнике семейства XMEGA® D.
Семейство AVR DU предлагает ряд улучшений по сравнению со старыми устройствами. Во-первых, оно больше не требует внешнего кварцевого резонатора, что снижает стоимость комплектующих. Семейство DU также включает в себя встроенный линейный стабилизатор напряжения (LDO) для USB-цепи, если микроконтроллер питается от напряжения 3,9 В или выше. Наконец, семейство AVR DU включает функцию отключения программируемого отладочного интерфейса (PDID), которая навсегда блокирует устройство, предотвращая чтение, стирание или перепрограммирование микроконтроллера.
Следующие примеры представляют собой простые приложения, разработанные для семейства AVR DU. В этих примерах используется MPLAB® Code Configurator (MCC), бесплатный инструмент, который настраивает и генерирует API для встроенных аппаратных периферийных устройств с использованием прилагаемой библиотеки стека USB. Библиотека изначально совместима с устройствами связи (CDC) и устройствами человеко-машинного интерфейса (HID), такими как клавиатуры и мыши.

Рисунок 2: Открытие проекта USB-SPI/I2C в MCC
Применение CDC: USB в SPI/I2C.
В этом примере реализован преобразователь USB в SPI/I2C, работающий без специального драйвера. Это достигается путем идентификации микроконтроллера как универсального устройства класса CDC. Большинство операционных систем имеют универсальный драйвер для этого типа связи, позволяющий пользователю отправлять и получать данные без установки специального драйвера.
Для инициирования последовательной операции пользователь отправляет микроконтроллеру специально отформатированную «фразу». Полученные микроконтроллером данные анализируются и преобразуются (по возможности) в операцию шины SPI или I2C. Затем микроконтроллер сообщает об ошибках команд, ошибках связи (только I2C) или данных, считанных во время обмена. Для SPI «фразы» имеют следующий формат:
spi eeprom/dac/usd
Где "eeprom", "dac" и "usd" обозначают компоненты Curiosity Nano Explorer, используемые в этом приложении. Следующий фрагмент кода представляет собой пример пользовательской команды для связи с устройством EEPROM (25CSM04) на плате Explorer. Эта команда считывает регистр идентификации микросхемы памяти.
spi eeprom 9F 00 00 00 00 00
> FF 29 CC 00 01 00
В протоколе I2C существует три похожих, но разных формата для «фраз», поскольку шина I2C используется всеми подключенными устройствами.
i2c
i2c
i2c
Аналогично SPI, быстрая проверка заключается в считывании идентификатора производителя датчика, в данном случае датчика температуры MCP9808.
i2c 1c wr 06 02
> 00 54
Этот пример доступен на GitHub.
Приложение HID: USB-клавиатура.
Простой, но легко адаптируемый пример USB-связи — это реализация клавиатуры. Обычно, когда клавиатура обнаруживает нажатие клавиши, она отправляет отчет на хост, указывая на клавишу или клавиши, которые пользователь нажимает. Когда клавиша отпускается, отправляется еще один отчет, указывающий на то, что пользователь отпустил клавишу.
В этом примере реализовано иначе. Вместо того чтобы сообщать о нажатии одной клавиши или кнопки, как на стандартной клавиатуре, в этом примере сообщается о нескольких нажатиях клавиш для одного нажатия кнопки, чтобы создать функциональные макросы. Например, нажатие SW0 на AVR64DU32 Curiosity Nano отправляет отчет с клавишами "AVR DU" на хост-компьютер. Светодиод на Curiosity Nano показывает состояние Caps Lock в хост-системе.
В дополнение к Curiosity Nano, через плату адаптера Curiosity также подключен 2x2 Click. Кнопки назначены макросам: CTRL+C (копировать), CTRL+V (вставить), CTRL+Z (отменить) и CTRL+X (вырезать). Дополнительно можно подключить внешнюю кнопку для отправки ALT+F4 на хост. Этот пример доступен на GitHub.
Вывод:
Хотя USB является одним из наиболее сложных типов последовательной связи, встречающихся во встроенных системах, его повсеместное распространение является значительным преимуществом для разработок. USB можно легко добавить в проект с помощью ASIC, но это потребует больших затрат на компоненты, или же можно выбрать микроконтроллер со встроенным USB-оборудованием. После этого вам нужно будет решить, требуется ли для вашей микроконтроллерной разработки мощность 32-битного устройства или же для проекта будет достаточно более простого, но более экономичного 8-битного устройства, такого как семейство AVR DU.
Об авторе:
Роберт Перкель — инженер по применению продукции в компании Microchip Technology. В этой должности он занимается разработкой технического контента, такого как примечания к приложениям, статьи и видеоролики. Он также отвечает за анализ сценариев использования периферийных устройств и разработку примеров кода и демонстраций. Перкель окончил Виргинский политехнический университет со степенью бакалавра в области компьютерной инженерии.
