Подключение usb к avr
Мы хотим сделать так, чтобы наши устройства управлялись с компьютера программой и можно было использовать возможности компьютера для управления машиной. Для этого нам надо организовать связь по USB между нашим устройством и программой на компьютере.
Прежде чем приступить к этому вы должны были в предыдущей статье ознакомится с Управлением машиной и получить знания о том, что такое микроконтроллер AVR. Если этого не было, сделайте это.
Далее нам надо для связи по USB сделать устройство, программу для микроконтроллера AVR и программу для компьютера.
Программа на микроконтроллер 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):
Программа для микроконтроллера
Далее нам необходимо откомпилировать программу и записать ее в микроконтроллер. Если все настроено и сделано правильно то после подключения микроконтроллера к USB, компьютер должен определить ваше устройстов как HID.
Изменение программы для компьютера
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, точнее как использовать этот интерфейс USB на микроконтроллерах семейства AVR. В интернете на данную тему много информации но большинство из нее представлено отдельными фрагментами и не дает полную картину о то как использовать этот интерфейс на микроконтроллерах AVR.
Такие интерфейсы как COM, MIDI, LPT широко использовались в свое время, но сейчас они морально устарели и все реже и реже встречаются в современных компьютерах в основном в компьютерах для промышленного и узкоспециализированного оборудования. Для связи собранного устройства с компьютером можно использовать всевозможные переходники конвертеры и эмуляторы, но как показывает практика они порождают множество проблем.
Для того чтобы использовать подружить USB и AVR можно пойти 3-мя путями:
Использовать аппаратную поддрежку USB интерфейса, к примеру микроконтроллера AT90USB*. Для того чтобы его использовать нужно написать для него особую прошивку. И если вашу собраное устройство не стандартного класса USB то придется для компьютера писать драйвер, который объяснит ПК с каким устройством имеем дело.
Использовать конверторы USB в какой нибудь другой интерфейст (к примеру USB-UART на микросхеме FTDI FT232RL). В качествое других интерфейсов может выступать RS232, I2C или другие. При таком подходе нам не нужно замарачиваться и знать как работает интерфейс USB, также нужда в драйвере для компьютера тоже отпадает, так как драйвера для таких конверторов уже написаны производителем.
Можно сделать все хитрее взять микроконтроллер AVR и написать для него программу которая будет эмулировать работу USB. При таком подходе возникает трудность в реализации большой скорости передачи данных. Интерфейс USB работает на большой скорости которая может быть: LowSpeed - 1,5 Mbit/s, FullSpeed - 12 Mbit/s, HighSpeed - 480 Mbit/s, а у интерфейса USB 3.0 скорость может быть еще выше. Поэтому на микроконтроллерах AVR можно сделать устройство только со скоростью LowSpeed. Для большинства самодельных устройств такой скорости вполне достаточно.
Igor Cesko первый кто сделал такой проект, он был написан на языке assembler.
После появился проект V-USB который написан на языке C с использованием ассемблерного кода Используя V-USB был сделан проект ИК приемника для компьютера.
USBtiny в свою очередь является произволным от ранней версии проекта V-USB. По возможности он уступает V-USB но зато гараздо проще теоретически и относительно легок в освоении.
Мы будем использовать проект V-USB
- хорошая документация под код C, в результата легче разбираться;
- у V-USB есть свободная пара идентификаторов это Vendor-ID и Product-ID;
- работает на многих AVR микроконтроллерах, необходима частота не менее 12 МГц, 2 кБ флеш памяти и 128 байт RAM;
- хорошая эмуляция USB 1.1 со скоростью LowSpeed устройств, только нет обработки ошибок связи и электрических характеристик.
- проект V-USB опубликован на GNU GPLV (General Public License Version 2) также есть платная версия.
В своих USB экспериментах, прошивку для микроконтроллера писал на языке C в среде AVR-Studio 4 + WinAVR, программа для ПК была разработана при помощи среды Borland C++ Builder как самый простенький и хустрый вариант. Поэтому все следующие примеры будут такими же. От правильного выбора инструментов зависит количество головной боли на последующих шагах. По поводу того что лучше C или Assembler можно говорить много. Как по мне то нужно владеть всеми инструментами, каким-то в большей степени каким-то в меньшей и использовать тот или другой в зависимости от конкретной поставленной задачи.
Считаю важным сказать пару слов про идентификаторы VID и PID которые представляют 16-битные числа. Эти числа использует операционная система и определяет какой подгрузить драйвер. Стоимость Vendor-ID на usb.org составляет 2000$. По поводу легальности использования VID/PID можно прочитать на станчике эмбеддера BSVi. V-SUB предоставлят свободную пару VID/PID. У вас наверное возникнет вопрос "Как подключить сразу несколько устройст с однинаковыми значениями VID/PID". Подключить несколько устройств с одниковами значениями вы можете, ничего страшного в этом нет так как каждое устройство USB имеет также свой VENDOR_NAME и DEVICE_NAME идентификаторы.
Давайте попробуем собрать свое первое USB HID устройство на микроконтроллере Atmega8 и научим его общаться с компьютером при помощи интерфейса USB. Может возникнуть вопрос "почему именно HID устройство". Ответ самый простой- потому что мы не хотим замарачиваться,выносить себе мозг и писать всякие там драйвера под Windows. А когда мы подключаетм HID устройство то операционная система сама выбирает и включает необходимый драйвер. Наша программа под компьютер не будет нуждаться в установки и настройки чего либо она сразу будет использовать готовый алгоритм для работы с HID устройством.
- Borland C++ Builder 6 -среда для разработки приложение под Windows на языке программирования C++;
- V-USB - программа под микроконтроллеры AVR реализующая работу low-speed USB 1.1,скачатьvusb.tar.gz;
- WinAVR - набор для разработчиков AVR, сдесь нам нужен будет GNU GCC компилятор, который автоматически интегрируется в студию;
- AVR Studio - отличная среда для разрабоки программ под микроконтроллеры AVR.
Схема 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 к макетной плате. Вообщем для сборки устройства нам потребуется сделать такой закуп:
Собранное готовое к работе USB устройство выглядит так:
Изменение программы для микроконтроллера
1) Открываем файл C:\OpenRoboFW\main.c, находим там область кода, обозначенную как настройка портов, надо установить все свободные порты на вывод командами DDR, меняем содержимое области на следующий код. Код для main.c:
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
USB устройство своими руками
Алгоритм работы
Перед тем как начать писать программу для МК, необходимо разобраться с базовыми принципами работы. HID устройство обменивается с хотом данными, данные поступают блоками фиксированного размера - или репортами. Их структура описана в дискрипторе HID, это дискриптор предоставляет хосту при подключении. Инизиализацию приема и передачу данных осуществляет хост прогамма на компьютере. В случае если хост хочет послать данные устройству то он сначала посылает команду HID_SET_REPORT, при этом V-USB вызывает функцию usbFunctionRead().
Линия данных D+ подключается к прерыванию INT0 так как это прерывание с наивысшим приоритетом. В процессе обмена данных по USB, микроконтроллер постоянно уходит на обработку INT0, на котором как раз и подключен V-USB. И только после этого управление будет передано основной программе. Если вам в вашем устройстве нужно еще и обрабатывать свои прерывания, то нужно выставить глобальный флаг прерывания используя команду sei(), для того чтобы смогло сработать INT0 с целью правильной работы V-USB.
Такая функция как usbPoll() сообщает хосту что подключенное устройство еще находится в живом состоянии и готово к работе, эту функцию нужно вызвать не реже чем 50 ms. Если не выполнять это условие то операционная система Windows напишет следующее " Подключено неизвестное устройство"
Интервал в 50ms - это USB timeout for accepting a Setup message- представляет собой специальную команду хоста в нашем примере HID_SET_REPORT и HID_GET_REPORT.
USB управление для своего устройства
Берем кабель USB и с одной стороны срезаем провода, видим 4 провода, которые нам нужны - красный, чёрный, жёлтый (бывает зеленым) и белый. Красный провод - это плюс питания +5V, чёрный провод - это минус питания. Этими проводами запитываем наше устройство. А другие 2 провода - жёлтый D+ и белый D- используются для обмена данными по USB.
Изменяем программы под наши нужды
Берём под контроль все порты, прибавляем свои функции. И так, теперь в C:\OpenRobo размещены исходные коды программы для компьютера, а в C:\OpenRoboFW исходные коды программы для микроконтроллера. Их можно изменять, но после каждого изменения надо их занова пересобирать (и перепрошивать микроконтроллер), делать это теперь вы умеете - см. выше пример - пересобрать обе программы можно 4-мя командами в cmd:
Схема подключения AVR к USB
Микроконтроллер ATmega8 подключается по классической 5-ти вольтовой схеме питания. Другие схемы можно посмотреть в архиве V-USB в каталоге cirtuits. В интерфейсе USB на линиях D+ и D- уровень сигнала составляет 3,3 В, а вся наша схема работает от напряжения в 5 В. Поэтому нужно согласовать уровни USB с нашей схемой, для этого устанавливаются стабилитроны D1 и D2, которые снижают сигнал с микроконтроллера на гасящих резисторах R3 и R4 до требуемого уровня в 3,3 В необходимого стандарту. Для определения версии протокола используется делитель напряжения на резисторах R1 и R2 который создает на линии D- уровень в 3,4 В в режиме холостого хода. Если использовать другой номинал резистора 1,5 кОм вместо указанного R1 2,2 кОм, или если не установить резистор R2 вовсе то вместо 3,4 В получится 3,7 В что приведет к открыванию стабилитрона D1 который уменьшит его до напряжения открывания 3,4 В - 3,5 В. В итоге у нас получится перекос по току на холостом ходу (стабилитрон D2 получится не нагружен совсем, а по D1 уже будет течь ток) и это будет отражаться на длинных проводах USB. Значения сопротивлений R3 и R4 опреляются по току, в данной USB AVR схеме они равны значению в 68 Ом.
Ассесмблерная часть V-USB написана с поддержкой следующего ряда частот: 12 МГц, 12,8 МГц,15 МГц,16 МГц,16.5 МГц, 18 МГц, 20 МГц. Другие частоты не поддерживаются. Данная частота вручную нигде не прописывается, она определяется в конфигурации проект AVR Studio. Proget>Configuration Options>General(вкладка)> Frequency (поле). Частота указывается в Герцах, если не правильно выставить частоту то при компиляции всплывет куча предупреждений и программа так и не будет скомпелированна. В студии сществует переменная F_CPU которую использует компилятор и она доступна всему проекту, V-USB также использует его. Для правильной работы кварца необходимо правильно выставить FUSE биты микроконтроллера.
12 Мгц - частоиспользуемая частота для V-USB, она является минимальной частотой при которой возможна эмуляция всех необходимых таймингов спецификации USB;
15 МГц - близка к 12 МГц, местами выставлены NOP-ы. Использование такой частоты делает код несколько меньше, это связано с тем что большая частота позволяет чаше использовать циклы;
16 МГц - эта частота была добавлена для пользователей Arduino и других плат которые имеют кварцевый резонатор на 16 МГц. Ассемблерная реализация данной частоты была написна с некоторыми тонкостями которые применяют циклы замедления. Это происходит потому что 16 МГц не возможно разделить нацело на USB low speed bit clock;
12.8 МГц и 16,5 МГц - данные частоты предназначены для тактирования от внутреннего RC генератора, точность составляет 1%.
18 МГц - такая частота наиболее близка к стандартам USB. Использование такой частоты позволяет производить проверку входящих пакетов CRC прямо на лету. Если пакеты имеют не верную контрольную сумму то они отклоняются.ТАкже существует опция проверки данных на целостность на уровне программы.
20 МГц - для тех кто любит большие скоростя. Так как 20 МГц не делится нацело на USB speed bit clock 1,5 Мгц. То применяются циклы замедления как и при частоте 16 МГц.
Подготавливаем программу МК
Также надо прошить fuse-биты настроек микроконтроллера, чтобы изменить его тактовую частоту на совместимую с USB стандартом. Встроенной подходящей частоты нет, поэтому применяется внешний источник тактовой частоты 12 МГц. Для прошивки настроек fuse-битов устройство с программатором надо доработать, подключить к микроконтроллеру внешний кварцевый генератор 12 МГц и 2 конденсатора 20 пФ по схеме как на устройстве USB, т.е. в случае с ATTiny2313A к линиям PA1 и PA0, и также соединить это всё с минусом питания, вообщем как на схеме USB устройства, смотрите на фото ниже как подключено. Это нужно для того, чтобы устройство продолжило работу после установки для него нового источника тактового сигнала, именно этот источник 12 МГц и подключаем. Не забудьте кроме программы также прошить fuse-биты.
Написание программы для компьютера
Программы писали в среде C++ Builder 6, интерфейс программы создавался в визуальном редакторе. В форму добавил 3 чекбокса и две кнопки.
После создания проекта нам необходимо скопировать туда специальную библиотеку для работы с устройствами HID из среды C++ Builder, называется она hidlibrary.h сделана как класс. Эта библиотека при помощи LoadLibrary-WINAPI функции, подгружает hid.dll, далее при помощи GetProcAddress - происходит вычисление адреса функции внутри hid.dll.
Предоставляется удобный и простой интерфейс для работы с HID. Полезая стать "общение с контроллером по USB". На настройку проекта и передачу данных ушло довольно много времени, пока не наткнулся на эту библиотеку.
В коде ничего сложного нет, есть функция connect() она необходима для подключения устройства, также обработчики событий для отправки данных и для принятия данных. Используя эти кнопочки можно теперь мигать светодиодами, включать и выключать нагрузки. Данные передаются при помощи структуры dataexchange_t, для микроконтроллера описана точно такая же структура.
Для того чтобы написанная нами прогрмма работа и на других компбютерах где не установлена программа Borland C++, нам нужно перейти настройки проекта и там выключить использование динамических библиотек. Для этого нужно выполнить следующее: Project>Options. Во вкладках Linker и Packages снять галочки напротив "Use dynamic RTL" и "Build with runtime packages.
Сначала немного общих слов о пакете (библиотеке) V-USB (старое название AVR USB) компании Objective Development, и библиотеке libusb.
V-USB - пакет, содержащий библиотеку подпрограмм (и примеры её использования), которая позволяет с помощью микроконтроллеров семейства AVR (производитель Atmel) делать низкоскоростные (low-speed, стандарт USB 1.0) USB-устройства. В этих устройствах протокол USB реализован программно - в firmware, прошиваемом в микроконтроллер. Кроме того, пакет V-USB содержит пример программ для хоста (компьютер, к которому подключаются USB-устройства), которые реализуют обмен данными с разработанными устройствами USB. Библиотека V-USB разработана компанией Objective Development и доступна как для свободного, так и для коммерческого использования (в зависимости от выбранной Вами лицензии).
Программы для хоста используют, в свою очередь, другую библиотеку - libusb [13]. Будем для простоты называть программы, прошиваемые в микроконтроллер термином firmware, а программы, которые работают на компьютере и общаются с разрабатываемыми нами устройствами USB - термином ПО хоста. Итак, процесс работы с пакетом AVR-USB (V-USB) и библиотекой libusb на платформе Windows по шагам.
1. Для просмотра и редактирования файлов Makefile и исходников нужно обзавестись хорошим текстовым редактором, поддерживающим окончания строк в стиле Unix (для тех, кто в танке - в Windows принято заканчивать строки в текстовых файлах как 0x0D, 0x0A, а в Unix более экономно - 0x0A). Я рекомендую скачать notepad2 - все просто и без затей, программа даже не требует установки, см. [14]. Там же описано, как прикрутить notepad2 заместо стандартного notepad.
2. Скачайте пакет библиотеки V-USB со странички [2], ищите там кнопку Download. Версия пакета была представлена под именем avrusb-YYYYMMDD.zip. Скачивайте самую последнюю версию. 24 сентября 2008 года я скачал avrusb-20080418.zip размером в 424594 байт.
3. Распакуйте в любое место папку, содержащуюся в архиве. В моем архиве была папка avrusb-20080418, я её распаковал в папку c:\avrprj.
4. В папке c:\avrprj\avrusb-20080513\examples\ находятся примеры firmware и ПО хоста. Всего там 5 папок, каждая из которых хранит отдельный проект:
custom-class - пример firmware и ПО хоста, показывающую работу с разработанным USB-устройством типа custom class.
hid-custom-rq - пример firmware и ПО хоста, показывающую работу с USB-устройством HID-класса путем отправки ему управляющих запросов (control request). Демонстрируется обмен данными в обоих направлениях.
hid-data - пример firmware и ПО хоста, также показывающую работу с устройством HID. Демонстрируется обмен данными в обоих направлениях.
hid-mouse - пример firmware, реализующего HID устройство типа мышь.
usbtool - пример ПО хоста - универсальная программа, работающая с USB-устройствами.
Для компиляции firmware и ПО хоста нужны специальные программные пакеты, установку и использование которых рассмотрим далее.
5. Начнем с firmware. Понадобится либо avr-gcc, либо IAR Embedded Workbench for AVR. В этой статье я рассматриваю установку и работу с avr-gcc. Пакет avr-gcc на платформе Windows входит в состав пакета WinAVR [6]. Я скачал WinAVR-20080610-install.exe размером 23433168 байт - обычный инсталлятор. После завершения закачки запустите его. Выбор языка установки ни на что не влияет, я выбрал русский. Инсталлятор предлагает выбрать папку для установки, я согласился на предлагаемую по умолчанию папку C:\WinAVR-20080610. Далее запросит установить снять галочки - выбрать состав устанавливаемых компонентов (Install Files, Add Directories to PATH (Recommended), Install Programmers Notepad) - я оставил все компоненты выбранными, как и предлагалось. После установки в переменную окружения Path пропишутся пути C:\WinAVR-20080610\bin и C:\WinAVR-20080610\utils\bin. Второй путь важен для работы утилиты make. Чтобы изменения для переменной Path вступили в силу для окружения пользователя, нужно перелогиниться (по крайней мере у меня так было под w2k), либо перезапустить экземпляр командного интерпретатора cmd (чтобы обновились для него переменные окружения).
6. Откомпилируем firmware из папки c:\avrprj\avrusb-20080418\examples\hid-custom-rq\firmware\. Запустим cmd, перейдем в эту папку (cd c:\avrprj\avrusb-20080418\examples\hid-custom-rq\firmware). Введем команду make, которая откроет файл Makefile в текущей папке и выполнит имеющиеся там команды. Makefile в текущей папке сделан так, что если ввести просто make без параметров, то выведется подсказка:
C:\avrprj\avrusb-20080418\examples\hid-custom-rq\firmware>make
This Makefile has no default rule. Use one of the following:
make hex . to build main.hex
make program . to flash fuses and firmware
make fuse . to flash the fuses
make flash . to flash the firmware (use this on metaboard)
make clean . to delete objects and hex file
Для компиляции firmware нужно ввести make hex, что и сделаем:
c:\avrprj\avrusb-20080418\examples\hid-custom-rq\firmware>make hex
cp -r ../../../usbdrv .
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -x assembler-with-cpp -c usbdrv/usbdrvasm.s -o usbdrv/usbdrvasm.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -c usbdrv/oddebug.c -o usbdrv/oddebug.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -c main.c -o main.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -o main.elf usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o
rm -f main.hex main.eep.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size main.hex
text data bss dec hex filename
0 1694 0 1694 69e main.hex
В результате в текущей папке получим файл main.hex, который и является прошивкой для микроконтроллера. Если у Вас подключен программатор avrdude (Makefile настроен на него), то для программирования кристалла просто введите make program.
Я здесь не рассматриваю, каким образом выбирается тактовая частота для микроконтроллера или его тип - это делается путем редактирования содержимого Makefile. Все хорошо расписано как в комментариях Makefile, исходного кода, а также в файлах readme.txt - на английском языке. Переведенный на русский язык пакет V-USB скачайте по ссылке [15].
7. Теперь займемся ПО хоста. Для его компиляции нам понадобится gcc.exe, который есть в составе пакета MinGW [7]. Пакет MinGW - это набор портированных с Unix утилит командной строки. Я скачал MinGW-5.1.4.exe, файл размером в 140095 байт. Это хитрый инсталлятор, который при установке скачивает из интернета все необходимое. При запуске он запросит выбрать "Download and install" или "Download only", выбираем "Download and install". Далее спросит, какой пакет устанавливать - Previous, Current или Candidate. Выбираем то, что предлагается по умолчанию - Current. Далее запросят выбрать устанавливаемые компоненты. По умолчанию предлагается только "MinGW base tools", но я еще поставил галочку на всякий случай на "g++ compiler". Утилиту Make выбирать не стал, поскольку она у меня уже работает (поставилась из пакета WinAVR). Далее предложат выбрать папку для установки - C:\MinGW, соглашаемся. Далее предложат выбрать место для ярлыков, потом начнется процесс загрузки. Грузилось у меня долго, около часа, на скорости примерно 22 кбайт/сек (если верить информации инсталлятора). Грузится все в текущую папку, откуда запускали MinGW-5.1.4.exe. После установки gcc.exe оказывается в папке c:\MinGW\bin\, но в переменной Path этот путь не прописан, надо добавить вручную, см. скриншоты.
8. Теперь надо установить библиотеку libusb. См. ссылку на закачку релизов [13]. Найдите там ссылку для скачки наподобие libusb-win32-filter-bin-0.1.12.1.exe (цифры версии могут быть другие, выбирайте самую свежую версию). Это установщик бинарников библиотеки (бинарники позволяют работать любым приложениям Windows, использующим LibUSB), а также мастер-инсталлятор драйвера фильтра). Ставим, установщик предлагает по умолчанию в папку "C:\Program Files\LibUSB-Win32", соглашаемся. После установки, создания ярлычков инсталлятор предложит запустить тест-программу ("C:\Program Files\LibUSB-Win32\bin\testlibusb-win.exe"), которая может показать все USB устройства, с которыми можно работать через библиотеку libusb (в принципе, это все устройства USB, которые распознаны системой и имеют установленный драйвер). Программа очень полезная, может пригодиться в дальнейшем для просмотра информации об USB-устройствах. Она показывает все USB-устройства, которые корректно определены в Windows и имеют драйвера (на скриншоте ниже видны два USB-устройства - флешка Kingston DataTraveler 2.0 и debugWIRE эмулятор ATMEL JTAGICE mkII).
Опишу установку драйверов поподробнее, потому что иногда у пользователей библиотеки бывают с этим проблемы, особенно когда они подключают новое USB-устройство к компьютеру, с другими VID и PID (даже если на нем уже ранее была установлена библиотека libusb). Проблема заключается в том, что новому устройству USB (с новыми VID и PID) требуется новый так называемый драйвер фильтра (filter driver). В процессе установки libusb-win32-devel-filter-X.X.X.X как раз и будет предложено установить драйвер фильтра на все обнаруженные USB устройства, а Ваша задача выбрать именно то устройство, которое нужно, и установить драйвер фильтра именно на него. Итак, скачиваем libusb-win32-devel-filter, например libusb-win32-devel-filter-1.2.2.0.exe, и запускаем. На запрос подтверждения запуска (если нельзя проверить издателя) щелкните на кнопку "Выполнить":
На приветствии визарда установки библиотеки LibUSB-Win32 тупо жмем Next:
На запрос подтверждения принятия лицензии выбираем как обычно "I accept the agreement" и жмем Next:
На окошке "важной информации" тупо жмем Next:
Дальше предложат поменять путь и название папки, в которую будет установлена библиотека. Ничего менять не надо, тупо жмем Next:
Дальше предложат поменять путь и название папки, в которой будут лежать ярлычки. Ничего менять не надо, тупо жмем Next:
На этом установка библиотеки LibUSB завершена. Если оставить галочку "Launch filter installer wizard" и нажать кнопку Finish, то запустится мастер установки драйвера фильтра на найденные USB-устройства. Это важный шаг, который я решил вынести в отдельный раздел 8a.
Теперь должны нормально компилироваться примеры ПО хоста командной строки, предназначенные для GCC. Если компиляция идет с ошибками, то возможно, что у Вас в папке C:\Program Files\LibUSB-Win32\ не хватает папок include и lib. Можете скачать установленный каталог LibUSB-Win32 полностью по ссылке [9].
После запуска фильтра появится окно, где выбирается необходимое действие - установить драйвер фильтра на USB-устройство, удалить ранее установленный на USB-устройство драйвер фильтра, удалить все установленные драйвера фильтра со всех USB-устройств. В случае проблем с доступом к USB-устройству нам нужно установить драйвер фильтра, поэтому выбираем 1-й пункт, "Install a device filter":
Далее появится окошко, в котором визард отобразит все найденные USB-устройства, на которые можно установить драйвер фильтра библиотеки libusb. Нужно по значениям VID и PID найти в списке наше проблемное USB-устройство, выбрать его и нажать кнопку Install.
Далее произойдет быстрая процедура установки драйвера фильтра:
далее, нужно изменить пути до файлов библиотеки. Было так:
USBFLAGS = -I/usr/local/include
USBLIBS = -L/usr/local/lib -lusb
теперь должно быть так (не спрашивайте меня, почему. Это мне стоило нескольких часов "плясок с бубном"):
Все, теперь можно компилировать. Как обычно, запускаем cmd и переходим в нашу папку (cd c:\avrprj\avrusb-20080418\examples\hid-custom-rq\commandline). Вводим make, без параметров:
c:\avrprj\avrusb-20080418\examples\hid-custom-rq\commandline>make
gcc -I"c:/Program Files/LibUSB-Win32/include" -O -g -Wall -c opendevice.c
gcc -I"c:/Program Files/LibUSB-Win32/include" -O -g -Wall -c set-led.c
gcc -o set-led opendevice.o set-led.o -L"c:/Program Files/LibUSB-Win32/lib/gcc" -lusb
Процесс компиляции закончен, в текущей папке появятся объектные файлы (расширение *.o) и исполняемый файл set-led.exe - этот исполняемый файл и есть та программа, которая работает с разрабатываемым USB-устройством.
10. Теперь нужно собрать USB устройство по одной из схем в папке c:\avrprj\avrusb-20080418\circuits\. Можно купить готовую плату AVR-USB-MEGA16 или metaboard, см. [1].
11. Теперь нужно прошить программу в микроконтроллер (прошивку c:\avrprj\avrusb-20080418\examples\hid-custom-rq\firmware\main.hex). Как это делать, рассказывать не буду, в Интернете полно информации по теме. Ищите по ключевым словам ISP, avrdude, PonyProg, ITAJICE mkII.
а потом еще одно, USB Human Interface Device:
Если посмотреть в Диспетчере Устройств, то в папке Human Interface Devices появится 2 новых устройства:
Если посмотреть свойства USB Human Interface Device, то мы увидим имя LEDCtlHID, которое было задано в макросе USB_CFG_DEVICE_NAME (файл c:\avrprj\avrusb-20080513\examples\hid-custom-rq\firmware\usbconfig.h):
Никакие драйвера нам не потребовались - наше устройство USB принадлежит к классу HID!
13. Теперь попробуем поуправлять устройством. Сначала запустим set-led.exe без параметров, выведется подсказка:
c:\avrprj\avrusb-20080418\examples\hid-custom-rq\commandline>set-led.exe
usage:
set-led.exe on . turn on LED
set-led.exe off . turn off LED
set-led.exe status . ask current status of LED
Теперь мы можем командой "set-led.exe on" зажечь светодиод на макетной плате, а командой "set-led.exe off" его погасить. Наше устройство работает!
На этом все! Остается только изучать пробовать примеры один за другим (примеры описаны на шаге 4), изучать их код, а еще лучше на основе примера сделать собственное USB-устройство и программу для него.
[Устранение проблем]
3. Часто встречающаяся проблема у начинающих работать с библиотекой V-USB - использование прерываний. Желательно таких ситуаций избегать, оставлять одно прерывание INT0, которое работает для V-USB, и использовать код только основной программы. Если все же нужно организовать еще один другой обработчик прерывания, то это надо делать максимально осторожно. В этом случае наилучшим выходом будет написание обработчика на ассемблере.
4. Новички часто пытаются неумело подсунуть примеры из пакета V-USB (avr-usb-russian.rar [15]) в AVR Studio, и у них ничего не получается - проект не компилируется, вылезают ошибки. На самом деле все примеры V-USB предназначены для компилирования из командной строки командами make.
5. Забывают также перед сборкой проекта (make, make hex) делать очистку - make clean. Команда make clean удаляет все объектные файлы, что гарантирует корректную компиляцию во всех случаях - и при изменении настроек makefile, и при изменении исходников.
6. В файле makefile лежат важные настройки проекта firmware - тип микроконтроллера (DEVICE), его тактовая частота (F_CPU). Иногда частота кварца на микроконтроллере не соответствует переменной F_CPU, и USB-устройство из-за этого не работает. Необходимо также помнить, что допустима частота кварца из ряда 12, 15, 16, 16.5, 20 МГц, другие кварцы работать не будут.
7. Важны также настройки в файле usbconfig.h - в нем определены все параметры USB-устройства, например указаны используемые ножки для сигналов D+ и D-. Назначение каждой опции подробно задокументировано. Файл usbconfig.h является общим для firmware (папка firmware) и ПО хоста (папка commandline).
8. Решение многих проблем описано в статье FAQ [10].
9. Трудности с поиском и закачкой программного обеспечения (MinGW, WinAVR, LibUSB, V-USB)? См. [16].
[Ссылки]
В статье сделана попытка предоставить пошаговую инструкцию — как соединить самодельное устройство USB HID на микроконтроллере AVR и компьютер с операционной системой Windows 7 x64, чтобы обмениваться данными и управлять портами микроконтроллера. Пример приложения управляет через USB ножкой порта микроконтроллера (к ней подключен индикационный светодиод). Есть возможность также прочитать состояние состояние светодиода — потушен он или горит. Топик предназначен для новичков, поэтому большая просьба к знатокам программирования — приберегите тухлые яйца и гнилые помидоры иронические комментарии для более удобного случая.
Используемое программное обеспечение
Используемое железо
Благодаря библиотеке V-USB для создания устройства USB HID подойдет любой микроконтроллер AVR. Если Вы дружите с паяльником, то даже можете собрать подключение к USB самостоятельно по одной из опубликованных схем. Такая схема (взята из пакета V-USB [1]) в качестве примера приведена на картинке.
Чтобы экономить время и усилия, лучше использовать готовую макетную плату. Особенно удобно, если в плату будет записан USB-загрузчик (bootloader), тогда не понадобится покупать программатор для перепрошивки платы. Я использовал макетную плату AVR-USB-MEGA16 с микроконтроллером ATmega32A, в ней загрузчик есть (USBasploader, эмулирующий поведение программатора USBasp). Вот так платка выглядит в натуральную величину:
Создание firmware микроконтроллера с помощью Atmel Studio 6 и библиотеки V-USB
Сделайте новый проект в Atmel Studio 6 (далее просто AS6). Когда AS6 предложит выбрать микроконтроллер, выберите Atmega32 без буквы A, не Atmega32A (хотя на плате стоит Atmega32A) — это важно, так как тулчейн WinAVR не видит разницы, он знает только Atmega32. Эти микроконтроллеры по внутреннему устройству идентичны, так что для нас разницы нет, а для AS6 есть.
Теперь нужно правильно настроить компилятор. В верхнем меню AS6 нажите Tools, далее Options.. и появится вот такое окно:
Слева в списке выберите Toolchain. Справа появится список Flavours. Этим словечком Atmel закодировала возможные варианты используемого инструментария (тулчейны).
Для добавления в список Flavours тулчейна WinAVR нажмите кнопку Add Flavour, появится следующее окно:
В верхней строчке этого окна введите имя компилятора WinAVR (произвольное), а в нижней строке введите полный путь, куда установлен сам компилятор тулчейна (с указанием папки \bin) и нажмите кнопку Add. В списке Flavours появится добавленный компилятор, как показано на скриншоте.
Выделите мышкой наш новый добавленный компилятор WinAVR и нажмите кнопку Set As Default (сделать его тулченом по умолчанию), и нажмите OK. После этой процедуры наша AS6 будет использовать компилятор WinAVR.
Пора настроить свойства нашего проекта, для этого курсором в Solution Explorer левым щелчком выберите имя проекта и нажмите Alt+F7 (меню Project -> Properties), появится окно с настройками:
- В разделе AVR/GNU C Compiler -> Symbols добавляем в поле -D строчку F_CPU=12000000UL — это соответствует частоте микроконтроллера 12 МГц (такой кварц установлен на моей макетной плате AVR-USB-MEGA16).
- В разделе AVR/GNU Assemler -> General в поле Assembler flag надо добавить -DF_CPU=12000000UL.
- В разделе AVR/GNU C Compiler -> Optimization в поле Optimization Level должно стоять Optimize for size (-Os).
В выпадающем списке Toolchain Flavour выберите добавленный компилятор WinAVR, чтобы при компилировании проекта AS6 использовала его. На этом настрока AS6 закончена.
Далее необходимо в созданный проект добавить файлы исходного кода проекта [6] — см. папку firmware\VUSB, файлы VUSB.c, usbdrv.c, usbdrvasm.S и oddebug.c. Проект ASS6 создан на основе одного из примеров библиотеки V-USB: hid-custom-rq, который изначально компилировался с помощью утилиты make из командной строки. На основе библиотеки V-USB можно найти много других примеров кода — в основном это устройства USB HID (мыши, клавиатуры, устройства ввода и вывода), но есть также и устройства USB CDC (виртуальный COM-порт). Если Вам лень самому создавать проект, просто откройте в AS6 файл проекта VUSB.atsln, в нем уже сделаны все необходимые настройки и добавлены все нужные файлы.
Если у Вас используется другая макетная плата, то нужно правильно настроить файл usbconfig.h. Это конфигурационный файл библиотеки V-USB, в нем задаются многие настройки и параметры (VID, PID, ножки микроконтроллера, значения для дескрипторов и другие настройки). Подробное описание всех настроек дано в комментриях этого файла. Основное внимание следует уделить назначению выводов микроконтроллера, которые используются под сигналы USD D+ и D- (макроопределения USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT, USB_CFG_DPLUS_BIT), к этим ножкам предъявляются особые требования. Конфигурационный файл usbconfig.h из архива [6] предназначен под разводку ножек макетной платы AVR-USB-MEGA16, и он гарантированно работает. Моргать программа будет светодиодом, который уже имеется на макетной плате и подключен к ножке 0 порта B.
Создание программы для компьютера (ПО хоста)
Наша программа должна посылать через подключение USB пакеты, которые будут управлять микроконтроллером.
появится ещё одно окно
здесь нужно найти путь на диске, где находится библиотека LinUsbDotNet.dll (по умолчанию она устанавливается папку C:\Program Files\LibUsbDotNet, но лучше сделать копию файла DLL в рабочий каталог проекта. После подключения библиотеки её нужно объявить в проекте, для этого добавьте в главный модуль программы (файл Form1.cs) строки:
Перейдите к визуальному редактору формы, и приведите её приблизительно к такому виду (добавьте 3 кнопки Button и 3 текстовых метки Label):
Сделайте обработчик события загрузки формы. Он нужен для того, чтобы при старте программы происходила инициализации экземпляра класса LibUsbDotNet, через который осуществляется обмен с устройством USB. Перед началом обмена необходимо открыть доступ именно к нашему устройству, потому что к компьютеру может быть подключено несклько устройств USB HID, и необходимо уметь обращаться к каждому по отдельности. Для целей идентификации USB-устройств служат специальные идентификаторы, которые имеют абсолютно все устройства USB, это VID и PID.
VID это идентификатор производителя (Vendor ID), а PID — идентификатор устройства (Product ID). Наше USB-устройство имеет VID: 0x16C0, PID: 0x05DF, эти значение указаны в конфигурационном файле usbconfig.h (об этом файле мы уже упоминали) проекта микроконтроллера AS6. Чтобы ПО хоста обратилась к именно к нашему USB-устройству, нужно инициализировать объект MyUsbFinder такими же параметрами VID: 0x16c0, PID: 0x05df, как указаны в файле usbconfig.h. Для этого в область определения глобальных переменных класса Form1 добавьте следующий код:
После того как мы определились с каким USB-устройством будем работать, можно к нему подключаться, и это удобно сделать в момент старта программы (открытия окна формы). Для этого выберите основную форму программы, и в редакторе свойств создайте обработчик события загрузки Form1_Load. В теле обработчика введите следующий код:
Сделайте обработчик события клика на кнопке button1 («Вкл»), для этого сделайте в визуальном редакторе на кнопке двойной щелчок, и добавьте в тело обработчика события код:
Для обработчика кнопки «Выкл» добавьте код:
Код для обработки кнопки «Чтение»:
Обработчик события закрытия формы (завершение работы программы) гасит светодиод, если он горит:
Как пакеты USB декодируются в firmware микроконтроллера
Прием и обработка данных на стороне микроконтроллера осуществляется в функции usbFunctionSetup (находится в главном модуле VUSB.c проекта firmware AS6). Вот эта функция:
Наше устройство USB HID простейшее, и реагирует оно только на управляющие передачи (control transfer), которые проходят через конечную точку 0 (default control endpoint). По типу запроса (поле bRequest) декодируется направление передачи данных. Если CUSTOM_RQ_SET_STATUS, то это данные, предназначаемые для микроконтроллера. Данные декодируются и микроконтроллер выполняет заложенную там команду. В этом случае в самом первом по порядку принятом байте данных закодировано состояние светодиода — если там в младшем бите единичка, то светодиод включается, а если нолик, то гаснет. Если же в поле bRequest принято значение CUSTOM_RQ_GET_STATUS, то в ответ заполняется буфер текущим состоянием светодиода, и данные буфера отправляются обратно хосту. Все очень просто, и при желании поведение кода можно легко переделать под свои нужды.
Видео, как это работает:
Буду рад ответить в комментариях на вопросы и конструктивные замечания.
Ссылки
В дальнейшем по возможности планирую сделать тоже самое, но на микроконтроллере с аппаратным интерфейсом USB.
Создание проекта в среде AVR Studio
Создаем проект AVR GCC, назовем его например Hid_example_firmware. И начнем писать нашу прошивку.
- usbdrv.c;
- oddebug.c;
- usbdrvasm.s.
Для того чтобы добавить файла нужно выбрать в контекстном меню "Add existing Source File(s)"
Далее нам необходимо корректно настроить файл usbconfig.h и также его поместить в папку с проектом. Inline комментарии usbconfig.h была переведена на русский язык. Код приведен ниже.
Меняем настройки программатором
При этом установите такие биты конфигурации:
Для 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. Если этого не произошло, то ищите проблему и ошибки при сборке устройства или при установке программ, еще раз внимательно все сверьте и проверьте, что ничего не пропущено и что все контакты соединены или запаяны как надо. Бывает проблема тут, если пайка была совершена с неконтактами, с не правильными контактами или не всеми контактами, а также что элементы схемы были повреждены высокой температурой паяльника, и устройство поэтому не работает. Важно собирать устройство именно на макетной плате первый раз.
Как происходит процесс передачи данных
С целью передачи данных сделаем структуру, ее использование сделает код удобнее и гибче к переделкам чем простое использование массива. Если нужен массив то в его можно добавить и использовать внутри структуры. В нашем дескрипторе есть один вид репорта который имеет размер 8 бит - REPORT_SIZE, его количество равно размеру передаваемой структуры - REPORT_COUNT. Получается что данные передаются порциями по 8 бит. По умолчанию V-USB поддерживает передачу и прием размером по 254 байта. Если нам нужен размер по больше тогла нам нужено в файле usbconfig.h выставитьUSB_CFG_LONG_TRANSFERS в значение 1, только в этом случае увеличится размер самого драйвера.
- usbFunctionRead(uncachar *data, unchar len);
- usbFinctionWrite(uncachar *data, unchar len).
Для простоты структура данных заполняется внтури этих функций, но так делать не обязательно, заполнить их можно в других участках кода, в этом случае их необходимо объявить как volatile.
Такой парамет как *data представляет собой указатель на буфер V-USB где происхоид чтение и запись данных которые имеют размер len. Такой буффер данных имеет максимальный размер в 1 байт типа uchar и данное значение равняется размеру нашего репорта. А размер нашей структуры имее рамер больше чем 1 байт, именно по этой причине процесс передачи данных происходит по частям. Для этого существуют переменные currentAddress и bytesRemaining в которых хранится информация про текущую передачу.
- pdata - это структура;
- &pdata - адрес начала нашей структуры;
- (uchar*)&pdata - это явное приведение типа;
- uchar* - указатель на данные типа uchar.
Получается что мы объявили указатель с именем uchar *buffer на определенное место в памяти где находится(хранится) наша структура. Передача осуществляется кусками uchar.
Программа на компьютер для USB связи
Для начала сделаем простую консольную программу, потом будем делать программу с окнами.
3) Скачиваем программу MinGW, которая нужна для сборки программы из исходника. Устанавливаем. Сайт разработчика MinGW. После установки зайдите в Панель управления, Система, Дополнительные параметры системы, Дополнительно (вкладка), Переменные среды (кнопка), Системные переменные (список), Переменная Path (найти в списке, выделить, нажать кнопку Изменить). Дописываем в поле Значение переменной в конце ;c:\MinGW\bin\ и нажимаем ОК, надеюсь вы установили MinGW в C:\MinGW, иначе надо путь другой прописать.
Настраиваем системную переменную Path для MinGW
USB HID report description
Объясняя более понятными словами то это константы собранные в массив и зашитые в Flash память устройства, которые необходимы и описывают структуру пакетов данных (HID репортов). В нем содержится инфорамация о количестве пакетов которое поддерживает устройство. Каждый бит и каждый байт в пакете имеет свое назначение. После того как устройство подключается к компьютеру, дескриптор сообщает все свои параметры, в свое очередь операционная система компьютера поймет как следует общаться с таким устройством, к примеру будет знать какие биты ответсвенны за нажатие тех или иных кнопок джостика.
У нас будет "HID совместимое устройство" которое будет передавать разные данные определенного размера (это не мышь и не дждостик). В нашем примере дескриптор предаставляет собой некоторого рода набор произвольных чисел с комментариями. Полезная информация про дескрипторуUSnooBie's USB HID Report Descriptor TutorialиHID Related Specifications.
Меняя дескриптор можно представиться конкретным HID устройством, к примеру клавиатурой или чем либо еще. Интересные примеры на эту тему:Маленькая USB пакостьиThe Haunted USB Cable!. Много интресных примеров находится на сайте V-USB.
Подготовка программы ПК
Читайте также: