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