Подключение usb к avr

Обновлено: 05.07.2024

Мы хотим сделать так, чтобы наши устройства управлялись с компьютера программой и можно было использовать возможности компьютера для управления машиной. Для этого нам надо организовать связь по USB между нашим устройством и программой на компьютере.

Прежде чем приступить к этому вы должны были в предыдущей статье ознакомится с Управлением машиной и получить знания о том, что такое микроконтроллер AVR. Если этого не было, сделайте это.

Далее нам надо для связи по USB сделать устройство, программу для микроконтроллера AVR и программу для компьютера.

USB управление для своего устройства

Берем кабель USB и с одной стороны срезаем провода, видим 4 провода, которые нам нужны - красный, чёрный, жёлтый (бывает зеленым) и белый. Красный провод - это плюс питания +5V, чёрный провод - это минус питания. Этими проводами запитываем наше устройство. А другие 2 провода - жёлтый D+ и белый D- используются для обмена данными по USB.

Схема USB устройства на микроконтроллере AVR

Красным и чёрным проводом запитываем микроконтроллер - эти линии просто подключаются к VCC и GND. Линии с данными USB - это D+ и D- подключаются к линиям микроконтроллера, не к случайным, а к тем что заданы в программе для микроконтроллера, которую позднее будем делать, сразу скажу что это будут линии PD2 и PD4. Просто так нельзя подключать их, надо на пути поставить резистор на 68 Ом по требованию стандарта USB и еще снизить напряжение на данных линиях с 5V до 3.6V. Для резисторов посчитаем их мощность - ток USB задается в программе для микроконтроллера и мы его зададим на уровне 0.05 A, значит мощность резисторов 0.05 A * 5 V = 0.25 Вт. Такие и берем. Напряжение снижается параллельным подключением дидов Зенера 3V6 как показано на рисунке, эти диоды надо воткнуть правильной стороной, напомню что чёрная полоска на диоде с одной стороны должна быть направлена в сторону линий D+ и D-, а обратная сторона к минусу питания. И последнее, чтобы работало устройство USB, надо резистором в 1.5 кОм указать режим его работы, подключаем его к D-, это означает низкоскоростной режим, который нам нужен, поскольку мы не планируем передавать большие объемы данных, а только будем посылать простые сигналы, низкоскоростной режим нам нужен. Чтобы увидить что наше устройство работает, подключим светодиод к линии PB0, длинной плюсовой стороной к линии, а другой стороной к минусу питания.

Также воспользуемся вспомогательными инструментами для удобства - это зажим на 20 гнезд, чтобы легко извлекать микроконтроллер для перепрограммирования. И это 2 клеммника, чтобы прикрутить провода USB к макетной плате. Вообщем для сборки устройства нам потребуется сделать такой закуп:

ATtiny2313A купить

Диод Зенера 3V6 купить

Резистор 1.5 кОм купить

Кварцевый генератор 12 купить

Конденсатор 20 pF купить

Светодиод купить

Зажим на 20 гнезд купить

Клеммник купить

Кабель USB купить

Макетная плата купить

Размер: 63 x 2 горизонтальных линий и 4 вертикальные линии

Проводки купить

Набор проводков купить

Собранное готовое к работе USB устройство выглядит так:

USB устройство своими руками

Программа на микроконтроллер AVR для USB связи

1) Скачиваем исходные коды OpenRoboFW и распакуйте архив на диск C:\, я собрал этот архив из файлов проекта V-USB, настроил их на Attiny2313A и тактовую частоту 12 МГц (эти настройки меняются в файле Makefile, если используется другой микроконтроллер), упростил код для внесения изменений. V-USB дает нам исходники программ с идентификаторами VID и PID, которые нужны для распознания USB устройства компьютером. На всякий случай вот ссылка на проект . После распаковки архива содержимое директории выглядит так:


Назначение важных файлов:
main.c - главный файл программы на языке C, она осуществляет обработку информации, пришедшей по USB, и в ней программируется реакция микроконтроллера на USB пакеты с компьютера
Makefile - параметры сборки, тип микроконтроллера (взяли - attiny2313a), частота, информация по фьюзам для других микроконтроллеров, при использовании другого микроконтроллера, в этом файле его нужно прописать в строке DEVICE (например - atmega16a)
usbconfig.h - параметры USB, порт подкючения линии D-, ток

