Форма входа

Поиск



Счетчик посетителей

Рейтинг@Mail.ru

Разработано jtemplate модули Joomla

Программная реализация шины USB

В данной статье рассматривается один из вариантов программной реализации универсальной последовательной шины (USB).

Отличительные особенности:

  • Программная реализация протокола USB.
  • Поддержка низкоскоростного режима USB-связи (1.5Мбит/сек) в соответствии с требованиями USB2.0
  • Программная реализация может работать в составе AVR-микроконтроллеров с малым объемом памяти, от 2 кбайт и выше
  • Требуется только несколько внешних компонентов
    • - Один резистор для детекции низкой скорости USB
    • - Делитель/стабилизатор напряжения с фильтрацией
  • Реализованные функции:
    • - Непосредственное управление линией ввода-вывода
    • - Преобразователь USB - RS232
    • - Вспомогательный регистр ЭСППЗУ
  • Возможность простой реализации таких функций, как:
    • - Преобразователь USB - TWI
    • - Аналогово-цифровое, цифро-аналоговое преобразование с управлением через USB
  • Выборочный идентификационный код производителя (виден на стороне ПК)
  • Исходный код и документация программы для ПК
    • - USB-драйверы для MS Windows
    • - DLL-библиотека функций
    • - Демонстрационная программа на Delphi
  • Примеры, которые демонстрируют, как организовать связь с микроконтроллером посредством DLL-библиотек (Delphi, C++, Visual Basic)

Введение:

Универсальная последовательная шина (USB) стала чрезвычайно популярной за счет предоставления ряда удобств конечным пользователям, например, функция "Plug and Play", которая позволяет идентифицировать подключенное устройство без необходимости рестарта компьютера. Однако для разработчиков интегрировать USB-интерфейс в свои проекты оказалось более сложным по сравнению, например, с интерфейсом RS232. Кроме этого, на стороне ПК также должен быть предусмотрен специальный драйвер устройства. Как следствие, интерфейс RS232 остается очень популярным среди производителей конечных систем. Данный интерфейс хорошо изучен и в достаточной мере поддерживается операционной системой. Однако, как правило, в современных ПК физический порт RS232 не устанавливается и замещается на порты USB.

Реализовать интерфейс USB во внешнем устройстве можно двумя способами:

  1. С помощью микроконтроллера, у которого интерфейс USB реализован аппаратно. В этом случае необходимо знать, как работает USB и в соответствии с этим написать программу для микроконтроллера. Кроме того, если операционная система не поддерживает стандартные классы USB, то необходимо написать драйвер для компьютера. Основной недостаток данного способа - ограниченная доступность таких микроконтроллеров и их более высокая стоимость по сравнению с обычными микроконтроллерами, которые используются для связи через "RS232".
  2. Использование универсального преобразователя интерфейсов: USB и любого другого. В качестве другого интерфейса обычно используется RS232, 8-разрядная шина данных или шина TWI. В этом случае разработка специальной прошивки не потребуется, нет надобности знать, как работает USB и нет необходимости написания драйвера, т.к. производитель преобразователя предлагает свой драйвер. Недостаток - более высокая стоимость завершенной системы, а также повышенные габариты готового изделия. Решение, рассматриваемое в данном документе, основывается на использовании недорого микроконтроллера и программной эмуляции USB-протокола в микроконтроллере. Основная проблема такого подхода заключается в сложности достижения высокой скорости. Шина USB достаточно быстродействующая: режим низкой скорости - 1.5 Мбит/сек, режим полной скорости - 12 Мбит/сек, режим высокой скорости - 480 Мбит/сек. Микроконтроллеры AVR полностью отвечают требованиям для низкоскоростного режима USB. Данное решение не рекомендуется использовать для более высоких скоростей USB.

1. Принцип действия

Детальная информация по физической USB-связи может быть найдена на сайте www.usb.org. Однако для начинающих данная документация может оказаться очень сложной. Более доступно информация по USB-связи изложена в документе "USB in a Nutshell. Making Sense of the USB Standard" ("О USB в двух словах. Пойми смысл стандарта USB"), написанного Крэйгом Пикоком [2].

