3.8. Формат входного сообщения компьютера
Как сказано выше, USB-устройство использует USB передачу управления. Данный тип передачи использует формат данных, определенный в технических требованиях к USB ([2], стр. 13). В документе описываются подробности передачи управления и, таким образом, того, как данное устройство связывается с компьютером. Микроконтроллер AVR использует управляющую конечную точку IN. Прекрасный пример передачи данных может быть найден на странице 15 в [2]. Передача данных между компьютером и микроконтроллером AVR выполнена в соответствии с данным примером.
В дополнение к фактической передачи управления обсуждается формат поля DATA0/1. Передача управления определяет на своем этапе установки стандартный запрос длиной 8 байт. Данный формат описан на странице 26 в [2] (пакет установки). Там приводится таблица с описанием значения каждого байта. Важно следующее:
Стандартный пакет установки используется для детекции и конфигурации устройства после подачи питания. Данный пакет использует стандартный тип запроса в поле bmRequestType (разряды D6-D5 = 0). Все остальные значения полей (bRequest, wValue, wIndex, wLength) могут быть найдены в технических требованиях USB. Их разъяснение может быть найдено на страницах 27-30 в [2] (стандартные запросы).
Каждый пакет установки содержит 8 байт, которые используются в соответствии с описанием в таблице 1.
Таблица 1. Поля стандартных пакетов установки (передача управления)
Смещение |
Поле |
Размер |
Значение |
Описание |
---|---|---|---|---|
0 |
bmRequestType |
1 |
побитовое отображение |
Характеристики запроса
|
1 |
bRequest |
1 |
Значение |
Специфический запрос |
2 |
wValue |
2 |
Значение |
Поле, измеряемое в словах, которое варьируется в зависимости от запроса |
4 |
wIndex |
2 |
Индекс или смещение |
Поле, измеряемое в словах, которое варьируется в зависимости от запроса - обычно используется для пересылки индекса или смещения |
6 |
wLength |
2 |
Подсчет |
Количество байт для передачи, если наступила фаза данных |
Таблица 2. Стандартные запросы устройства
BmRequest-Type |
bRequest |
wValue |
wIndex |
wLength |
Данные |
---|---|---|---|---|---|
00000000B |
CLEAR_FEATURE |
Переключатель особенностей |
Нуль |
Нуль |
Нет |
10000000B |
GET_CONFIGURATION |
Нуль |
Нуль |
Один |
Конфигурационное значение |
10000000B |
GET_DESCRIPTOR |
Тип дескриптора и индекс дескриптора |
Нуль или язык ID |
Длина дескриптора |
Дескриптор |
10000001B |
GET_INTERFACE |
Нуль |
Интерфейс |
Один |
Альтернативный интерфейс |
10000000B |
GET_STATUS |
Нуль |
Нуль |
Два |
Статус устройства, интерфейса или конечной точки |
00000000B |
SET_ADDRESS |
Адрес устройства |
Нуль |
Нуль |
Нет |
00000000B |
SET_CONFIGURATION |
Конфигурационное значение |
Нуль |
Нуль |
Нет |
00000000B |
SET_DESCRIPTOR |
Тип дескриптора и индекс дескриптора |
Нуль или язык ID |
Длина дескриптора |
Дескриптор |
00000000B |
SET_FEATURE |
Переключатель особенностей |
Нуль |
Нуль |
Нет |
00000001B |
SET_INTERFACE |
Альтернативная установка |
Интерфейс |
Нуль |
Нет |
10000010B |
SYNCH_FRAME |
Нуль |
Конечная точка |
Два |
Номер кадра |
Таблица 3. Запросы производителя, используемые в программе для вызова функций
Тип запроса BmRequest-Type |
Наименование запрашиваемой функции bRequest |
Номер bRequest |
Параметр 1wValue |
Параметр 2wIndex |
wLength |
Данные |
---|---|---|---|---|---|---|
110xxxxxB |
FNCNumberDoSetInfraBufferEmpty |
1 |
Нет |
Нет |
1 |
Статус |
110xxxxxB |
FNCNumberDoGetInfraCode |
2 |
Нет |
Нет |
1 |
Статус |
110xxxxxB |
FNCNumberDoSetDataPortDirection |
3 |
DDRB |
DDRD |
1 |
Статус |
110xxxxxB |
FNCNumberDoGetDataPortDirection |
4 |
Нет |
Нет |
3 |
DDRB |
110xxxxxB |
FNCNumberDoSetOutDataPort |
5 |
PORTB |
PORTD |
1 |
Статус |
110xxxxxB |
FNCNumberDoGetOutDataPort |
6 |
Нет |
Нет |
3 |
PORTB |
110xxxxxB |
FNCNumberDoGetInDataPort |
7 |
Нет |
Нет |
3 |
PINB |
110xxxxxB |
FNCNumberDoEEPROMRead |
8 |
Адрес |
Нет |
Длина |
байты ЭСППЗУ |
110xxxxxB |
FNCNumberDoEEPROMWrite |
9 |
Адрес |
Значение ЭСППЗУ |
1 |
Статус |
110xxxxxB |
FNCNumberDoRS232Send |
10 |
Значение байта RS232 |
Нет |
1 |
Статус |
110xxxxxB |
FNCNumberDoRS232Read |
11 |
Нет |
Нет |
2 |
Статус |
110xxxxxB |
FNCNumberDoSetRS232Baud |
12 |
Мл. байт скорости связи |
Ст. байт скорости связи |
1 |
Статус |
110xxxxxB |
FNCNumberDoGetRS232Baud |
13 |
Нет |
Нет |
2 |
Скорость связи |
110xxxxxB |
FNCNumberDoGetRS232Buffer |
14 |
Нет |
Нет |
Длина |
Байты RS232 из FIFO |
110xxxxxB |
FNCNumberDoSetRS232DataBits |
15 |
Значение бит данных |
Нет |
1 |
Статус |
110xxxxxB |
FNCNumberDoGetRS232DataBits |
16 |
Нет |
Нет |
1 |
Значение бит данных |
110xxxxxB |
FNCNumberDoSetRS232Parity |
17 |
Значение паритета |
Нет |
1 |
Статус |
110xxxxxB |
FNCNumberDoGetRS232Parity |
18 |
Нет |
Нет |
1 |
Значение паритета |
110xxxxxB |
FNCNumberDoSetRS232StopBits |
19 |
Значение стоп-бит |
Нет |
1 |
Статус |
110xxxxxB |
FNCNumberDoGetRS232StopBits |
20 |
Нет |
Нет |
1 |
Значения стоп-бит |
Режим передачи управления используется для пользовательской связи, реализованной в программе как специальные функции. Запрос производителя используется в поле bmRequestType (разряды D6-D5 = 2). Здесь все следующие поля (bRequest, wValue, wIndex) могут модифицироваться в соответствии с целями программиста. В нашей реализации поле bRequest используется для задания номера функции, а следующие поля - для задания параметров функции. Первый параметр задается в слоте wValue, а второй - в позиции wIndex.
Рассмотрим пример записи в ЭСППЗУ. В качестве номера функции выбирается bRequest = 9. Поле wValue используется для задания адреса ЭСППЗУ, а записываемое значение (данные ЭСППЗУ) указываются в поле wIndex. В соответствии с этим получаем следующую функцию: EEPROMWrite(Address, Value).
Если пользовательских функций недостаточно, то достаточно добавить номер функции и тело требуемый функции в программу. В качестве методики можно использовать существующие встроенные функции в программе (см. исходный код).
Главный шины USB (компьютер) также связывается с устройством посредством передач управления IN. Главный отправляет устройству 8-байтный IN-пакет данных в формате определенном выше (номер функции и параметры), а затем устройство отвечает запрошенными данными. Размер запрашиваемых данных ограничен в программе в некоторых случаях до 255 байт, но основное ограничение выполняется драйвером устройства на стороне управляющего компьютера. Существующий драйвер поддерживает 8-байтную длину ответов в запросах, относящихся к типу запросов производителя.
3.9. Создание собственной программы
Пользователи могут добавлять новые функции и расширять функциональные возможности устройства. В программе имеется 3 примера добавления новых функций: DoUserFunctionX (X=0,1,2). Изучите данные примеры, чтобы понять, как добавить похожие расширенные функции. Содержимое функций зависит только от требований устройства.
Имя идентификации и устройства, представленное на стороне устройства, может быть изменено в программе микроконтроллера. Данное имя хранится в программе в виде строки и может быть заменено на любую другую строку. Однако данные имена рекомендуется изменять вместе с USB PID (идентификатор продукции) и VID (идентификатор производителя) для корректного распознавания в целевой системе. VID вместе с PID должны быть уникальными для заданного типа устройства. Таким образом, рекомендуется, при изменении функциональных возможностей устройства, изменять PID и/или VID. Идентификатор производителя зависит от производителя USB-устройства и должен быть определен USB-организацией (более подробно смотри в [1]).
Каждый производитель имеет собственный идентификатор и, следовательно, его значение не может быть изменено на другое несоответствующее значение. Однако идентификатор продукции зависит только от выбора производителя, а назначением PID является распознавание различных устройств одного и того же производителя. В данных рекомендациях по применению установлены VID 0x03EB и PID 0x21FF (идентификатор Atmel). Нельзя использовать данный идентификатор производителя в своей целевой системе.