Откройте main.c и обратите внимание на 2 области кода, которые там выделены - программа реакции на USB пакет и настройка портов. В этих областях надо вставлять свой код, остальное можно не трогать. Для примера там уже стоит код, его можно менять. В приходящем пакете USB с компьютера есть 2 параметра - p1 и p2, которые передаются из программы в виде параметров, в зависимости от их значений можно менять состояние линий микроконтроллера (портов) в программе реакции.

2) Скачиваем программу WinAVR и устанавливаем, она нужна для создания HEX-прошивки микроконтроллера AVR, сайт WinAVR

3) Запускаем командную строку Windows, которая находится тут c:\Windows\System32\cmd.exe появляется чёрное окно. В этом окне вводим 2 команды (набираем команду, нажимаем enter):

Запускаем подготовку программы для микроконтроллера

Подготавливаем программу МК

Также надо прошить fuse-биты настроек микроконтроллера, чтобы изменить его тактовую частоту на совместимую с USB стандартом. Встроенной подходящей частоты нет, поэтому применяется внешний источник тактовой частоты 12 МГц. Для прошивки настроек fuse-битов устройство с программатором надо доработать, подключить к микроконтроллеру внешний кварцевый генератор 12 МГц и 2 конденсатора 20 пФ по схеме как на устройстве USB, т.е. в случае с ATTiny2313A к линиям PA1 и PA0, и также соединить это всё с минусом питания, вообщем как на схеме USB устройства, смотрите на фото ниже как подключено. Это нужно для того, чтобы устройство продолжило работу после установки для него нового источника тактового сигнала, именно этот источник 12 МГц и подключаем. Не забудьте кроме программы также прошить fuse-биты.

Меняем настройки программатором

Программатор USBasp купить

Кварцевый генератор 12 купить

Конденсатор 20 pF купить

Мини макетная плата купить

Зажим на 20 гнезд купить

При этом установите такие биты конфигурации:

Для ATtiny2313A (наш случай):
CKSEL0..3=1111 SUT0..1=10 CKOUT=1 CKDIV=1 RSTDISBL=1 BODLEVEL2..0=101 WDTON=1 SPIEN=0 EESAVE=1 DWEN=1

Установите В справочнике эти fuse-биты и прошейте их в микроконтроллер полученной строкой через программу AVR dude, о том Как прошить тут. Также дам на всякий случай fuse-биты для других микроконтроллеров.

Для ATmega8A:
CKSEL0..3=1111 SUT0..1=10 BODEN=0 BODLEVEL=1 BOOTRST=1 BOOTSZ0..1=00 EESAVE=1 CKOPT=0 SPIEN=0 WDTON=1 RSTDISBL=1

Для ATmega16A:
CKSEL3..0=1111 SUT0..1=10 BODEN=0 BODLEVL=1 BOOTRST=1 BOOTSZ0..1=00 EESAVE=1 CKOPT=0 SPIEN=0 JTAGEN=1 OCDEN=1 LB1..2=00 BLB=0000

Теперь когда программа написана и записана в микроконтроллер, можно проверить правильность сборки устройства. Напишите программу на компьютер для USB связи, читайте далее как это сделать и при этом в процессе будет установлен фильтр для возможности опознания устройства. Подключите устройство к USB порту компьютера, установите фильтр как далее будет описано, если все правильно было собрано и установлено, то оно будет обнаружено и опознано как LEDCtlHID. Если этого не произошло, то ищите проблему и ошибки при сборке устройства или при установке программ, еще раз внимательно все сверьте и проверьте, что ничего не пропущено и что все контакты соединены или запаяны как надо. Бывает проблема тут, если пайка была совершена с неконтактами, с не правильными контактами или не всеми контактами, а также что элементы схемы были повреждены высокой температурой паяльника, и устройство поэтому не работает. Важно собирать устройство именно на макетной плате первый раз.

Программа на компьютер для USB связи

Для начала сделаем простую консольную программу, потом будем делать программу с окнами.

3) Скачиваем программу MinGW, которая нужна для сборки программы из исходника. Устанавливаем. Сайт разработчика MinGW. После установки зайдите в Панель управления, Система, Дополнительные параметры системы, Дополнительно (вкладка), Переменные среды (кнопка), Системные переменные (список), Переменная Path (найти в списке, выделить, нажать кнопку Изменить). Дописываем в поле Значение переменной в конце ;c:\MinGW\bin\ и нажимаем ОК, надеюсь вы установили MinGW в C:\MinGW, иначе надо путь другой прописать.

