Поиск по сайту:

 


По базе:  

микроэлектроника, микросхема, микроконтроллер, память, msp430, MSP430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, SED1335, mega128, avr, mega128  
  Главная страница > Применение > Микроконтроллеров > AVR

реклама

 




Мероприятия:




AVR309: Программная реализация универсальной последовательной шины (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. Подключения кабеля и резисторов к низкоскоростному устройству

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

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

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

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

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

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

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

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

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

Уведомление об окончании передачи данных выполняется с помощью передачи сигнала "конец пакета" (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-передачи (подготовка данных для передачи), а также выполнять администрирование с дешифрованием и проверкой сообщений. Кроме того, необходима программа для выполнения быстрого и точного синхронного приема с физических линий в буфер и передачи из буфера на линии. Данные возможности ограничиваются быстродействием микроконтроллера и размером памяти программ/данных, т.к. программа должна быть тщательно оптимизирована. В некоторых случаях вычислительные возможности микроконтроллера очень близки к минимальным требованиям, поэтому, вся программа написана на Ассемблере.

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

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

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

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

Линии данных 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.

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

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.

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;

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 побитовое отображение Характеристики запроса
D7 - направление данных xfer:
0 = главный устройству;
1 = устройство главному.
D6..5 - Тип:
0 = стандарт;
1 = класс;
2 = производитель;
3 = зарезервировано.
D4..0 - Получатель
0 = устройство;
1 = интерфейс;
2 = конечная точка;
3 = другое;
4..31 = зарезервировано.
1 bRequest 1 Значение Специфический запрос
2 wValue 2 Значение Поле, измеряемое в словах, которое варьируется в зависимости от запроса
4 wIndex 2 Индекс или смещение Поле, измеряемое в словах, которое варьируется в зависимости от запроса - обычно используется для пересылки индекса или смещения
6 wLength 2 Подсчет Количество байт для передачи, если наступила фаза данных

Таблица 2. Стандартные запросы устройства

BmRequest-Type bRequest wValue wIndex wLength Данные
00000000B
00000001B
00000010B
CLEAR_FEATURE Переключатель особенностей Нуль
Интерфейс
Конечная точка
Нуль Нет
10000000B GET_CONFIGURATION Нуль Нуль Один Конфигурационное значение
10000000B GET_DESCRIPTOR Тип дескриптора и индекс дескриптора Нуль или язык ID Длина дескриптора Дескриптор
10000001B GET_INTERFACE Нуль Интерфейс Один Альтернативный интерфейс
10000000B
10000001B
10000010B
GET_STATUS Нуль Нуль
Интерфейс
Конечная точка
Два Статус устройства, интерфейса или конечной точки
00000000B SET_ADDRESS Адрес устройства Нуль Нуль Нет
00000000B SET_CONFIGURATION Конфигурационное значение Нуль Нуль Нет
00000000B SET_DESCRIPTOR Тип дескриптора и индекс дескриптора Нуль или язык ID Длина дескриптора Дескриптор
00000000B
00000001B
00000010B
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
DDRC
DDRD
Используемые порты
1 Статус
110xxxxxB FNCNumberDoGetDataPortDirection 4 Нет Нет 3 DDRB
DDRC
DDRD
110xxxxxB FNCNumberDoSetOutDataPort 5 PORTB
PORTC
PORTD
Используемые порты
1 Статус
110xxxxxB FNCNumberDoGetOutDataPort 6 Нет Нет 3 PORTB
PORTC
PORTD
110xxxxxB FNCNumberDoGetInDataPort 7 Нет Нет 3 PINB
PINC
PIND
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). Нельзя использовать данный идентификатор производителя в своей целевой системе.

3.10. Программа для ПК

Для обеспечения связи с устройством необходима некоторая программная поддержка на стороне ПК. Программа разделена на три уровня:

  1. Драйвер устройства: используется для связи на низком уровне с устройством и для инсталляции в операционную систему (Windows98/ME/NT/XP).
  2. DLL-библиотека: используется для инкапсуляции функций устройства и связи с драйвером устройства. DLL упрощает доступ к функциям устройства из программы пользователя. В состав библиотеки входят некоторые функции устройства и операционной системы (задачи, буферы и др.).
  3. Приложение пользователя: создает пользовательский интерфейс для удобной связи между пользователем и устройством. Вызывает функции только из DLL-библиотеки.

3.10.1. Драйвер устройства и файлы инсталляции

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

Драйвер, рассматриваемого в данных "Рекомендациях…" устройства, выполнен с использованием Windows2000 DDK (набор для разработки драйвера). Разработка драйвера USB основана на входящих в DDK примерах - IsoUsb. Данный драйвер изменен для организации USB-связи с AVR. В оригинальном исходном коде изменения выполнялись вокруг IOCTL-связи путем добавления или расширения, т.к. устройство связывается с компьютером посредством IOCTL-вызовов. Для уменьшения размера кода драйвера из исходного кода были удалены неиспользуемые части. Имя драйвера - "AVR309.sys". Он работает как отправитель команд USB-устройству (управляет входящей передачей). Драйвер работает под всеми версиями 32-разрядных операционных систем Windows, за исключением Win95. Инсталляционный скрипт, записанный в INF-файл, используется в процессе инсталляции устройства. В данном INF-файле описаны различные инсталляционные шаги. Файл "AVR309.inf" создан с помощью текстового редактора. Он запрашивается операционной системой в процессе инсталляции.

После инициации инсталляции файл драйвера копируется в операционную систему, а затем выполняются требуемые системные изменения. INF-файл гарантирует инсталляцию DLL-библиотеки в системную папку, что гарантирует простоту ее вызова из различных приложений. Для инсталляции устройства необходимо три файла: INF-файл "AVR309.inf", драйвер "AVR309.sys" и DLL-библиотека "AVR309.dll".

3.10.2. Библиотека DLL

DLL-библиотека связывает с драйвером устройства и всеми функциями устройства, реализованных в этой библиотеке. Способ написания программы конечного пользователя предельно упрощен. DLL-библиотека гарантирует привилегированный доступ к устройству (упорядочивает доступ к устройству), содержит системный буфер для приема данных через RS232 и создает одну системную задачу для чтения буфера данных RS232.

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

Системный буфер для приема данных через RS232 гарантирует, что принятые данные будут размещены в одном буфере, который является общим для всех приложений. В таком случае принятые данные устройством будут отправляться всем приложениям. Не стоит беспокоиться о том, что приложение примет не полностью данные из-за того, что другое приложение до этого считывало буфер данных.

Для всех приложений существует только одна системная задача, и данные будут периодически запрашиваться у устройства через RS232. В этом случае задача будет сохранять принятые данные в системный буфер. Наличие только одного системного буфера гарантирует небольшую загрузку ЦПУ (в сравнении, когда каждое приложение имеет свою собственную задачу) и упрощает сохранение данных в системный буфер. Все функции устройства определены в библиотеке DLL, а их экспорт выполняется в удобной форме: не в виде номера функции и параметров, а в виде удобного имени функции с параметрами. Некоторые функции более сложны внутренне, например, функция чтения буфера данных RS232. Таким образом, разработчики могут быстро разрабатывать свои приложения, используя только интерфейс DLL. Нет необходимости изучать функции низкого уровня устройства, т.к. DLL-библиотека разделяет уровень прикладного программирования от аппаратного уровня.

Объявления написаны для 3 наиболее популярных языков программирования: Borland Delphi, C++ (Borland или Microsoft) и Visual Basic. Детальное описание данных функций может быть найдено во вложенном файле помощи AVR309_DLL_help.htm. DLL написана на Delphi и ее весь исходный код входит в данные "Рекомендации…".

3.10.3. Приложение конечного пользователя

Приложение конечного пользователя использует функции из DLL-библиотеки для связи с устройством. Его основным назначением является реализация дружественного графического пользовательского интерфейса (GUI).

Для написания собственной программы программистам необходимо использовать библиотеку DLL. В качестве примера можно использовать проект в исходных кодах, который входит в приложение к данным "Рекомендациям…". Множество приложений можно создать, используя данный пример в качестве отправной точки, используя при этом различные языки программирования (Delphi, C++ и Visual Basic).

Пример приложения называется "AVR309demo.exe". Данную программу предполагалось использовать только в качестве примера по тому, как использовать функции из библиотеки DLL. Вложенный исходный код написан на Delphi и может использоваться в качестве шаблона для других приложений.

3.10.4. Погрешность генерации скорости УАПП

Микроконтроллер использует тактовую частоту 12МГц из-за осуществления преобразования USB. Однако недостатком использования такой частоты синхронизации является наличие небольшой погрешности при генерации стандартных скоростей связи. Однако за счет высокого значения частоты синхронизации погрешность минимальна. Максимально допустимая погрешность генерации скорости связи должны быть 4%, т.к. максимальная погрешность равна отношению длительности половины бита (0.5) к максимальной длительности пакета 12 бит = 1 старт-бит + 8 бит данных + 1 бит паритета + 2 стоп-бита. Таким образом, погрешность равна 0.5/12*100% = 4.1%.

Функции в DLL автоматически вычисляют погрешность и устанавливают такую скорость связи, отклонение от стандартной которой не превышает 4%. В случае определения неподдерживаемой скорости выводится сообщение об ошибке. Однако не рекомендуется использовать скорости с погрешностью более 2%.

В таблице 4 подытоживаются погрешности в генерации стандартных скоростей при работе микроконтроллера на частоте 12 МГц.

Таблица 4. Погрешность генерации скорости связи УАПП микроконтроллера AVR (тактовая частота 12 МГц)

Стандартная скорость Скорость в AVR Погрешность, %
600 602 +0.33
1200 1204 +0.33
2400 2408 +0.33
4800 4808 +0.17
9600 9616 +0.17
19200 19230 +0.16
28800 28846 +0.16
38400 38462 +0.16
57600 57692 +0.16
115200 115384 +0.16

5. Приложение

Приложения входят в состав отдельного присоединенного файла к данным рекомендациям по применению.

5.1. Прошивка для AVR с исходным кодом

Исходный код программы для микроконтроллера ATmega8 написан в AVR Studio 4. Исходный код программы можно найти в текстовом файле USBtoRS232.asm или с синтаксическими выделениями в файле USBtoRS232asm.pdf.

5.2. DLL-библиотека с исходным кодом

Библиотека AVR309.dll написана в Delphi3, т.к. данный исходный код основан на объектном языке Паскаль. Интерфейсы (Delphi, C/C++ и Visual Basic.) к DLL-библиотеке (экспортируемые функции) "AVR309.dll" описаны в файле AVR309_DLL_help.htm. Исходный код библиотеки AVR309.dll, написанный в Delphi3, может быть найден в файле AVR309.dpr (проект Delphi3).

5.3. Пример приложения конечного пользователя с исходным кодом

Пример использования библиотеки DLL в виде приложения конечного пользователя представлен в виде исполнимого файла AVR309USBdemo.exe. Исходный код, написанный в Delphi3, может быть найден в файле AVR309USBdemo.dpr.

Документация:

  430 Kb Engl Исходный файл
  3.26 Mb Engl Программное обеспечение

Инженер Игорь Чешко (Igor Cesko)
Словакия
www.cesko.host.sk

Modding and silent computer




 
Впервые? | Реклама на сайте | О проекте | Карта портала
тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru
©1998-2023 Рынок Микроэлектроники