В данных "Рекомендациях…" объяснения ограничиваются описанием программы устройства. Физический интерфейс USB состоит из четырех проводников: 2 для питания внешнего устройства (VCC и GND) и 2 сигнальных проводника (DATA+ и DATA-). Через проводники питания передается постоянное напряжение приблизительно 5В с нагрузочной способностью максимум 500 мА. Микроконтроллер AVR питается через выводы Vcc и GND. Сигнальные проводники называются DATA+ и DATA- и управляют связью между главным (компьютер) и устройством. Сигналы в этих проводниках являются двунаправленными. Уровни напряжения - дифференциальные: когда DATA+ имеет высокий уровень, тогда DATA- находится на низком уровне. Однако, имеются некоторые случаи, когда DATA+ и DATA- имеют один и тот же уровень, например, при EOP (конец пакета).

Таким образом, программа, отвечающая за реализацию протокола USB, должна контролировать данные сигналы или управлять ими.

В соответствии со стандартом USB высокий уровень на сигнальных проводниках должен составлять 3,0…3,6В, при этом, напряжение питания Vcc шины USB, поступающее от главного (компьютера) составляет 4.4…5.25В. Таким образом, если микроконтроллер запитывается непосредственно от шины USB, то линии данных должны пройти через каскад преобразования уровней для компенсации уровней дифференциального напряжения. Другим решением может быть использование стабилизатора напряжения, который понизит напряжение Vcc до уровня 3.3В, при этом, микроконтроллер будет работать с этим пониженным напряжением и, соответственно, генерировать пониженные уровни напряжений.

Рис. 1. Осциллограммы сигналов низко скоростного драйвера

 

Рис. 2. Уровни напряжений при передаче пакетов

 

 

Рис. 3. Подключения кабеля и резисторов к низко скоростному устройству

 

Рис. 4. Образцовая синхронизация

 

Принцип детекции подключения и отключения USB-устройства основан на контроле сопротивления линии USB. У низкоскоростных USB-устройств необходим подтягивающий резистор между сигналом DATA- и Vcc. У полноскоростных устройств данный резистор подключается к DATA+.

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

После определения нового устройства главный начинает связь в соответствии с физическим протоколом USB. Протокол USB, в отличие от УАПП, основан на синхронной передаче данных. Синхронизация передатчика и приемника необходима для осуществления связи. Синхронизация выполняется путем передачи небольшого заголовка "образцовая синхронизация", который предшествует передаче данных. Данный заголовок представляет собой прямоугольные импульсы (101010), за ними передаются два 0, а затем данные.

Рис. 5. Кодирование данных в коде NRZI

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

Прием данных должен удовлетворять требованию возможности засинхронизировать приемник и передатчик в любой момент времени. Таким образом, не разрешается передавать непрерывный поток нулей или единиц по линиям данных. Протокол USB гарантирует синхронизацию за счет заполнения битами. Это означает, что, после 6 непрерывных единиц или нулей на линиях данных, вставляется одно одиночное изменение (один бит). Сигналы по линиям USB передаются в коде NRZI. В коде NRZI каждый '0' представляется путем сдвига текущего уровня сигнала, а каждая '1' путем удержания текущего уровня. На уровне битового заполнения это означает, что каждый нулевой бит вставляется в поток логических данных после 6 непрерывных логических 1.

Рис. 6. Заполнение бит

 

Рис. 7. Временная диаграмма сигнала EOP

 

Рис. 8. Подключение шины USB к микроконтроллеру ATtiny2313 в качестве преобразователя USB - RS232 с 32 байтным буфером FIFO, 8-разрядным управлением вводом-выводом и 128 байтным ЭСППЗУ

 

Уведомление об окончании передачи данных выполняется с помощью передачи сигнала "конец пакета" (EOP). EOP передается путем установки низких уровней на обеих линиях данных DATA+ и DATA-. EOP передается непродолжительное время (минимум два периода скорости данных). После этого, выполняется следующая транзакция.

Данные, которые передаются между образцовой синхронизацией и EOP, закодированы в коде NRZI. Поток данных состоит из пакетов, пакет в свою очередь состоит из нескольких полей: поле синхронизации (образцовая синхронизация), идентификатор пакета (PacketID, PID), поле адреса (ADDR), поле конечной точки (ENDP), данные и поле циклического избыточностного контроля (CRC). Использование данных пакетов при передаче различных типов пакетов данных объясняется в [2]. USB подразумевает четыре типа передачи: передача управления, передача прерывания, изохронная передача и передача потока. Каждый из этих типов передач специфичен для различных требований устройства, а их описание представлено в [2].

В данной реализации рассматривается тип передачи управления. Данный режим, как правило, используется для управления настройками устройства, однако, может также использоваться для передачи общего назначения. Режим передачи управления должен присутствовать у каждого USB-устройства, т.к. он используется для конфигурации при подключении устройства, когда необходимо получить информацию об устройстве, установленный адрес устройства и пр. Описание передачи управления и его содержимого можно найти в [2] и [1]. Каждая передача управления состоит из нескольких стадий: стадия установки, стадия данных и стадия статуса.

Данные по шине USB передаются пакетами, по несколько байт в каждом. Размер пакета определяется каждым устройством, но его предельный размер ограничен. Для низкоскоростных устройств максимальный размер пакета равен 8 байтам. Данный 8-байтный пакет вместе с начальным и конечным полем должны быть приняты в буфер устройства за одну USB-передачу. В аппаратно-реализованных USB-приемниках различные части передачи автоматически дешифрируются и Устройство уведомляется, когда все сообщение назначено отдельному устройству. При программной реализации USB-сообщение дешифрируется программно после приема в буфер всего сообщения. Вследствие этого возникают требования и ограничения: устройство должно иметь буфер для хранения всего USB-сообщения, иметь другой буфер для USB-передачи (подготовка данных для передачи), а также выполнять администрирование с дешифрованием и проверкой сообщений. Кроме того, необходима программа для выполнения быстрого и точного синхронного приема с физических линий в буфер и передачи из буфера на линии. Данные возможности ограничиваются быстродействием микроконтроллера и размером памяти программ/данных, т.к. программа должна быть тщательно оптимизирована. В некоторых случаях вычислительные возможности микроконтроллера очень близки к минимальным требованиям, поэтому, вся программа написана на Ассемблере. {mospagebreak}

2. Аппаратная реализация

На рисунках 8 и 9 показана схема подключения микроконтроллера к шине USB. Данные схемы имеют специфичное назначение: преобразователь USB - RS232. На них также реализованы специфичные функции, такие как непосредственное управление выводом и чтение/запись ЭСППЗУ.

Рис. 9. Подключение шины USB с микроконтроллером ATmega8/48/88/168 в качестве преобразователя USB - RS232 с 800 байтным FIFO, управлением вводом-выводом и 512 байтным ЭСППЗУ

 

Рис. 10. Блок-схема процедуры приема

Линии данных USB, DATA- и DATA+, подключены к выводам PB0 и PB1 микроконтроллера AVR. Данное подключение нельзя изменить, т.к. в программе используются уникальности ядра AVR для быстрого приема сигнала: битовый сигнал захватывается из линий данных и младший разряд (PB0) сдвигается вправо в перенос, а затем в приемный регистр, который накапливает биты, принятых с линий данных. PB1 используется в качестве входного сигнала, поскольку у 8-выводного AT90S2323 данный ввод может использоваться в качестве входа внешнего прерывания без каких-либо внешних подключений к INT0. В других микроконтроллерах AVR необходимо внешнее подключение DATA+ к выводу INT0, что гарантирует неизменность программы при переходе между микроконтроллерами.

Для соответствующего подключения USB-устройства и сигнализации микроконтроллер AVR, работающий как низкоскоростное USB- устройство, должен иметь подтягивающий резистор 1,5 кОм на линии DATA-.

Напряжение Vcc, поступающее от USB-порта компьютера, может варьироваться в диапазоне 4.4…5.25В. Перед его подачей к микроконтроллеру и подтягивающему резистору сопротивлением 1,5 кОм данное напряжение стабилизируется на уровне 3.0 - 3.6В. Тип стабилизатора напряжения зависит от уровня нагрузки целевой системы. Стабилизатор напряжения должен относится к типу стабилизаторов с малым минимальным перепадом напряжения. В схемах на рисунках 8 и 9 используется стабилизатор LE35 с номинальным выходным напряжением 3,5В. Однако можно использовать любое другое решение по стабилизации напряжения, если оно отвечает требованиям проектируемой системы. В некоторых случаях может быть вполне приемлемым параметрический стабилизатор на основе стабилитрона.

Остальные компоненты необходимы для соответствующей работы микроконтроллера: кварцевый резонатор для синхронизации микроконтроллера и конденсаторы для фильтрации питания.

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

Инфракрасный датчик TSOP1738 может использоваться для приема инфракрасного сигнала. Преобразователь уровня ТТЛ - RS232 MAX232 необходимо добавить при необходимости разработки преобразователя интерфейсов USB - RS232. Для управления светодиодами или дисплеем их необходимо подключить к линиям ввода-вывода непосредственно или через резисторы.