Настраиваем системную переменную Path для MinGW

Подготовка программы ПК

Изменяем программы под наши нужды

Берём под контроль все порты, прибавляем свои функции. И так, теперь в C:\OpenRobo размещены исходные коды программы для компьютера, а в C:\OpenRoboFW исходные коды программы для микроконтроллера. Их можно изменять, но после каждого изменения надо их занова пересобирать (и перепрошивать микроконтроллер), делать это теперь вы умеете - см. выше пример - пересобрать обе программы можно 4-мя командами в cmd:

Запускаем подготовку программы для микроконтроллера

Изменение программы для микроконтроллера

1) Открываем файл C:\OpenRoboFW\main.c, находим там область кода, обозначенную как настройка портов, надо установить все свободные порты на вывод командами DDR, меняем содержимое области на следующий код. Код для main.c:

Порт D не весь настраиваем, а по одному биту вбиваем единицы таким образом на биты 0, 1, 3, 5 и 6

2) Открываем файл C:\OpenRoboFW\main.c, находим область кода, обозначенную как программа реакции на USB пакет, сделаем, чтобы по команде зажигались светодиоды на всех свободных линиях. Меняем содержимое области на. Код для main.c

К тому же неплохо бы научится вставлять свои функции, которые будут выполняться по вашим командам, пока есть только on, off, status, нужно добавить еще команд, например добавим команду discoteka, по которой будет вызываться какая-нибудь наша функция в микроконтроллере, например - светодиоды горят через один на порте B. Добавим в микроконтроллере обработку дополнительных кодов, пусть это будет код 2, т.к. 1 и 0 уже используются для функций on и off, из программы для компьютера будем посылать потом микроконтроллеру код 2 функцией, вызываемой по команде discoteka. Опять меняем файл C:\OpenRoboFW\main.c, область реакции. Код для main.c

Изменение программы для компьютера

1) Открываем файл C:\OpenRobo\set-led.c

3) Редактируем файл set-led.c вставляем сверху от строчки

Обратите внимание на функцию usb_control_msg, в ней можно передать 2 изменяемых параметра (в первом у нас передаётся 2 или переменная isOn, которая равна 1 или 0), следующее число (там стоит 0) может передать еще 1 значение, например, 1 переменная может быть всё также быть изначальной командой на on или off, а второй переменной можно передать, например, номер порта, который следует включить. Получить доступ к этим параметрам в программе для микроконтроллера можно по именам p1 и p2, для этого примера p1=2, p2=0.

Как сделать программу для Windows

1) Заходим на сайт, выбираем русский язык, нажимаем INSTALL NOW.
2) После установки запускаем, нажимаем Создать проект. Для начала создадим простую программу с 1 кнопкой - нажимаем эту кнопку, текст в ней меняется.
3) Выбираем шаблон Приложение Windows Forms, внизу вводим название программы, нажимаем OK.
4) Перетаскиваем справа элемент Button на центральное окно с формой и оставляем его внутри формы.
5) Кликаем на форму и на кнопку, при этом справа внизу есть окно Свойства, его содержимое меняется. В этом окне задаём необходимые свойства элементов - текст кнопки и окна. Редактируем свойство Text, пишем там любой текст, например, Моя кнопка. Текст на кнопке меняется, это видно на форме в центральном окне.
6) Теперь сделаем так, чтобы при нажатии на эту кнопку, ее свойство, которое определяет текст на ней менялось на другое. Так же можно менять любые другие свойства.
7) Делаем двойной клик на кнопке Моя кнопка, которая находится в форме в центральном окне, попадаем в файл кода Form.h (его можно выбрать в любое время слева в меню). В этом файле после двойного клика была создана функций button1_Click (остальной код автоматом был создан по шаблону при создании проекта), курсор находится внутри нее, нажмите Enter, чтобы создать пустую строку, куда и будем писать код.
8) Как можно видеть в этом же файле чуть повыше есть разделы - button1 и form1, там заданы начальные установки для элементов - кнопки и формы. Воспользуемся ими, скопируем внутрь нашей функции клика по кнопке (это место отмечено красной стрелкой) строчку, где устанавливается название кнопки, а именно this->button1->Text = L"Моя кнопка"; Только текст Моя кнопка изменим на Работает!
9) Нажимаем на кнопку с зеленым треугольником, через некоторое время наша программа запустится (если вы не совершили ошибок) и при нажатии на кнопку, текст внутри меняется с Моя кнопка на Работает!
10) Забрать готовую программу (файл .exe) можно в директории текущего пользователя
Весь процесс показан на картинках.

