Основи на проектиране и програмиране на прости USB устройства
Основната цел на стандарта, поставен пред неговите разработчици, е да даде възможност на потребителите да работят в режим Plug&Play с периферни устройства. Това означава, че трябва да е възможно да свържете устройството към работещ компютър, да го разпознаете автоматично веднага след свързването и след това да инсталирате подходящите драйвери. Освен това е желателно захранването на устройства с ниска мощност да се захранва от самата шина. Скоростта на шината трябва да е достатъчна за по-голямата част от периферните устройства. USB контролерът трябва да приеме само едно прекъсване, независимо от броя на устройствата, свързани към шината, тоест да реши проблема с липсата на ресурси във вътрешните шини на IBM PC съвместим компютър.
Почти всички задачи бяха решени в стандарта USB, а през пролетта на 1997 г. започнаха да се появяват компютри, оборудвани с конектори за свързване на USB устройства. Сега USB е толкова активно внедрен от производителите на компютърна периферия, че например в компютъра iMAC от Apple Computers има само USB като външна шина.
Функциите на USB 1.0 са както следва:
1. висока скорост на обмен на данни (пълна скорост) – 12 Mbit /s;
2. максимална дължина на кабела за висока скорост на обмен - 5 метра;
3. ниска скорост на обмен на данни (ниска скорост) - 1.5 Mbit /s;
4. максимална дължина на кабела за ниска скорост - 3 метра;
5. максималният брой свързани устройства е 127;
6. възможно едновременно свързване на устройства с различни обменни курсове;
7. захранващо напрежение за периферни устройства - 5 V;
8. максимална консумация на ток на устройство - 500 mA.
USB сигналите се предават по 4-жилен кабел,схематично показано на фигурата по-долу:

Фигура 2.6.1 - USB кабели за сигнал
Тук GND е обща проводникова верига за захранване на периферни устройства, Vbus - +5 V също и за захранващи вериги. D+ шината е за предаване на данни по шината, а D-шината е за получаване на данни. Пълноскоростният кабел е направен като кабел с усукана двойка, екраниран и може да се използва и за работа на ниска скорост. Кабелът за работа само при минимална скорост (например за свързване на мишка) може да бъде всякакъв и неекраниран. Конекторите, използвани за свързване на периферни устройства, са разделени на серии: конекторите от серия "A" (мъжки и женски) са само за свързване към източник като компютър, конекторите от серия "B" (мъжки и женски) са само за свързване към периферно устройство.
USB конекторите имат следното номериране на пинове, показано в таблица 2.6.1.
Таблица 2.6.1 - Предназначение и маркировка на USB контактите
Телефон за връзка | Предназначение | Цвят на проводника |
VBUS | червен | |
Д- | Бяло | |
D+ | Зелено | |
GND | черен | |
Плитка | Екраниране на сигнала | Метална оплетка |
През 2008 г. Intel, Microsoft, Hewlett-Packard, Texas Instruments, NEC и NXP Semiconductors създадоха спецификацията USB 3.0. В спецификацията на USB 3.0 конекторите и кабелите на актуализирания стандарт са физически и функционално съвместими с USB 2.0, но в допълнение към четирите комуникационни линии са добавени още четири. Но новите щифтове в USB 3.0 конекторите са разположени отделно от старите на различен ред щифтове. USB 3.0 спецификацияувеличава максималната скорост на трансфер на данни до 5 Gb/s – което е с порядък по-високо от 480 Mb/s, които може да осигури USB 2.0. В допълнение, максималният ток е увеличен от 500 mA на 900 mA на устройство, което ви позволява да захранвате някои устройства, които преди това изискваха отделно захранване.
Да предположим, че сте разработили USB устройство, с което искате да работите с компютър. Това може да се постигне поне по два начина:
1. разработване на пълнофункционален драйвер за операционна система;
2. използване на специален клас USB интерфейс - устройства, наречени HID (Human Interface Device) устройства.
Първият метод е универсален: имайки достатъчно познания в областта на писането на драйвери, можете да го програмирате да работи с всяко устройство с всяка скорост, поддържана от USB. Но това е доста трудна задача.
Вторият начин е следният. Има интерфейс, поддържан от модерни операционни системи за устройства за взаимодействие между компютър и човек или HID устройства, като например:
1. клавиатури, мишки, джойстици;
2. различни сензори и четци;
3. кормилно управление и педали;
4. бутони, ключове, регулатори.
Всяко такова устройство, ако отговаря на изискванията за HID устройства, ще бъде автоматично разпознато от системата и няма да изисква писане на специални драйвери. Освен това програмирането им обикновено е много по-лесно от писането на потребителски драйвер за устройство. За съжаление, методът има съществен недостатък: скоростта на обмен на информация с HID устройството е много ограничена и възлиза на максимум 64 kB/s.
По принцип на базата на HID технологията е възможно да се организира взаимодействие с всяко устройство, дори и да не е такае в строгия смисъл интерфейсно устройство на човек и компютър. Това елиминира отнемащото време разработване на уникален драйвер за устройство и спестява време за разработване на ново USB устройство. От страната на хоста обменът с устройството ще се управлява от стандартен HID драйвер, включен в дистрибуцията на операционната система. Необходимо е само да се изпълнят минималните изисквания на протокола USB-HID от страната на устройството.
Заслужава да се отбележи, че много USB устройства, които на пръв поглед не попадат в дефиницията на устройства за взаимодействие с хора, все пак е по-логично да се внедрят като HID устройства. Това явление често се среща в областта на производственото оборудване, което наскоро претърпя масово въвеждане на USB технология. Например, помислете за лабораторно захранване с възможност за задаване на параметрите на изходните му сигнали от компютър чрез USB интерфейс. Без съмнение самият източник на енергия не е средство за взаимодействие с човек. В този случай обаче функциите, реализирани чрез USB връзка, дублират клавиатурата, контролите и индикаторите, инсталирани на самото устройство. И тези контроли просто попадат в дефиницията на HID. Съответно захранването с тези USB функции е най-логично организирано като HID устройство.
В разглеждания пример малка скорост на пренос на данни ще бъде достатъчна за нормална работа, докато в други случаи устройствата могат да бъдат много взискателни към обменния курс. Ниската скорост на трансфер е основното ограничение на дизайна на HID устройството, което в сравнение с 12 Mbps от пълната скорост на USB 1.0 шината изглежда като голям недостатък на HID технологията при избора на конкретна USB реализация. Въпреки това, за много комуникационни задачи тази скорост е напълно достатъчна иHID-архитектурата като специализиран инструмент заема достойно място сред начините за организиране на обмен на данни.
Има два вида HID устройства: участващи (стартиращи) и неучастващи в първоначалното зареждане на компютъра. Най-яркият пример за стартиращо USB-HID устройство е клавиатурата, която започва да работи със стартирането на компютъра.
При разработването на HID устройство трябва да бъдат изпълнени следните изисквания, наложени от спецификацията:
1. Пълноскоростното HID устройство може да прехвърля 64 000 байта всяка секунда или 64 байта на всеки 1 ms; нискоскоростно HID устройство има способността да прехвърля до 800 байта в секунда или 8 байта на всеки 10 ms.
2. HID устройството може да определи своята честота на запитване, за да определи дали има свежи данни за предаване.
3. Обменът на данни с HID устройството се осъществява чрез специална структура, наречена отчет (Report). Всеки дефиниран отчет може да съдържа до 65535 байта данни. Структурата на отчета има много гъвкава организация, която ви позволява да опишете всеки формат за прехвърляне на данни. За да може конкретен формат на отчета да стане известен на хоста, микроконтролерът трябва да съдържа специално описание - дескриптор на отчета.
USB комуникацията се реализира директно на микроконтролера по няколко начина:
1. използване на контролер с хардуерна поддръжка, като AT90USB*, от atmega;
2. използване на софтуерна емулация на USB интерфейса на всеки микроконтролер.
За софтуерна реализация в момента има редица готови решения за различни семейства микроконтролери. За AVR микроконтролери като Atmega8 е възможно да използвате следните безплатни C библиотеки:
И двете са достатъчнилесен за използване, осигурява пълна емулация на USB 1.1 нискоскоростни устройства, с изключение на обработката на комуникационни грешки и електрически характеристики, и работи на почти всички AVR контролери с поне 2k флаш, 128 байта RAM и 12 до 20 MHz.
За да напишете приложения, които поддържат Windows USB HID устройства, са необходими hid* заглавните файлове, включени в WDK (Windows Driver Kit), или можете да използвате свободно разпространяваната библиотека hidlibrary или друга подобна.
Така в общия случай USB програмирането е доста сложна задача, изискваща специален микроконтролер с хардуерна поддръжка и писане на драйвер за операционна система. На практика обаче при разработването на устройства е възможно да се използва много по-опростен HID интерфейс - устройства, чиято поддръжка е реализирана на ниво стандартен системен драйвер, а програмирането е опростено с помощта на съществуващи функционални библиотеки.
Тестови въпроси
- Каква е разликата между D- и GND проводниците в USB? Защо не можете да използвате един общ проводник за захранване и сигнал?
- Колко режима на USB скорост има днес (включително версия 3.0)?
- Какво е HID устройство? Защо не изискват писане на драйвери, за да работят в модерни операционни системи?
- Възможно ли е да се внедрят USB устройства с помощта на микропроцесор, който няма вградена поддръжка на интерфейс?
- Какви са основните разлики между USB 3.0 и предишните версии?