3. Программная реализация

Протокол USB-приема и дешифрации полностью реализован программно. Программа вначале принимает битовый поток USB в один USB-пакет во внутреннем буфере. Начало приема инициируется по внешнему прерыванию INT0, которое отвечает за образцовую синхронизацию. В процессе приема проверяется только сигнал конца пакета (определяется только EOP). Это необходимо ввиду очень высокой скорости передачи данных по шине USB. После успешного приема программа дешифрирует пакеты данных и анализирует их. Во-первых, с помощью адреса анализируется, что принятый пакет относится к данному устройству. Адрес передается при каждой USB-транзакции и, следовательно, устройство знает, что переданные данные относятся именно к нему. Дешифрация USB-адреса должна выполнятся очень быстро, поскольку, в случае определения действительного пакета с заданным адресом, устройство должно ответить компьютеру подтверждающим пакетом ACK. Таким образом, дешифрация адреса является критичной частью USB-ответа.

После приема битового потока мы получаем последовательность, закодированную в коде NRZI, путем поразрядного заполнения входного буфера. В процессе дешифрации мы вначале удаляем поразрядное заполнение, а затем NRZI-кодирование. Все данные изменения выполняются во втором буфере (копия приемного буфера). После дешифрация текущего пакета может приниматься новый пакет. Для данной точки, скорость дешифрации не так важна, т.к. устройство может задержать свой ответ. Если компьютер запрашивает ответ в процессе дешифрации, то устройство должно ответить незамедлительно NAK (нет подтверждения), исходя из чего компьютер поймет о неготовности устройства. Таким образом, микроконтроллер должен быть способен принимать пакеты от компьютера в процессе дешифрации, определить относится ли транзакция к устройству, а затем отправить пакет NAK, если дешифрация еще находится в процессе выполнения. В этом случае компьютер отправит запрос снова. Микроконтроллер также дешифрирует основную USB-транзакцию и выполняет запрашиваемое действие; например, отправка символа по линии RS232 и ожидание завершения транзакции, а также подготовка соответствующего ответа. При выполнении данного процесса устройство будет прерываться некоторыми пакетами, поступающих от компьютера, обычно пакты IN для получения ответа от устройства. На данные пакеты IN устройство должно ответить пакетами NAK. Если ответ готов и устройство выполнило требуемое действие, ответ должен вначале пройти через функцию вычисления и присоединения CRC, затем выполняется NRZI-кодирование, а затем поразрядное заполнение. Теперь, когда компьютер запрашивает ответ, данный битовый поток передается по линиям данных в соответствии с требованиями стандарта USB.

3.1. Описание программы микроконтроллера

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

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

3.2. Процедура обработки прерывания "EXT_INT0"

Внешнее прерывание 0 находится в активном состоянии в течение всего времени выполнения программы. Данная процедура инициирует прием данных, последовательно передаваемых по шине USB. Внешнее прерывание возникает при появлении нарастающего фронта на выводе INT0. Нарастающий фронт указывает на начало образцовой синхронизации (см. рисунок 4) и инициирует выполнение процедуры USB-приема.

Вначале процесс оцифровки данных должен быть засинхронизирован к середине бита. Это выполняется в соответствии с образцовой синхронизацией. Поскольку длительность передачи одного бита равно только 8 периодам синхронизации XTAL и возникновение прерывания может быть задержано (+/- 4 периода), то синхронизацию к фронтам образцовой синхронизации необходимо выполнить тщательно. Окончание передачи образцовой синхронизации и начало передачи бит данных определяется следующим за образцовой синхронизацией двумя битами с низким уровнем (см. рисунок 4).

После этого начинается фактическая оцифровка данных. Оцифровка выполняется по середине бита. При скорости передачи данных 1,5 Мбит/секунду (1.5МГц) и частоте синхронизации микроконтроллера 12 МГц в нашем распоряжении имеется только 8 тактов для оцифровки данных, записи результата в однобайтный буфер, сдвига данных в однобайтном буфере, проверки на прием всего байта, записи байта в статическое ОЗУ и определения окончания пакета (EOP). Это наиболее критическая часть программы; все должно быть сделано синхронно и за установленные временные рамки. После приема всего USB-пакета необходимо выполнить дешифрацию пакета. Вначале мы должны быстро определить тип пакета (SETUP, IN, OUT, DATA) и принятый USB-адрес. Быстрая дешифрация должна выполнятся внутри процедуры обработки прерывания, т.к. необходимо очень быстро ответить после приема USB-пакета (устройство должно ответить пакетом ACK, если принят пакет с адресом устройства и NAK, если принят пакет, адресованный устройству, но ответ еще не готов).

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