Разработка различных устройств на основе микроконтроллеров — занятие, достойное настоящего компьютерного гика. Несомненно, полезной фишкой любого гаджета будет USB-интерфейс для подключения к компьютеру. Но что делать, если в микросхеме AVR не предусмотрена аппаратная поддержка USB?

V-USB: размер имеет значение

При разработке собственного гаджета часто встает проблема его подключения к компьютеру. Надо сказать, что порты LPT и COM — теперь экзотика на материнских платах ПК, не говоря о ноутбуках, у которых эти интерфейсы исчезли давным-давно. Поэтому у современных компьютеров практически не осталось альтернатив интерфейсу USB.

Если ресурсы чипа используются на все сто процентов, то лучше сразу смотреть в сторону устройств с аппаратной поддержкой универсальной последовательной шины (такие микроконтроллеры присутствуют в линейке любого производителя). В остальных случаях можно использовать софтовый USB.

Для микроконтроллеров Atmel существует замечательный проект V-USB, который предлагает программную реализацию низкоскоростного устройства USB 1.1. Код V-USB будет работать на любом устройстве AVR, у которого есть хотя бы 2 Кб Flash-памяти и 128 байт ОЗУ, с тактовой частотой 12; 12,8; 15; 16; 16,8 или 20 МГц.

Использование продукта возможно как в рамках open source лицензии GPL, так и на коммерческой основе. Для того чтобы разрабатывать собственные USB-устройства, обычно также нужно покупать что-то вроде лицензии. Но ребята из V-USB позаботились и об этом, приобретя пару Vendor ID — Product ID и разрешив их использовать любому желающему.

Аппаратная обвязка для подключения USB-шины к микроконтроллеру очень простая. Если устройство потребляет не слишком много, то запитать его можно прямо от шины (считается, что линия питания USB компьютера способна отдавать ток до 500 мА). Так как информационные линии (D+ и D–) используют уровень сигнала 3,6 В, кроме токоограничивающих резисторов, необходимы стабилитроны для согласования с 5-вольтовой логикой чипа. Чтобы обозначить тип подключения, нужно «подтянуть» напряжение питания через сопротивление 1,5 кОм к линии D–.

Подключение USB к микроконтроллеру ATtiny2313

Подключение USB к микроконтроллеру ATtiny2313

Альтернативный вариант сопряжения по USB — снизить напряжение питания контроллера посредством соответствующей микросхемы стабилизации или просто парой диодов. Последнюю схему можно найти на сайте проекта V-USB.

Программатор USBtiny

Для микроконтроллеров AVR существует множество различных программаторов. USBtiny здесь упоминается, в частности, потому, что содержит программную реализацию USB, аналогичную V-USB. Схема этого программатора проста: версия 2 содержит две микросхемы, а первая версия — лишь одну (собственно чип ATtiny2313). Благодаря подробному описанию на сайте и простым комплектующим устройство легко сделать даже начинающему. USBtiny совместим с популярной программой avrdude, используемой для программирования микроконтроллеров AVR.

prog

Единственная проблема заключается в заливке прошивки в чип программатора — для этого нужен… программатор. Если есть компьютер с LPT-портом, то можно сделать один из вариантов FBPRG ака «пять проводков», который железно

Готовим санки

Программный инструментарий, необходимый для реализации простейшей прошивки USB-гаджета, предельно аскетичен: компилятор gcc-avr, библиотека avr-libc, программатор avrdude и набор binutils для AVR. В Debian/Ubuntu все, что нужно, устанавливается одной командой:

Работа с программатором avrdude

Работа с программатором avrdude

Чтобы воспользоваться лицензией V-USB для устройства, числовые идентификаторы производителя и устройства изменять не надо. А вот символьные имена можно выбрать по своему вкусу (они позволят отличить несколько устройств на основе V-USB, подключенных к одному и тому же компьютеру):

Разнообразные гаджеты

У тебя есть идея какого-нибудь устройства? Не спеши паять и кодить, а поищи, возможно, кто-то подобное уже делал. Если не получится воспользоваться готовыми схемами и исходниками, то хотя бы не придется начинать все с нуля.

Например, проект V-USB благодаря лицензионной политике накопил приличную базу готовых (в том числе и свободно распространяемых) решений. Здесь можно найти различные реализации клавиатур, USB-адаптеров для джойстиков, геймпадов (в том числе и раритетных, например SNES/NES, Nintendo 64, ZX Spectrum джойстик, Sony PlayStation 1/2) и тому подобное. Адаптеры DMX, виртуальные порты COM и UART, i2c, Servo, беспроводные интерфейсы DCF77, IR — все, что поможет подключить к ПК больше новых устройств. Логгеры, платформы для датчиков и сенсоров, адаптеры для LCD-дисплеев, программаторы и загрузчики также могут оказаться полезными в хозяйстве.

Программа для чипа — элементарно!

Создадим файл main.c на одном уровне с папкой usbdrv и опишем в нем необходимые заголовочные файлы, определения и переменные:

В main.c переопределим функцию usbFunctionSetup, которая вызывается автоматически при получении нового запроса:

Собственно, функция usbFunctionWrite занимается тем, что заполняет буфер replyBuf полученными данными.

Кстати, чтобы этот метод работал, нужно внести изменения в usbconfig.h:

Ну и последняя функция прошивки — main:

Задействуем USART/UART

Хорошая альтернатива программному/аппаратному USB — использование в чипе популярного интерфейса USART/UART со сторонним преобразователем этого протокола в USB, который можно выполнить, например, на основе микросхемы FT232RL.

Libusb: и не одетая, и не обнаженная

Ты спросишь: а придется ли писать драйвер для операционной системы компьютера, чтобы подключить USB-устройство? Если использовать libusb, то можно обойтись без реализации полноценного модуля ядра. Libusb — это open source библиотека, которая позволяет быстро запрограммировать, во-первых, поиск устройства на шине, а во-вторых — обмен данными с ним.

Под Linux библиотеку и необходимые заголовочные файлы можно получить из исходных кодов. А лучше воспользоваться стандартным репозиторием твоего дистрибутива. Для Debian/Ubuntu, например, так:

Существует также порт libusb под Windows — libusb-win32. Вопреки названию проекта, также поддерживаются 64-битные ОС от Microsoft (начиная с версии 1.2.0.0).

Но libusb — это отдельная тема разговора. Думаю, с программированием для ПК ты знаком и сможешь в этом разобраться сам. Поэтому буду краток. Создаем файл usbtest.c и начинаем наполнять его контентом. Сначала необходимые заголовочные файлы и определения:

Функция usbOpenDevice для инициализации устройства:

Как видно, параметрами usbOpenDevice выступают числовые идентификаторы производителя и устройства. В случае если устройство присутствует на шине, возвращается его дескриптор. Если устройств на V-USB будет несколько — придется дописать проверку символьных имен вендора и продукта.

И функция main консольной утилиты usbtest:

Proteus отдыхает

Всенародно любимый симулятор электрических схем Proteus ISIS бесполезен при разработке устройств с программной реализацией USB. Его эмулятор USB поддерживает только чипы с аппаратной поддержкой универсальной последовательной шины (например, AT90USB646 или AT90USB1286).

Собираем, прошиваем, тестируем

Ниже приведен небольшой, но очень полезный Makefile, c помощью которого командой make из main.c и usbtest.c легко получить прошивку для чипа — main.hex и бинарник утилиты usbtest:

Чтобы залить прошивку в микроконтроллер с помощью программатора usbtiny, набираем команду:

В avrdude фьюзы задаются не слишком наглядно, но их можно легко рассчитать в одном из online-калькуляторов.

Online-калькулятор фьюзов

Online-калькулятор фьюзов

Подключаем устройство к компьютеру и проверяем, как оно работает (usbtest c параметром out считывает строку, in — записывает указанную строку в буфер чипа):

Тестирование взаимодействия с ATtiny2313 по USB (заливаем в чип строку, а затем cчитываем ее)

Тестирование взаимодействия с ATtiny2313 по USB (заливаем в чип строку, а затем cчитываем ее)

Ложка дегтя

