USB w urządzeniach elektronicznych, część 2 – przegląd kontrolerów
| TechnikaW pierwszej części artykułu, zamieszczonej w poprzednim numerze "Elektronika", przedstawione zostały najpopularniejsze rozwiązania z zakresu łączenia urządzeń cyfrowych z komputerem poprzez port USB oraz podstawowe informacje o tym standardzie. Część druga prezentuje interfejsy magistrali USB zintegrowane z mikrokontrolerami, jakie oferuje wielu producentów tych układów, mosty i emulatory oraz rozwiązania programowe.
Interfejs USB jest znacznie przyjaźniejszy użytkownikom niż poprzednie łącza (RS232, LPT, PS2), ale jest zdecydowanie bardziej kłopotliwy dla projektantów. Programowa realizacja stosu USB jest możliwa, ale nie jest ona prosta i wymaga znaczącej wiedzy. Trudno jednak zrezygnować ze stosowania USB, które cieszy się dużą popularnością wśród użytkowników i wyznacza pewien standard wśród produktów rynkowych.
Duże zapotrzebowanie w tym zakresie dostrzegli producenci mikrokontrolerów, którzy zaczęli wyposażać swoje produkty w zintegrowane interfejsy USB. Zdali sobie oni także sprawę z trudności związanych z ich oprogramowaniem, gdyż duża różnorodność konfiguracji, trybów transmisji i innych opcji sprawia, że znaczącą liczbę zadań realizuje się programowo. Często architektura mikrokontrolera przewiduje obecność sprzętowego układu nadawczo-odbiorczego, stosownych rejestrów kontrolnych, punktów końcowych i mechanizmów zarządzających warstwą fizyczną.
Po stronie programistów pozostaje przygotowanie stosownych deskryptorów i obsługa transmisji. Naprzeciw oczekiwaniom projektantów wyszedł Microchip, oferując szereg układów wyposażonych w port USB i udostępniając na swojej stronie bibliotekę MCHPFSUSB Framework przeznaczoną dla mikrokontrolerów PIC18F (8-bit.), PIC24F (16-bit.) oraz PIC32 (32-bit.). Znajdują się w niej kody źródłowe pozwalające na łatwą implementację różnych klas urządzeń.
Dołączone przykłady pokazują praktyczną realizację różnych typów urządzeń, jak m.in.: myszka komputerowa, klawiatura, przesyłanie danych w klasie HID, wirtualny port COM (CDC), czytnik kart SD, układ hosta dla przenośnych pamięci Flash. Bez wątpienia najłatwiej rozpocząć pracę, kupując zestaw ewaluacyjny oferowany przez Microchipa, przykładowy zestaw PICDEM FS USB pokazano na rysunku 1. Najprostszą metodą tworzenia własnych produktów na bazie mikrokontrolerów PIC jest modyfikacja dostępnych przykładów.
Do projektu należy dołączyć pliki zależnie od wybranej klasy urządzenia oraz pliki konfiguracyjne zawierające m.in. deskryptory. W czasie prowadzenia testów nie trzeba się przejmować numerami VID i PID oraz nazwą urządzenia wyświetlaną w systemie, niemniej po zakończeniu pracy należy zmienić przynajmniej te ustawienia. Warto wspomnieć, że producent dołączył również aplikacje dla systemu Windows, które umożliwiają sprawdzenie funkcjonowania poszczególnych przykładów w zakresie komunikacji z PC.
Dołączenie ich kodu źródłowego, napisanego w popularnym środowisku Visual Studio, na pewno ułatwi opracowywanie własnych rozwiązań. W ramach biblioteki MCHPFSUSB Framework dostępne są także bootloadery dla poszczególnych rodzin mikrokontrolerów PIC. Ich działanie jest typowe dla tego typu rozwiązań, po resecie układu sprawdzany jest jeden z portów i w zależności od obecnego tam stanu logicznego podejmowana jest decyzja o uruchomieniu bootloadera bądź aplikacji zapisanej w pamięci Flash.
Warto zauważyć, że w tym przypadku bootloader jest ładowany do początkowego obszaru pamięci programu. Zmniejsza to rozmiar kodu, który można tam zapisać. Razem z bootloaderem udostępniona została prosta aplikacja dla systemu Windows umożliwiająca wykonanie podstawowych operacji, takich jak programowanie, odczyt czy kasowanie pamięci. Stosowanie bootloadera sprawia, że normalna obsługa przerwań nie jest możliwa, gdyż zajmuje on obszar pamięci, w którym umieszczone są wektory przerwań.
Nie stanowi to jednak większego problemu, gdyż podmieniając plik linkera z oryginalnego, na odpowiednio zmodyfikowany (również dołączony do przykładów), można korzystać z przerwań, w zasadzie nie zauważając żadnej różnicy. Funkcjonalność bootloadera jest przydatna, gdy chce się zaoferować użytkownikom możliwość zdalnej aktualizacji oprogramowania. Jest to rozwiązanie nie zawsze dobre, gdyż konieczne jest udostępnienie kodu wynikowego, co ułatwia jego kradzież i w efekcie możliwość skopiowania urządzenia.
Dołączone kody źródłowe pozwalają jednak zaimplementować szyfrowanie, co powinno skutecznie rozwiązać problem, gdyż kod wynikowy bootloadera, w którym ukryty został klucz deszyfrujący, nie musi być już udostępniony. Bootloader w niektórych sytuacjach wydaje się jedynym sensownym wyjściem, np. podczas pisania oprogramowania dla mikrokontrolerów PIC18F13K50/14K50, w których port USB jest współdzielony z wyprowadzeniami interfejsu ICSP, co uniemożliwia jednoczesne podłączenie komputera oraz debuggera/programatora.
W takiej sytuacji pozostaje albo przełączanie przewodów w celu zaprogramowania układu, albo stosowanie bootloadera. Podobną politykę prowadzi Atmel oferujący zestaw startowy STK525 (rys. 2) wyposażony w podstawkę, w której można umieścić układy serii AT90USBxxx. Na stronie producenta można znaleźć noty aplikacyjne pokazujące, jak stworzyć urządzenia pracujące w jednej z klas urządzeń: HID (mysz, klawiatura), masowe urządzenia magazynujące czy CDC (wirtualny COM).
Udostępnione zostały także przykładowe kody źródłowe. Warto wspomnieć, że układy AT90USBxxx mają interfejs USB zgodny z OTG, co umożliwia im pracować także w roli hosta. Mikrokontrolery te są dostarczane z fabrycznie zaprogramowanym bootloaderem, co pozwala na przetestowanie ich możliwości bez konieczności inwestowania w narzędzia rozwojowe. Podobnie układy 32-bitowe z oferty Atmela wspierają USB w wersji OTG.
Oprócz typowych przykładów obsługi USB na stronie producenta umieszczono notę aplikacyjną i przykładowy kod przedstawiające realizację urządzenia pracującego w klasie audio, wykorzystującego tryb izochroniczny. Po zaprogramowaniu mikrokontrolera znajdującego się w zestawie EVK1105 i podłączeniu zestawu do komputera rozpocznie się automatycznie proces enumeracji, który sprawi, że system Windows wykryje urządzenie jako stereofoniczny zestaw słuchawkowy z mikrofonem i zastąpi nim domyślną kartę dźwiękową.
Dźwięk odtworzony w dowolnym programie będzie słyszalny po podłączeniu słuchawek do gniazda mini jack znajdującego się na płycie ewaluacyjnej. Znacznie bardziej spektakularną prezentacją możliwości USB w wersji OTG (i przy okazji mocy obliczeniowej 32-bitowych AVR-ów) jest zaprezentowany na stronie odtwarzacz MP3. Odczytuje on pliki zapisanyne na partycji FAT przenośnych pamięci (pendrive), dekoduje je w sposób programowy i przekazuje strumień cyfrowego dźwięku na wyjściowy przetwornik cyfrowo-analogowy.
Trzeba przyznać, że projekt ten, obsługujący przy okazji przyciski pojemnościowe, wyświetlacz graficzny i dekodowanie plików JPEG, jest wart uwagi. W ofercie Atmela dostępne są również mikrokontrolery z rdzeniem ‘51 zawierające zintegrowany kontroler USB. Rodzina energooszczędnych mikrokontrolerów MSP430 produkowanych przez Texas Instruments doczekała się nowej serii MSP430F55xx wyposażonej w port USB pracujący z pełną prędkością (full speed).
Według zapewnień TI układy te stanowią kompletne rozwiązanie dla aplikacji wymagającej komunikacji przez USB, bogatego zestawu peryferii analogowych oraz maksymalnej oszczędności energii. Na uwagę zasługuje wbudowana przetwornica, która obniża napięcie pobrane z portu do wartości 3,3V. Pozwala to zasilać mikrokontroler pracujący z napięciami w zakresie od 1,8V do 3,6V bezpośrednio przez USB bez dodatkowego stabilizatora. Stos USB opracowany przez producenta obsługuje trzy najpopularniejsze klasy urządzeń: HID, CDC oraz masowe urządzenia magazynujące (tabela 1).
Na szczególną uwagę zasługują ułatwienia przewidziane przez TI dla projektantów:
- licencjonowanie numerów PID w ramach numeru VID należącego do TI (podobnie jak Microchip),
- aplikacja komputerowa ułatwiająca przygotowanie deskryptorów dla klas urządzeń HID oraz CDC. Pozwala ona w sposób graficzny wybrać pożądane opcje i automatycznie wprowadzić modyfikacje do stosu USB (na rysunku 3 pokazano wygląd okna programu),
- specjalny bootloader BSL (bootstrap loader) umożliwia konwersję kodu wynikowego na aplikację - po podłączeniu mikrokontrolera do portu USB wystarczy ją uruchomić, aby zaktualizować oprogramowanie. Producent podaje jako przykładowe zastosowanie wszelkiego rodzaju układy medyczne, których oprogramowanie będzie można szybko i łatwo zaktualizować, aby usunąć zauważone błędy i/lub dodać nowe funkcje.
Na rynku dostępne są także układy z rdzeniem ARM Cortex-M3, których przedstawicielami jest rodzina STM32 firmy STMicroelectronics. Producent oferuje szeroką gamę produktów różniących się peryferiami, dostępną pamięcią, częstotliwością taktowania. Mikrokontrolery te mają również port USB w różnych wersjach (device / host / OTG). Producent udostępnia bibliotekę implementującą podstawowe klasy urządzeń oraz wspomnianą już klasę audio (przesyłanie dźwięku z systemu przez USB do urządzenia).
Na stronie producenta udostępniono noty aplikacyjne związane m.in. z implementacją USB we własnych rozwiązaniach czy obsługą bootloadera zapisywanego w układzie przez producenta. Istnieje więc możliwość programowania mikrokontrolera bez zakupu narzędzi rozwojowych. Dostępne są zestawy uruchomieniowe, m.in. STM3210C-EVAL, który pozwala przetestować np. działanie portu USB pracującego w klasie audio.
Prawdopodobnie najbardziej znanym zestawem ewaluacyjnym jest STM32 Butterfly ze względu na charakterystyczny kształt, intensywną kampanię reklamową oraz warsztaty STM32 Tech Days zorganizowane przez polski oddział STMicroelectronics, na których zestawy te były wykorzystywane i rozdawane. Również układy z rdzeniem ARM7- TDMI-S doczekały się układów zawierających USB.
Oferowane przez NXP mikrokontrolery mogą zawierać kontroler USB przeznaczony do pracy jedynie w roli układu peryferyjnego (LPC21xx) lub oferować pełny interfejs obejmujący rozwiązanie OTG (LPC23xx/LPC24xx. Podobnie jak w pozostałych przypadkach na stronie można znaleźć noty aplikacyjne i przykładowy kod, co powinno ułatwić wykorzystanie USB projektantom bazującym na rozwiązaniach NXP.