«Создайте пожалуйста урок или хоть какое-то объяснение как программировать под usb на примере at90usb162. Как создать хотя бы самое элементарное USB устройство на аппаратном usb и чтобы оно распознавалось в компьютере.» — Сергей
В качестве конечной задачи, организуем мост USB-UART: со стороны мк данные будут отсылаться по USB, а со стороны ПК мы будет принимать данные с виртуального Com порта. Таким образом останется совместимость с программами работающими с обычным Com портом, т.е. можно заменить связку AVR+FTDI одной AT90. Нам понадобится AT90USB162-16AU, огрызок текстолита, 2 резистора по 22Ом, штырьки, разъем USB type B, кварц на 16МГц, 2 конденсатора по 12-22пФ, 1 конденсатор на 1мкФ, по питанию конденсатор на 0.1мкФ и желательно еще один на 10мкФ.
Собираем все по схеме, длина D+, D- одинаковая и минимально возможная и как можно ближе друг к другу. Номиналы строго указанные выше.

Разводим, травим, получаем такую штукенцию

Паечный скилл потихоньку растет, хоть и далек от идеала.

Если с ходу засунуть в USB то определится в системе так:

Таким образом у нас сразу есть готовое устройство, в чем его плюс? В том что если скачать атмеловскую софтину, то можно шить этот камень без всяких программаторов. Но наша задача получить устройство к которому можно подключаться как COM порту. У атмела на сайте можно найти аппнот «AVR272: USB CDC Demonstration: UART to USB Bridge, on megaAVR with USB». В принципе вариант нормальный, качаете готовый пример, правите под себя и юзаете, подробное описание прилагается. А мы пойдем на север 🙂
Я решил идти другим путем — для ленивых. Запускаем CAVR, настраиваем как CDC

Чуток правим исходник и теперь мы можем кидать байты на комп, как мы это делали бы при помощи юарта, для примера будем кидать Hello раз в секунду.
#include <90usb162.h> #include <delay.h> // USB Device functions #include <usb_device.h> // USB CDC Virtual Serial Port functions #include <usb_cdc.h> // USB initialization #include "usb_init.h" #include <stdio.h> // Use the USB Virtual Serial Port as printf output #define _ALTERNATE_PUTCHAR_ void putchar(char c) { usb_serial_putchar(c); } void main(void) { #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // USB Controller initialization in device mode // Note: This function also initializes the PLL usb_init_device(&usb_config); #asm("sei") // Wait for the USB device to be enumerated by the host while (!usb_enumerated); // Wait 1.5 seconds for the operating system to // load any drivers needed by the USB device delay_ms(1500); // Wait for the USB host to be ready to receive serial data by // setting the CDC Virtual Serial Port's RS-232 DTR signal high while (usb_cdc_serial.control.dtr==0); while (1) { printf("hello"); delay_ms(1000); } } |
После прошивки, венда потребует от нас свежий драйвер, выкладывать его не буду, находится в папке примеров CAVR. Но это еще не все, так как он не имеет подписи, то владельцам Win 8 предстоят пляски с бубном — нужно перезагрузить комп с отключением проверки цифровой подписи и только тогда он установится.

В итоге в диспетчере устройств появится заветный компорт.

И в терминалке будут видны приходящие байты. Скорость передачи настраивается в свойствах COM порта в диспетчере устройств. Проверено и на 9600 работает, и на 115200 работает. Так что развлекаемся 🙂

Собственно поставленная задача решена, про теорию не было сказано ни слова, но явление временное.
Прошивка, разводка, исходники


25 комментариев: AT90USB162 CDC USB-UART