Софтовый USB не есть панацея. Программные реализации обычно имеют ряд упрощений, таких как отсутствие проверки контрольной суммы и симметричности канала, что отрицательно сказывается на помехозащищенности. Также обычно софтовые библиотеки используют низкоскоростные режимы работы USB. Да и код USB-библиотеки «кушает» и без того небольшую память чипа.

Подглядываем…

На уровне логики протокол USB — это, по сути, многоуровневая пакетная передача данных. В этом нетрудно убедиться (а заодно узнать много интересного про USB), воспользовавшись анализатором сетевых протоколов Wireshark. Предварительно необходимо загрузить драйвер USB-монитора:

Теперь в списке интерфейсов Wireshark можно выбирать шины USB. Посмотреть номер шины устройства можно, например, в логах.

Перехват USB-пакетов в Wireshark

Перехват USB-пакетов в Wireshark

  • Сайт проекта V-USB;
  • сайт проекта libusb;
  • сайт проекта libusb-win32; про V-USB и libusb (англ.);
  • статья про libusb, часть 1;
  • статья про libusb, часть 2; на основе V-USB;
  • сайт проекта USBtiny;
  • сайт проекта AVReAl; фьюзов.

Заключение

Надеюсь, после того, как ты научился пересылать данные между компьютером и микроконтроллером AVR, твоя страсть к электронике воспылает с новой силой, породив немало оригинальных и полезных устройств. Остается лишь пожелать тебе успехов на этом сложном, но интересном поприще.


Всем привет. Давайте немного вспомним, что в прошлой статье мы с Вами рассмотрели способ подключения микроконтроллера AVR к ОС Android, а также основные узлы для реализации этой цели. Сегодня мы познакомимся поближе с библиотекой V-USB, а именно рассмотрим на примере сам механизм взаимодействия и передачи данных avr – хост, сначала Windows, а потом Android. Ссылка на ресурс была приведена ранее в прошлой записи. Документация на библиотеку есть как в английской версии так и в русской.

Итак поехали. Скачиваем, например, архив V-USB 2012-12-06 . В данном архиве находится (рис. слева) драйвер для интерфейса USB, на стороне AVR ( usbdrv ), код для USB-устройства и хоста ( libs-device, libs-host ), примеры ( examples ), схемы подключения ( circuits ) и др. Документации по API драйвера, библиотек хоста и устройства: находятся в соответствующих заголовочных файлах ( usbdrv.h, opendevice.h, osccal.h ). Примеры, которые даны в библиотеке, следующие: — (custom-class) — отправка и прием малых порций данных к (от) устройству; — (hid-data) — применение функций usbFunctionWrite () и usbFunctionRead () , прием и отправка больших объемов данных с генерированных устройством на лету; — (hid-custom-rq) — демонстрация устройства HID-класса; — (hid-mouse) — реализация устройства мыши. Использование входящих конечных точек ( interrupt-in endpoints );

AVR - хост

Все примеры содержат: одну папку ( firmware ) для программы на микроконтроллер, другую ( commandline ) — содержащую какое ни будь приложение или драйвер для хоста. Ну ведь как то они должны здороваться, общаться, будь то Windows или Android или другой хост.

Всем этим заправляют дескрипторы — небольшие массивы данных жестко организованной структуры. Более подробно о них читайте в стандартах USB. Устройство может содержать несколько конфигураций, конфигурация может содержать несколько интерфейсов, интерфейс может содержать несколько endpoints (конечные точки, эндпоинты) и несколько HID-дескрипторов. Эндпоинт — это минимальный канал, через который может передаваться информация.

Виртуальные каналы (конечные точки) бывают 4-х видов:
Control – тип канала используется хостом для управления периферийным устройством и передачи данных.
Bulk — для обмена данными. Механизм целостности и доставки данных для данного канала реализована «в железе». Скорость передачи ограничена.
Isochronous — для обмена потоковыми данными. Целостность и доставка данных не контролируются, зато скорость значительно выше чем для Bulk каналов.
Interrupt – для реализации подобия «прерываний», которые являются логическими, и никак напрямую не связанны с аппаратными прерываниями МК или прерываниями ОС. Итак разберем дескриптор:

/*Запрос хостом данных от устройства*/

uchar usbFunctionRead (uchar *data, uchar len)
< if (len > bytesRemaining)
len = bytesRemaining;
eeprom_read_block (data, (uchar *) 0 + currentAddress, len);
currentAddress += len;
bytesRemaining -= len;
len; >

/* Посылка хостом данных в устройство .*/
uchar usbFunctionWrite (uchar *data, uchar len)

< if (bytesRemaining == 0)
return 1; /*Окончание передачи */
if (len > bytesRemaining)
len = bytesRemaining;
eeprom_write_block (data, (uchar *) 0 + currentAddress, len);
currentAddress += len;
bytesRemaining -= len;
return bytesRemaining == 0; > /*Возврат 1, если это был последний кусок */

На рисунке видно что хост принял пакет из 128 элементов, как было описано в дескрипторе.

usbMsgLen_t usbFunctionSetup (uchar data[8]) <
usbRequest_t *rq = (void *) data;
if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) < /*Запрос HID class*/
if (rq->bRequest == USBRQ_HID_GET_REPORT) < /*wValue: ReportType (highbyte), ReportID (lowbyte)*/
/*Поскольку мы имеем только один тип репорта, мы можем игнорировать репорт-ID*/
bytesRemaining = 128;
currentAddress = 0;
return USB_NO_MSG; /*Использование usbFunctionRead () для получения данных хостом от устройства*/
>else if (rq->bRequest == USBRQ_HID_SET_REPORT) <
/*Поскольку мы имеем только один тип репорта, мы можем игнорировать репорт-ID */
bytesRemaining = 128;
currentAddress = 0;
return USB_NO_MSG; > /*use usbFunctionWrite () для получения данных устройством от хоста */
>else <
/*игнорируем запросы типа вендора, мы их все равно не используем */ >
return 0; >

ASCII (American standard code for information interchange) — название таблицы (кодировки, набора), в которой некоторым распространённым печатным и непечатным символам сопоставлены числовые коды. (Рисунок слева).

odDebugInit (); /*Функция выполняет переопределение и поиск регистров управления, а также разрешение передачи регистра UCSRB приема-передатчика uart задание значения регистру ubrr , т.е. определение скорости передачи. Мы с Вами уже рассматривали настройки данного интерфейса в статье №40. Также хочется сказать что функция использует спецификаторы static inline , где первый дает указания сохранить значение при выходе из функции, а использование встраивания inline дает указание для GCC сделать вызовы функции быстрее, что достигается вставкой кода тела функции в то место, где она вызывается. Более подробно смотри драйвер*/
usbInit (); /*Данная функция отвечает за начальные установки: внешние прерывания, их генерации, включения/выключения, конечные точки. В файле usbconfig.h необходимо сконфигурировать количество конечных точек. Мы с Вами уже говорили что конечная точка это минимальный виртуальный канал. В нашей программе в файле конфигурации скомпилирована версия с двумя конечными точками (endpoints): default control endpoint 0 и interrupt-in endpoint (любой другой endpoint номер). В данной функции также передаются токены.*/ Рассмотрим, ниже, описанные константы и типы спецификации USB в usbdrv.h.

Разобрав функции usbInit () и пакеты продолжаем далее разбирать код основной функции.

usbDeviceDisconnect (); /*Является макросом напоминающим функцию и предназначено (вместе с usbDeviceConnect ()) соединять и рас соединять устройство с шиной USB хоста. Здесь требуется конфигурация файла usbconfig.h . Где необходимо задать номер порта и биты D+ and D- соответственно USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT и USB_CFG_DPLUS_BIT . Также важно дополнить, что прерывание USB должно быть запрещено, когда устройство переходит в отключенное состояние, или обработчик прерывания зависнет. В предыдущей функции ( usbInit () ) у нас содержится селективное выключение прерывания USB: USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT); . Также должна запускаться принудительная реэнумерация при запрете прерываний (повторная энумерация, или исчисление частей). Другими словами опознание устройства USB стеком USB ядра операционной системы, в процессе конфигурирования*/

0.5 мс на байт при скорости 19200 bps. Я думаю более детально мы ее разберем в следующих статьях когда будем использовать в качестве хоста Android.*/
return 0; >

Дабы не растягивать статью, то практическую часть мы перенесем в следующую запись. Рассмотрев программную часть реализации USB интерфейса, в следующей записи мы подключим МК к хосту в данном случае Windows XP и попробуем записать/считать данные. На этом на сегодня и остановимся. Всем пока.

