us_uart1«Создайте пожалуйста урок или хоть какое-то объяснение как программировать под 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- одинаковая и минимально возможная и как можно ближе друг к другу. Номиналы строго указанные выше.
cdc_sch

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

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

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

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

Я решил идти другим путем — для ленивых. Запускаем CAVR, настраиваем как CDC
cdc_setup

Чуток правим исходник и теперь мы можем кидать байты на комп, как мы это делали бы при помощи юарта, для примера будем кидать 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 предстоят пляски с бубном — нужно перезагрузить комп с отключением проверки цифровой подписи и только тогда он установится.
cdc_cavr

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

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

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

Прошивка, разводка, исходники

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

  • А как в программаторе от PROTTOSA AVR910 без всяких FTDI и аппаратной поддержки USB на МЕГА8 реализована коммутация с ПК, и как можно это использовать в других проектах(на что еще годится?), например USB звуковуха? Ждем продолжения статей на эту тему. 🙄

  • В AVR910 все это реализовано программно, со всеми вытекающими недостатками. Кстати на базе AT90USB162 делают программаторы клоны AVRISP

  • а какую максимальную скорость передачи можно установить? 115200 или можно больше

  • Вроде можно больше 115200

  • А что у Вас за версия CAVR?
    У моей настройка USB намного хуже…

  • Присоединяюсь к вопросу Юрия. Какая версия CVAVR, или это плагин CVAVR к AVRStudio?

  • Разобрался.
    В CodeVisionAVR V3.16 Evaluation такая же настройка.

  • Было бы замечательно рассмотреть и остальные режимы — джойстика, клавиатуры и мыши, а то возникают вопросы как передавать нажатую клавишу в USB или передвижение мыши и есть ли другая команда для CDC вместо printf?

  • вот
    printf(«hello»);
    это передать, а как принять от ПК?

  • x = getchar(); прием побайтный

  • «x = getchar(); прием побайтный»

    не знаю как у всех, а у меня терминал тупо виснет и все, передаваемые данные не обрабатываются

    и все же как принимать?

  • Admin, разжуй, пожалуйста нубам, здесь прием не так прост, как кажется — если с ПК передать данные, то все просто виснет, будь то терминалка, или какой-то другой софт, насколько здесь большой приемный буфер USB? Пробовал функции из библиотеки usb_cdc.h на очистку буфера, не катит. (к слову вместо printf лучше пользоваться функциями от туда, так как не работает printf даже с #include , хотя компилируется) . В общем главный вопрос остается с приемом данных.

  • у CAVR в папке examples есть пример работы с CDC, там есть описание использования getchar

  • Попробуйте сами принять данные, затык и все, в примерах эта функция вызывает функцию из usb_cdc.h, это понятно, но не принимает данные

  • Давайте разберемся, а то не я один такой, смотрю)

  • Ок. Как будет время ковырну.

  • скачал кодвижн 3.2 — по сравнению с 3.12 этот вопрос видно ковыряли в направлении cdc — теперь хотя бы терминал не виснет, а при работе скажем с самописной прогой на той же визуал студио выдает ошибку типа «время ожидания операции записи истекло» (если использовать обычный UAB-UART на спец микросхеме — работает нормально везде и всюду) и все же в среднем все равно затык 🙁

  • USB-UART * (извиняюсь, жаль редактировать нельзя сообщение)

  • Аналогичный затык с описанным в экзампле getchar()`ом. Ещё странно, что usb_serial_available() возвращает 0. И, кстати, странная штука с этими AT90USB162: delay_us() с любым аргументом создаёт долбанистически огромную задержку, delay_ms() при этом работает как полагается…

  • Если все и правда так печально, то попробуйте использовать LUFA

  • Прое..ался с проблемой затыка целый день. Вроде нашел решение. Вот решение с ком портом (не в лучшем виде, разбирайтесь сами, времени разжевывать нет):
    HANDLE hCOM = CreateFile(c, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hCOM!=INVALID_HANDLE_VALUE) {
    COMMTIMEOUTS timeouts;
    // GetCommTimeouts(hCOM, &timeouts);
    EscapeCommFunction(hCOM, SETDTR);
    EscapeCommFunction(hCOM, CLRBREAK);

    timeouts.ReadIntervalTimeout = MAXDWORD;
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 0;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant = 0;
    if (!SetCommTimeouts(hCOM, &timeouts)) {
    cout << "Error tm COM" << com << endl;
    }

    BOOL r = ReadFile(hCOM, &res, 1, &dw, NULL);//Прием первого байта если он есть

    cout << "COM" << com << " is open OK!" << endl;

    CloseHandle(hCOM);

    На контроллере после инициализации отправляем первый байт, например:
    while (usb_cdc_serial.control.dtr==0);

    usb_serial_putchar('\n');

  • Flip не может открыть полученный hex файл. Было у кого нить такое

  • Народ, кто-нибудь все же разобрался как принимать байты? Ни getchar(), ни usb_serial_getchar() не работают… Посмотреть бы как-то из чего эти функции состоят, но добраться до них не могу, usb_cdc.lib не открывается…

  • Я так понимаю для входа в boot не нужно устанавливать перемычки на плате, то есть при подключении к USB он по умолчанию стартует с bootloader’а? Или все же нужен джампер с PD7 на VCC?

  • все таки надо

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика