Перевод апноута Atmel "AVR272: USB CDC Demonstration UART to USB Bridge" [1].
Мост USB <--> UART может быть реализован на любом микроконтроллере AVR с аппаратной поддержкой USB. Возможности моста:
- Поддержка Windows 2000 и более поздними версиями Windows.
- Не нужна установка драйвера.
- Энумерация USB-устройства в качестве виртуального COM-порта (Virtual COM Port).
- Мост USB <--> RS232 с динамически изменяемой скоростью.
- Реализовано питание от интерфейса USB (внешний источник питания не нужен).
[Введение]
Интерфейс RS232, несмотря на свою популярность и простоту использования для разработчиков, постепенно исчезает на PC и вытесняется интерфейсом USB. Чтобы соответствовать переменам, все приложения, ранее основанные на UART, должны мигрировать на USB. Миграция на USB может означать довольно большие проблемы разработки программного обеспечения как со стороны аппаратуры (firmware), так и со стороны ПО хоста (программа, работающая на компьютере, software). Чтобы избежать этих проблем в разработки, Atmel предлагает решение в виде класса CDC (Communication Device Class) со следующими достоинствами:
- Не нужно менять ПО хоста (приложение software, работающее на PC).
- Незначительные, хорошо документированные изменения со стороны аппаратной реализации устройства (firmware и hardware).
Назначение этой статьи - подробное описание процесса быстрого старта и реализации приложения CDC (Virtual COM Port и мост UART <--> USB) на примере стартер-кита STK525 (примечание переводчика - можно использовать чип AVR AT90USB162 и макетные платы AVR-USB162 и AVR-USB162MU) и программного обеспечения Flip (система прошивки firmware чипа через USB). Подразумевается, что пользователь знаком о существовании USB Software Library for AT90USBxxx Microcontrollers (Doc 7675, которая имеется на CD-ROM и WWW-сайте Atmel), так как примеры кода находятся там.
[Требования к аппаратуре (hardware)]
Приложение USB CDC требует следующего аппаратного обеспечения:
1. Отладочная плата AVR USB (STK525, AT90USBKey, STK526 или Ваша собственная плата, на которой установлен чип AVR с аппаратной поддержкой USB. Примечание переводчика: подойдут также платы teensy, AVR-USB162, AVR-USB162MU, userial). 2. На отладочной плате либо в вашей аппаратуре должен стоять микроконтроллер AVR USB (т. е. микроконтроллер AVR с аппаратной поддержкой USB. Примечание переводчика: в случае макетных плат AVR-USB162, AVR-USB162MU, userial это будет микроконтроллер AT90USB162, AT90USB162MU или AT90USB647 соответственно). 3. Обыкновенный соединительный кабель miniUSB (с одной стороны стандартная вилка типа A, с другой стандартная вилка Mini B). 4. Стандартный скрестный кабель RS232 (DB9 папа DB9 мама или аналогичный). 5. Компьютер PC с установленной операционной системой Windows (версия 2000, XP или более поздняя), и с поддержкой хоста USB 1.1 или USB 2.0.
[Программирование чипа прямо в системе - In system programming, Device Firmware Upgrade]
Чтобы прошить чип AVR USB программой firmware, в общем случае Вы можете воспользоваться следующими методами:
- Интерфейс JTAG, используя в качестве программатора JTAGICE mkII (см. [4]).
- Интерфейс SPI (ISP), используя в качестве программатора JTAGICE mkII или AVR Dragon.
- Кабель USB благодаря записанному в чип уже на заводе DFU bootloader и программному обеспечению Flip.
- Параллельное высоковольтное программирование (HVSP), используя в качестве программатора STK500 или STK600. В этом случае нужно иметь чип отдельно, т. е. чип, не установленный в систему (не впаянный в плату).
Внимательно ознакомьтесь на документацию по Вашему аппаратному обеспечению, чтобы выбрать нужный способ программирования чипа, который стоит на Вашей плате (если Вы используете стартер-кит от Atmel). Примечание переводчика - для плат AVR-USB162, AVR-USB162MU, userial самым удобным методом будет использование DFU bootloader и программы Flip - чип можно прошить прямо через USB, никакой дополнительный программатор не нужен. Как устанавливать и использовать программу Flip подробно описано в [5]. Вам нужно только установить саму программу и драйвер для DFU bootloader (драйвер находится в папке, куда установлена программа Flip).
[Быстрый старт]
Как только Вы запрограммировали в Ваш чип программу firmware usb_cdc.a90 (это бинарная прошивка в формате HEX, см. [2]), нажмите на кнопку Start Application в программе Flip, либо переподключите интерфейс USB с Вашим устройством с AVR USB. Система Windows обнаружит новое устройство, и запустится Мастер установки драйвера. Укажите мастеру на папку с inf-файлами driver из архива [2]. После окончания процесса энумерации устройства USB CDC операционная система подключит его как виртуальный COM-порт, см. скриншот.
На фото показан стартер-кит STK525, на котором может быть запущен код устройства USB CDC, и показаны коннекторы USB и RS232, между которыми будет получен мост. Джойстик нужен как устройство ввода внешних событий, по которым в виртуальный COM-порт будут посылаться данные.
Демонстрация передачи данных в программу PC через виртуальный COM-порт
Назначение виртуального демонстрационного COM-порта (USB CDC), код которого записан в память чипа - показать, как может старое приложение PC без своей переделки обмениваться информацией с устройством USB. Следуйте дальнейшим инструкциям для запуска демо.
1. Запустите программу Hyper Terminal (она входит в состав стандартного пакета приложений Windows), и выберите в ней тот COM-порт, который появился в Диспетчере Устройств (для нашего примера предположим, что это COM5).
2. Покачайте джойстик, и Вы увидите в консоли вывод информации, соответствующей положению джойстика.
Демонстрация работы моста USB <--> RS232
Еще одна задача демонстрационного примера - показать, как могут передаваться данные в полнодуплексном режиме между UART (RS232) и интерфейсом USB. Выполните следующее, чтобы запустить это демо.
1. Соедините порт RS232 стартер-кита STK525 с портом PC RS232 (коннектор DB9).
Примечание: если на Вашем PC нет интерфейса RS232, то Вы можете использовать еще одну плату STK525 - соедините скрестным кабелем DB9 - DB9 обе платы между собой, и подключите по USB обе платы в PC.
2. Запустите сразу две программы Hyper Terminal, и в одной откройте порт RS232 (один COM-порт), а во второй откройте Virtual COM Port устройства USB CDC (другой COM-порт). Установите при этом одинаковые параметры подключения (скорость baudrate, количество бит данных data bits, четность parity, количество стоп-битов stop-bits, управление потоком flow control).
3. Напечатайте что-нибудь в одном окне терминала программы Hyper Terminal, и Вы увидите печатаемые данные в другом окне программы Hyper Terminal.
Примечание переводчика: для запуска примера в режиме моста Вы можете использовать две макетные платы AVR-USB162 (или AVR-USB162MU, или userial), записав в них одинаковое firmware демонстрационного USB CDC, и обе подключив к компьютеру по USB. Соедините также сигналы приема/передачи TXD и RXD двух плат крест-накрест, т. е. TXD UART от первой платы подключите к RXD UART второй платы, и RXD первой платы подключите к TXD второй.
[Обзор приложения firmware USB CDC]
Приложение firmware USB CDC позволяет пользователю симулировать порт RS232, используя аппаратуру USB. Устройство USB появляется в операционной системе как COM-порт. Это позволяет использовать без изменений приложения PC, рассчитанные на работу с COM-портом. Со стороны аппаратуры требуются некоторые изменения - нужно заменить в firmware и hardware драйвер UART на драйвер UART-USB. Пользователь будет теперь применять функции UART-USB вместо функций UART, чтобы связаться с PC. После того, как устройство USB CDC прошло энумерацию, приложение получит возможность полнодуплексной связи для передачи данных между PC и периферийными устройствами. На рисунке показана схема миграции.
[Описание компонентов firmware, архитектура USB CDC]
Эта секция посвящена только модулю CDC. Модификация и настройка под себя файлов, описанных здесь, позволит пользователю построить свое собственное приложение firmware устройства USB CDC (виртуальный COM-порт). На диаграмме внизу в качестве примера показана структура алгоритма демо-приложения USB CDC, работа которого описана в статье.
[cdc_task.c]
Этот файл содержит функции для инициализации аппаратуры, которая будет использоваться приложением, сбора данных и передачи их.
cdc_task_init
Эта функция выполняет инициализацию параметров CDC и ресурсов аппаратуры (например, портов ввода для кнопок джойстика).
cdc_task
Эта функция управляет потоком данных для двух демонстрационных функций приложения (Virtual COM Port и мост UART <--> USB).
[uart_usb_lib]
uart_usb_test_hit
Эта функция делает проверку - принят ли хотя бы один символ через USB.
uart_usb_getchar
Эта функция возвращает байт, принятый через FIFO конечной точки OUT.
uart_usb_putchar
Эта функция записывает байт, переданный в параметре, в FIFO конечной точки IN. Она также заменяет собой функцию putchar, которая входит в состав библиотеки UART. Например, функция printf может использовать для вывода функцию uart_usb_putchar вместо функции putchar.
uart_usb_tx_ready
Эта функция делает проверку - можно ли записать байт в FIFO конечной точки IN.
uart_usb_flush
Эта функция отправляет хосту данные, накопленные в конечной точке IN.
[stk_525.c]
Этот файл содержит все подпрограммы для управления ресурсами платы STK525 (джойстик, потенциометр, датчик температуры, светодиоды и проч.).
Описанное демонстрационное устройство USB CDC использует драйверы, которые изначально встроены в операционную систему Windows. Для установки устройства в систему нужен только INF-файл, который Вы можете найти в [2]. Это устройство USB CDC не будет работать на Windows 98 и Windows ME, так как в них нет встроенного драйвера устройства CDC. Также устройство может работать под управлением операционных систем семейства Linux OS в зависимости от конфигурации операционной системы.
[Описание содержимого архива [2]]
Содержимое архива разбито на 4 папки appnotes, bin, driver, USB CDC Virtual Com Port.
appnotes - апноуты AVR272 doc7619.pdf (материал этой статьи) и AVR4907 doc8447.pdf.
bin - скомпилированный код демонстрационного примера USB CDC, описанного в этой статье, для разных серий микроконтроллеров AVR USB (Series2, Series4, Series6). Для макетной платы AVR-USB162 с частотой кварца 16 МГц берите бинарник Series2\STK526-AVR-USB162-series2-cdc-at90USB162-16MHz(GCC).hex.
driver - INF-файл для Мастера установки оборудования Windows.
USB CDC Virtual Com Port - исходный код для демонстрационного устройства USB CDC, который Вы можете скомпилировать сами, имея GCC (WinAVR или WinAVR + AVR Studio) или IAR.
[Как компилировать исходный код USB CDC Atmel]
В папке USB CDC Virtual Com Port архива AVR272_USB_CDC_Virtual_Com_Port.zip содержатся еще 3 архива: series4-cdc-2_0_3-doc.zip, STK526-series2-cdc-2_0_3-doc.zip, USBKEY_STK525-series6-cdc-2_0_6-doc.zip. Как можно понять по названию, они предназначены для разных макетных плат и серий AVR USB (все микроконтроллеры Atmel AVR USB условно разделены по сериям - Series2, Series4, Series6, Series7).
STK526-series2-cdc-2_0_3-doc.zip
Здесь находится код примера USB CDC для микроконтроллеров AVR USB серии 2 (Series2) и макетной платы Atmel STK526. К этой серии относятся самые маломощные микроконтроллеры AVR с аппаратным интерфейсом USB: AT90USB82, AT90USB162, ATmega8U2, ATmega16U2, ATmega32U2. Этот пример нужно брать за основу USB CDC для макетных плат AVR-USB162, AVR-USB162MU (на них стоит чип AT90USB162), и потребуются минимальные доработки кода.
Как компилировать код через GCC (WinAVR): 1. Распаковать содержимое STK526-series2-cdc-2_0_3-doc.zip в любую папку. 2. Перейти в папку STK526-series2-cdc-2_0_3-doc\demo\STK526-series2-cdc\gcc\. 3. выполнить команду make clean и затем make. 4. После успешной компиляции получите файл STK526-series2-cdc.hex - это и есть код firmware для демонстрационного примера USB CDC устройства.
Опции компиляции настраиваются в отдельном файле config.mk - там можно настроить имя проекта (PROJECT), и тип микроконтроллера (MCU). Тактовая частота микроконтроллера задается в файле STK526-series2-cdc-2_0_3-doc\demo\STK526-series2-cdc\conf\config.h значением переменной FOSC (частота в килогерцах). Для того, чтобы скомпилировать код для макетной платы AVR-USB162 или AVR-USB162MU, нужно перед компиляцией (make clean, make) поменять в файле config.mk тип процессора на at90usb162, и в файле conf\config.h поменять частоту процессора FOSC на 16000:
[config.mk] MCU = at90usb162
[config.h] #define FOSC 16000
series4-cdc-2_0_3-doc.zip
Здесь находится код примера USB CDC для микроконтроллеров AVR USB серии 4 (Series4) и макетной платы Atmel EVK527. К этой серии относятся микроконтроллеры средней мощности с аппаратным интерфейсом USB: ATmega16U4, ATmega32U4.
Опции компиляции настраиваются точно так же, как и для STK526-series2-cdc-2_0_3-doc.zip, компиляция делается стандартно - make clean, make. После успешной компиляции получите файл EVK527-series4-cdc.hex - это и есть код firmware для демонстрационного примера USB CDC устройства.
USBKEY_STK525-series6-cdc-2_0_6-doc.zip
Здесь находится код примера USB CDC для микроконтроллеров AVR USB серии 6 (Series6) и макетных плат Atmel USBKEY, STK525. К этой серии относятся самые мощные микроконтроллеры AVR с аппаратным интерфейсом USB: AT90USB646, AT90USB1286. Для микроконтроллеров AT90USB647 и AT90USB1287 нужно взять библиотеку кода USB для серии 7 (Series7), см. AVR USB Series7 Software Packages на сайте Atmel.
Опции компиляции настраиваются точно так же, как и для STK526-series2-cdc-2_0_3-doc.zip, компиляция делается стандартно - make clean, make. После успешной компиляции получите файл USBKEY_STK525-series6-cdc.hex - это и есть код firmware для демонстрационного примера USB CDC устройства.
Если Вы взяли код не по ссылке [2], а скачали прямо с сайта Atmel, то при компиляции (относится ко всем примерам кода Series2, Series4 и Series6) может произойти ошибка: ../main.c: In function 'main': ../main.c:105: error: expected expression before 'do' ../main.c: In function '__low_level_init': ../main.c:124: error: expected expression before 'do' make: *** [../main.o] Error 1
Это может произойти потому, что неправильно определен макрос Clear_prescaler (см. файл lib_mcu/power/power_drv.h): #define Clear_prescaler() (clock_prescale_set(0)) исправьте на #define Clear_prescaler() clock_prescale_set(0)
[Ссылки]
1. AVR272: USB CDC Demonstration UART to USB Bridge site:atmel.com - оригинал статьи на английском языке. 2. 120206AVR272_USB_CDC_Virtual_Com_Port.zip - исходный код firmware демонстрационного устройства USB CDC, описанного в статье, и бинарники, скомпилированные для макетных плат AVR-USB162, AVR-USB162MU (микроконтроллер AT90USB162). В папке driver находится INF-файл, который нужно предложить Мастеру установки оборудования Windows при первом подключении демо-устройства USB CDC. 3. AVR276: USB Software Library for AT90USBxxx Microcontrollers. 4. Atmel AVR JTAGICE mkII. 5. Макетная плата AVR-USB162 - здесь подробно описывается работа с утилитой USB бутлоадера Flip. |