Множество микроконтроллеров Atmel AVR со встроенным контроллером USB предоставляют богатые функциональные возможности и периферию, как профессионалам, так и любителям, однако дополнительная сложность разработки программного обеспечения для микроконтроллера и Host-устройства (персональный компьютер) является высоким барьером для любого желающего освоить процесс коммуникации по интерфейсу USB. Хотя на сегодняшний день имеются средства, упрощающие разработку ПО для микроконтроллера с USB интерфейсом, к примеру, это USB стек LUFA с открытым исходным кодом, они все равно требуют определенных знаний о программе для микроконтроллеров AVR, для Windows, а также о физическом аппаратном уровне для поддержки приложений. В данной статье решается эта проблема и предоставляется готовая структура, на базе которой пользователи могут разрабатывать свои приложения и USB устройства.

LED-драйверы MEAN WELL для промышленных и уличных светодиодных светильников: особенности, преимущества, выбор

USB Generic HID структура для Atmel AVR и Windows

Мы рассмотрим базовую разработку аппаратной части, базовый проект программного обеспечения для микроконтроллера, DLL библиотеку для Windows и тестовое Host-приложение для ПК. Предоставляя проверенную и рабочую основу для разработки USB приложений, структура значительно упрощает задачу изучения USB интерфейса и построения USB устройств.

USB Generic HID протокол предоставляет очень гибкий интерфейс без требований к пользовательским USB драйверам на Host-устройстве, т.к. устройства класса HID поддерживаются всеми ОС MS Windows, начиная с Windows 98SE, а также MACOS, Linux и пр., благодаря встроенным драйверам.

Аппаратная часть

Отладочная плата на базе микроконтроллера ATmega32U4 для разработки USB приложений

Аппаратная часть для нашего проекта – это своего рода отладочная плата на базе микроконтроллера ATmega32U4 с интерфейсом USB.

Микроконтроллер ATmega32U4 содержит 32 КБайт внутрисистемно-программируемой флэш-памяти с возможностями чтения во время записи, 1 КБайт ЭСППЗУ, 2.5 КБайт статического ОЗУ, 26 линий ввода-вывода общего назначения (КМОП-выходы и LVTTL-входы), 32 рабочих регистра общего назначения, четыре конфигурируемых таймера-счетчика с режимами сравнения и ШИМ, еще один высокоскоростной таймер-счетчик с режимами сравнения и программируемой ФАПЧ в качестве тактового источника, один УСАПП (с выводами аппаратного управления потоком CTS/RTS), байт-ориентированный 2-проводной последовательный интерфейс, 12-канальный 10-битный АЦП с опциональным дифференциальным входным каскадом (программируемое усиление), встроенный откалиброванный датчик температуры, программируемый сторожевой таймер с отдельным встроенным генератором, последовательный интерфейс SPI, совместимый с IEEE 1149.1 отладочный интерфейс JTAG (доступ к встроенной отладочной системе и программирование) и шесть программно-выбираемых экономичных режимов работы.

Принципиальная схема платы представлена ниже.

Из периферии на плате установлены 4 светодиода, 2 кнопки, кнопка сброса и потенциометр 10 кОм. Питание плата может получать или от интерфейса USB, или от внешнего источника. Выбор источника осуществляется с помощью перемычки (или переключателя) SV1. При питании от внешнего источника используется регулятор напряжения типа LM1117 с выходным напряжением 5 В и выходном токе 800 мА. Для индикации присутствия напряжения питания установлены два светодиода.

Как вы видите на схеме, периферия подключается к микроконтроллеру через джамперы, что позволяет отключать ее при необходимости. Это сделано для того, чтобы отладочную плату можно было подключать к макетной плате для быстрого прототипирования устройств. Кнопки подключаются к микроконтроллеру непосредственно.

Для совместимости с различными USB загрузчиками на плате установлен резистор 1 кОм, подключенный к порту PE2 (HWB) микроконтроллера через джампер.

Сигналы линий ввода/вывода микроконтроллера выведены на коннекторы, которые располагаются по периметру платы.

Вид печатной платы

Загрузки

Принципиальная схема и печатная плата отладочной платы (Eagle) – скачать

Часть 2 – прошивка микроконтроллера, демонстрационное ПО, приложения для Windows
Часть 3 – USB Generic HID библиотека коммуникационных функций и ее использование

Читайте также: