При портировании проектов V-USB с макетной платы AVR-USB-MEGA16 на макетную плату AVR-USB-TINY45 столкнулся с рядом особенностей реализации кода, которые решил рассмотреть в этой статье. Надеюсь, она поможет в портировании проектов V-USB между микроконтроллерами старших (ATmegaXX) и младших (ATtinyXX) моделей.
Портирование проектов между ATmegaXX и ATtinyXX предоставляет много возможностей. Самый большой плюс, на мой взгляд - теперь можно отлаживать программы для ATtiny на кристаллах ATmega, так как отладка в этом случае намного проще - на ATmega можно передавать отладочную информацию через UART, полноценно использовать JTAG и отключать оптимизацию для пошаговой отладки (чего нельзя делать на ATtiny из-за того, что у неё очень мало ножек и памяти). Проектов на библиотеке V-USB для чипов ATmega намного больше, чем для ATtiny. Так что теперь проще делать миниатюрные устройства USB на чипах ATtinyXX и библиотеке V-USB.
Главное отличие, которое имеют ATmega и ATtiny для библиотеки V-USB - это даже не количество ножек и не объем кода FLASH, а тот факт, что ATmega работает с кварцевым резонатором (который может быть любым из ряда частот 12, 15, 16, 16.5, 20 МГц), а ATtiny работает со встроенным подстраиваемым генератором на частоте 16.5 МГц (так как из-за малого количества свободных ножек подключать кварц к ATtiny смысла нет). Поэтому нужно не забыть правильно сконфигурировать фьюзы ATtiny, а также добавить код для поддержки автонастройки тактового генератора. Для наглядности я свел в таблицу отличия проектов на ATmega и ATtiny.
Настраиваемая опция проекта |
ATmega32 (AVR-USB-MEGA16) |
ATtiny85 (AVR-USB-TINY45) |
makefile |
DEVICE |
atmega32 |
attiny85 |
F_CPU |
12000000 15000000 16500000 20000000 |
16500000 (кварц не нужен!) |
FUSE_L |
0xCF |
0xD1 |
FUSE_H |
0x98 |
0xDD |
main.c |
#include <avr/eeprom.h> |
не обязательно |
нужно для сохранения байта калибровки частоты тактового генератора |
calibrateOscillator() usbEventResetReady() |
не нужно |
нужно для подстройки частоты тактового генератора по событиям SOF |
код в main() для начальной установки OSCCAL байтом из EEPROM |
не нужно |
нужно для подстройки частоты тактового генератора по событиям SOF |
usbconfig.h |
USB_CFG_IOPORTNAME USB_CFG_DMINUS_BIT USB_CFG_DPLUS_BIT |
назначить по принципиальной схеме |
назначить по принципиальной схеме |
USB_RESET_HOOK(isReset) hadUsbReset() |
не нужно |
нужно раскомментировать USB_RESET_HOOK и предоставить код для hadUsbReset() |
USB_CFG_HAVE_MEASURE_FRAME_LENGTH |
0 |
1 |
Закачка прошивок и исходного кода (на примере портирования проекта firmware hid-custom-rq устройства USB HID) |
Где взять скомпилированную прошивку firmware тестового примера устройства USB HID (управление светодиодом макетной платы) |
Ссылка [4], см. в архиве папку examples\hid-custom-rq\firmware-bin |
Ссылка [4], см. в архиве папку examples\hid-custom-rq\firmware-bin |
Где взять исходный код тестового примера firmware устройства USB HID (управление светодиодом макетной платы) |
Ссылка [4], см. в архиве папку examples\hid-custom-rq\firmware-mega |
Ссылка [4], см. в архиве папки examples\hid-custom-rq\firmware-tiny и examples\hid-custom-rq\firmware-tiny-haunted |
Где взять скомпилированное ПО хоста для управления тестовым устройством USB HID (управление светодиодом макетной платы) |
Ссылка [4], см. в архиве папки examples\hid-custom-rq\commandline и examples\hid-custom-rq\set-led-gui |
Ссылка [4], см. в архиве папки examples\hid-custom-rq\commandline и examples\hid-custom-rq\set-led-gui |
Где взять исходный код ПО хоста для управления тестовым устройством USB HID (управление светодиодом макетной платы) |
Ссылка [4], см. в архиве папки examples\hid-custom-rq\commandline и examples\hid-custom-rq\set-led-gui |
Ссылка [4], см. в архиве папки examples\hid-custom-rq\commandline и examples\hid-custom-rq\set-led-gui |
В примере портирования по ссылке [4] устройство USB HID (examples\hid-custom-rq) портировано так, что для разных микроконтроллеров и макетных плат (AVR-USB-MEGA16 и AVR-USB-TINY45) подходит одна и та же управляющая программа ПО хоста (examples\hid-custom-rq\set-led-gui или examples\hid-custom-rq\commandline).
Что еще нужно не забыть, но нет смысла сводить в таблицу:
1. Правильно переназначить ножки согласно принципиальным схемам (D+ и D-, LED). 2. Правильно назначить сигналы D+ и D-. Помните, что D+ должен приходить на аппаратное прерывание ножки INT0 кристалла! 3. Переназначить VID и PID (usbconfig.h: USB_CFG_VENDOR_ID и USB_CFG_DEVICE_ID). 4. Переназначить USB_CFG_VENDOR_NAME и правильно установить его длину в USB_CFG_VENDOR_NAME_LEN. 5. Переназначить USB_CFG_DEVICE_NAME и правильно установить его длину в USB_CFG_DEVICE_NAME_LEN. 6. Правильно прописать дескриптор USB устройства (main.c: PROGMEM char usbHidReportDescriptor [USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH]) и прописать его длину (usbconfig.h: USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH).
[Ссылки]
1. Макетная плата AVR-USB-TINY45 (микроконтроллер ATtiny45 или ATtiny85). 2. Макетная плата AVR-USB-MEGA16 (микроконтроллер ATmega16 или ATmega32). 3. Разработка устройства USB - как начать работу с библиотеками AVR USB (V-USB) и libusb. 4. 110918avrusb-20080513.zip - исходный код и готовые прошивки примера портирования устройства USB HID (портирование кода между макетными платами AVR-USB-MEGA16 и AVR-USB-TINY45). |