В процессе приема дешифрируется тип пакета и устанавливается соответствующее значение флага. Данный флаг проверяется в основном цикле программы и в зависимости от его значения выполняется соответствующее действие и подготавливается соответствующий ответ без предъявления каких-либо требований по быстродействию микроконтроллера.

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

3.3. Основной программный цикл

Основной программный цикл очень простой. В нем необходимо только проверять состояние флага действия и определять, что делать после приема данных. Кроме того, в основном цикле проверяется, сброшен ли USB-интерфейс (обе линии данных находятся в низком уровне в течение длительного времени) и, в случае определения такового состояния, выполняется переинициализация устройства. Если флаг действия активен, то вызывается соответствующее действие: дешифрация кода NRZI в пакете, удаление поразрядного заполнения и подготовка запрашиваемого ответа в буфере передатчика (с поразрядным заполнением и NRZI-кодированием). После этого активизируется флаг для сигнализации о готовности ответа к отправке.

Физическая передача выходного буфера по линиям USB выполняется в процедуре приема как ответ на пакет IN. {mospagebreak}

3.4. Краткое описание подпрограмм

Ниже приведено краткое описание подпрограмм.

3.4.1. Reset:

Выполняет инициализацию ресурсов микроконтроллера AVR: стек, линии ввода-вывода, буферы USB, прерывания.

3.4.2. Main:

Основной цикл программы. Проверяет состояние флага действия; если флаг установлен, то выполняет требуемое действие. Дополнительно, данная процедура проверяет сброс линий данных USB-шины и в случае определения сброса переинициализирует USB-интерфейс.

3.4.3. Int0Handler:

Процедура обработки внешнего прерывания INT0. Основной процессор приема/передачи. Запись данных в буфер, определение получателя USB-пакета (USB-адреса), распознавание пакета, отправка ответа компьютеру. Является основой USB устройства.

3.4.4. SetMyNewUSBAddresses:

Процедура изменения USB-адреса. Адрес изменяется и кодируется в NRZI эквивалент. Это необходимо, т.к. необходимо быстро выполнить дешифрацию адреса в процессе приема USB-пакета.

3.4.5. FinishReceiving:

Копирует непроверенные данные из принятого USB-пакета для его дешифрации (дешифрация NRZI и поразрядного заполнения).

3.4.6. USBreset:

Инициализирует интерфейс USB к значениям по умолчанию (переход к состоянию, эквивалентного состоянию сразу после подачи питания).

3.4.7. SendPreparedUSBAnswer:

Отправляет подготовленное содержимое выходного буфера по линиям USB. NRZI-кодирование и поразрядное заполнение выполняется в процессе передачи. Пакет завершается сигналом EOP.

3.4.8. ToggleDATAPID:

Переключает идентификатор пакета DATAPID (PID) между DATA0 и DATA1 PID. Данное переключение необходимо в процессе передачи согласно техническим требованиям USB.

3.4.9. ComposeZeroDATA1PIDAnswer:

Составляет нулевой ответ для передачи. Нулевой ответ не содержит данных и используется в некоторых случаях в качестве ответа, когда в устройстве нет доступных дополнительных данных.

3.4.10. InitACKBufffer:

Инициализирует буфер в ОЗУ данными ACK (пакет подтверждения ACK). Данный буфер часто отправляется в качестве ответа, что он всегда остается готовым в памяти.

3.4.11. SendACK:

Передает пакет ACK по линиям USB.

3.4.12. InitNAKBuffer:

Инициализирует буфер в ОЗУ данными NAK (пакет нет подтверждения NAK). Данный буфер часто отправляется как ответ о готовности буфера в памяти.

3.4.13. SendNAK:

Передает пакет NAK по линиям USB.

3.4.14. ComposeSTALL:

Инициализирует буфер в ОЗУ данными STALL (пакет STALL). Данный буфер часто отправляется в качестве ответа о готовности буфера в памяти.

3.4.15. DecodeNRZI:

Выполняет NRZI-дешифрацию. Данные, поступающие с линий USB, закодированы в коде NRZI. Данная процедура удаляет NRZI-кодирование из данных.

3.4.16. BitStuff:

Удаляет/добавляет поразрядное заполнение в принятых USB-данных. Поразрядное заполнение добавляется в компьютере на аппаратном уровне в соответствии с требованиями USB, чтобы гарантировать синхронизацию оцифровки данных. Данная процедура генерирует принятые данные без поразрядного заполнения или формирует данные с поразрядным заполнением для передачи.

3.4.17. ShiftInsertBuffer:

Вспомогательная процедура, которая используется при добавлении поразрядного заполнения. Добавляет один бит к выходному буферу данных и, таким образом, увеличивает длину буфера.

3.4.18 .ShiftDeleteBuffer:

Вспомогательная процедура, которая используется для удаления поразрядного заполнения. Удаляет один бит из выходного буфера данных и, таким образом, уменьшает длину буфера.

3.4.19. MirrorInBufferBytes:

Изменяет порядок разрядов в байте, т.к. у принятых данных с линий USB обратный порядок (мл. разряд/ст. разряд).

3.4.20. CheckCRCIn:

Выполняет проверку CRC (контроль циклической избыточности) в пакете принятых данных. CRC добавляется к USB-пакету для детекции повреждения данных.

3.4.21. AddCRCOut:

Добавляет поле CRC в выходной пакет данных. CRC вычисляется в соответствии с техническими требованиями USB для данных USB-полей.

3.4.22. CheckCRC:

Вспомогательная процедура, которая используется для проверки и добавления CRC.

3.4.23. LoadDescriptorFromROM:

Загрузка данных из ПЗУ в выходной буфер USB (в качестве USB-ответа).

3.4.24. LoadDescriptorFromROMZeroInsert:

Загрузка данных из ПЗУ в выходной буфер USB (в качестве USB-ответа), но каждый четный байт записывается с нулевым значением. Используется, когда дескриптор строки запрашивается в формате UNICODE (сохранение ПЗУ).

3.4.25. LoadDescriptorFromSRAM:

Загрузка данных из ОЗУ в выходной буфер USB (в качестве USB-ответа).

3.4.26. LoadDescriptorFromEEPROM:

Загрузка данных из ЭСППЗУ в выходной буфер USB (в качестве USB-ответа).

3.4.27. Load[X]Descriptor:

Выполняет выбор источника ответа: ПЗУ, ОЗУ или ЭСППЗУ.

3.4.28. PrepareUSBOutAnswer:

Подготавливает USB-ответ в выходном буфере в соответствии с запросом от компьютера и выполняет запрашиваемое действие. Добавляет поразрядное заполнение в ответ.

3.4.29. PrepareUSBAnswer:

Основная процедура для выполнения запрашиваемого действия и подготовки соответствующего ответа. Процедура вначале определит, какое действие выполнить (путем поиска номера функции во входном пакете данных), а затем выполнит запрашиваемую функцию. Параметры функции находятся во входном пакете данных.

Процедура разделена на две части:

  • стандартные запросы;
  • специфические запросы производителя.

Стандартные запросы необходимы в соответствии с техническими требованиями USB (SET_ADDRESS, GET_DESCRIPTOR, …).

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

3.5. Стандартные функции USB (стандартные запросы)

ComposeGET_STATUS;
ComposeCLEAR_FEATURE;
ComposeSET_FEATURE;
ComposeSET_ADDRESS;
ComposeGET_DESCRIPTOR;
ComposeSET_DESCRIPTOR;
ComposeGET_CONFIGURATION;
ComposeSET_CONFIGURATION;
ComposeGET_INTERFACE;
ComposeSET_INTERFACE;
ComposeSYNCH_FRAME;

3.6. Функции USB-производителя (запросыпроизводителя)

DoSetInfraBufferEmpty;
DoGetInfraCode;
DoSetDataPortDirection;
DoGetDataPortDirection;
DoSetOutDataPort;
DoGetOutDataPort;
DoGetInDataPort;
DoEEPROMRead;
DoEEPROMWrite;
DoRS232Send;
DoRS232Read;
DoSetRS232Baud;
DoGetRS232Baud;
DoGetRS232Buffer;
DoSetRS232DataBits;
DoGetRS232DataBits;
DoSetRS232Parity;
DoGetRS232Parity;
DoSetRS232StopBits;
DoGetRS232StopBits;

3.7. Структуры данных (USB-дискрипторы и строки)

DeviceDescriptor;
ConfigDescriptor;
LangIDStringDescriptor;
VendorStringDescriptor;
DevNameStringDescriptor;