USB w urządzeniach elektronicznych

| Technika

Port USB jest obecnie nieodłącznym wyposażeniem współczesnych komputerów, a liczba dołączanych do niego urządzeń takich jak myszy, klawiatury, drukarki, aparaty, modemy GSM, pamięci masowe, programatory, debuggery, ładowarki, cały czas rośnie. Czasy, kiedy poszczególne urządzenia miały własne porty, np. LPT dla drukarek i skanerów, minęły bezpowrotnie. Jest to znaczący postęp i ułatwienie dla użytkowników sprzętu, ale nie dla producentów, gdyż oznacza to rezygnację z dotychczas stosowanych łatwych w implementacji portów komunikacyjnych takich jak RS 232. Współcześnie istnieje kilka możliwości zrealizowania transmisji przez port USB, takich jak moduły sprzętowe wbudowane w mikrokontrolery, układy konwertujące standard USB na inny, dedykowane przejściówki. Każde z tych rozwiązań ma wady i zalety warte omówienia.

USB w urządzeniach elektronicznych

W niniejszym artykule omawiamy podstawowe informacje na temat obsługi USB we własnych projektach. Za miesiąc, w dokończeniu artykułu, pokażemy najpopularniejsze rozwiązania z zakresu łączenia urządzeń cyfrowych z komputerem poprzez port USB.

Parametry

Rys. 1. Spadki napięcia na hubie i przewodach w standardzie USB

Największymi zaletami portu USB są duża szybkość przesyłania danych oraz udostępnienie zasilania, co pozwala zrezygnować z zewnętrznego, nieporęcznego zasilacza. Każde nowo podłączone urządzenie może pobierać maksymalnie 100mA prądu. Zwiększenie tej wartości jest możliwe tylko w sytuacji, gdy host zaakceptuje żądanie udostępnienia pełnego limitu wynoszącego 500mA.

Jest to wartość maksymalna, dostępna dla jednego portu, więc w sytuacji, gdy stosowane są huby bez zewnętrznego zasilacza, będzie ona dzielona pomiędzy wszystkie dołączone urządzenia. Po wprowadzeniu hosta w stan wstrzymania limit zostaje ograniczony do 2,5mA.

Napięcie dostępne na porcie USB wynosi nominalnie 5V±5%. W sytuacji, gdy urządzenie jest podłączone przez hub bez własnego zasilania, wartość ta może się zmniejszyć do około 4,4V, co pokazano schematycznie na rysunku 1. Na uwagę zasługuje fakt, że wtyczkę i gniazdko zaprojektowano w taki sposób, aby piny zasilające były dołączane w pierwszej kolejności, przed pinami sygnałowymi.

Dzięki temu możliwe jest podłączanie urządzenia bez potrzeby wyłączania komputera w obawie o uszkodzenie sprzętu. Złącze USB ma cztery wyprowadzenia: plus zasilania, masę oraz dwie linie sygnałowe przeznaczone do przesyłania sygnału różnicowego (oznaczane jako D+ oraz D-).

W standardzie określone zostały kolory poszczególnych przewodów (tab. 1) oraz wymiary różnych typów (np. mikro, mini, typu A, typu B). Szeregowy charakter magistrali i niewielka liczba wyprowadzeń oraz dostępność kilku rodzajów gniazdek upraszcza proces projektowania urządzenia.

Dostępność złączy o małych wymiarach (mini oraz micro) nie wymaga znaczącego zwiększania obudowy, natomiast niewiele sygnałów sprawia, że w zasadzie wystarczą tylko cztery połączenia na płytce drukowanej. Jest to znaczące ułatwienie w porównaniu np. z portem szeregowym RS232, który wymagał dodatkowo konwertera napięć.

Specyfikacja USB w wersji 2.0 przewiduje przesyłanie danych z jedną z trzech szybkości:

  • małą, wynoszącą 1,5Mb/s (low speed)
  • pełną, wynoszącą 12Mb/s (full speed)
  • wysoką, do 480MB/s (high speed)

Wybór prędkości jest uzależniony od potrzeb, możliwości modułu USB wbudowanego w mikrokontroler oraz częstotliwości taktowania. Większe prędkości wymagają zegara o większej częstotliwości, co nie zawsze jest potrzebne i korzystne choćby z punktu widzenia kompatybilności elektromagnetycznej.

Przykładowo w mikrokontrolerach PIC18F1XK50 tryb low speed pracuje z zegarem 6 MHz, podczas gdy praca z pełną szybkością wymaga taktowania na poziomie 48 MHz. Podciągnięcie linii D- bądź D+ do plusa zasilania rezystorem 1,5kΩ pozwala wybrać prędkość transmisji (odpowiednio: low i full speed).

Podstawowe klasy urządzeń

Klasa CDC (Communication Device Class)
Urządzenia klasy CDC są widoczne w systemie operacyjnym jako standardowe porty szeregowe (wirtualne porty COM). Jest to prawdopodobnie najprostszy sposób na zaimplementowanie portu USB we własnym urządzeniu. Obsługa od strony komputera pozostaje praktycznie bez zmian, gdyż biblioteki obsługujące porty szeregowe są popularne i łatwe w obsłudze. Niektóre środowiska programistyczne (np. Visual Studio) oferują kontrolki do obsługi tego portu.

Jedyną trudnością pozostaje emulacja interfejsu szeregowego od strony mikrokontrolera, ale ten problem najczęściej rozwiązują producenci, dostarczając gotowe biblioteki i przykładowe oprogramowanie. W wielu przypadkach okaże się, że klasa urządzeń CDC zapewnia możliwość współpracy z istniejącym już oprogramowaniem komputerowym. Niestety kompatybilność ta nie zawsze jest zachowana, gdyż port szeregowy jest portem wirtualnym.

Aplikacje operujące bezpośrednio na rejestrach I/O komputera nie będą najprawdopodobniej działać poprawnie. Biorąc jednak pod uwagę fakt, że od chwili wprowadzenia Windows XP bezpośredni dostęp do tych rejestrów jest mocno ograniczony ze względów bezpieczeństwa, nie należy się spodziewać, aby duża liczba współczesnych aplikacji pracowała w ten sposób.

Do poprawnej pracy rozwiązań bazujących na klasie urządzeń CDC niezbędny jest plik INF wskazujący bibliotekę systemową zawierającą stosowny sterownik. Niestety jest on różny dla poszczególnych wersji systemu Windows, ale producenci mikrokontrolerów najczęściej dołączają przykładowe pliki, które należy wskazać po wykryciu nowego urządzenia w systemie.

Masowe urządzenia magazynujące (Mass Storage Device Class)
Ta klasa emuluje napędy dysków lub stacje CD-ROM. Rozwiązanie to umożliwia instalowanie oprogramowania bez konieczności używania rzeczywistych nośników danych (np. płyt). Przykładem urządzeń korzystających z tego rozwiązania są modemy GSM wyposażone w złącze USB.

Mogą one posiadać wirtualny dysk twardy oraz wbudowany czytnik kart pamięci. Po umieszczeniu takiego modemu będzie on widoczny w systemie jako dodatkowy dysk zawierający potrzebne sterowniki. Jest to wygodne rozwiązanie, gdyż zwalnia użytkownika z konieczności przechowywania niepotrzebnych płyt CD bądź DVD.

Klasa masowych urządzeń magazynujących jest dobrym wyborem, kiedy urządzenie elektroniczne ma umożliwiać wymianę plików z komputerem. Przykładem takiego rozwiązania są konsole PSP, odtwarzacze MP3/MP4, czytniki kart pamięci, aparaty fotograficzne czy pamięci Flash (pendrive).

Urządzenia HID (Human Interface Device)
Klasa urządzeń HID została przeznaczona do obsługi urządzeń stanowiących interfejs użytkownika (klawiatury, myszy, joysticki, etc). Najczęściej układy pracujące w takiej konfiguracji nie wymagają żadnych sterowników, gdyż domyślne są dołączane do systemu operacyjnego, aby zapewnić pracę podstawowych urządzeń sterujących.

Komunikacja z hostem oparta jest o przesyłanie raportów z wykorzystaniem transferów kontrolnych lub przerwaniowych. Okazuje się, że w raporcie takim można umieścić dodatkowe informacje, będące w rzeczywistości danymi.

Przekłada się to na możliwość przesyłania informacji w obie strony bez konieczności pisania i instalowania jakichkolwiek sterowników. Oczywiście można tak napisać oprogramowanie, aby systemu operacyjny nie wyświetlił informacji o podłączeniu nowego sprzętu. Odpowiednio oprogramowany mikrokontroler może również "udawać" myszkę lub klawiaturę.

Ewentualny tryb wysokiej szybkości jest włączany programowo po nawiązaniu połączenia z pełną szybkością pomiędzy hostem i urządzeniem peryferyjnym. Trudno jednak wyobrazić sobie współczesne mikrokontrolery zdolne komunikować się z tak ogromną prędkością, gdyż taktowanie na poziomie 480 MHz i stosowne bufory potrzebne do odebrania ogromnej ilości danych są obecnie niespotykane wśród mikrokontrolerów.

Rys. 2. Deskryptory cechują się strukturą hierarchiczną

Podciąganie linii danych do plusa zasilania spełnia jeszcze jedną ważną funkcję, mianowicie stanowi sygnał dla hosta, że dołączono nowy sprzęt. Stosowny rezystor jest najczęściej zintegrowany z kontrolerem USB i może być dołączony bądź odłączony w sposób programowo poprzez ustawienie lub wykasowanie odpowiedniego bitu w rejestrze.

W przypadku mikrokontrolerów firmy Microchip istnieje możliwość wyboru, do której linii rezystor ma być podłączony i tym samym można wybrać szybkość, z jaką ma pracować interfejs USB. W innych rozwiązaniach (np. układach AT90USB82/162 firmy Atmel) takiego wyboru nie ma.

Rezystor jest podłączany tylko do linii D+, gdyż układ został przewidziany do pracy z pełną szybkością, niemniej istnieje możliwość jego programowego odłączenia i dołączenia, aby przeprowadzić ponowną enumerację.