Obsah
1. Napěťové úrovně L a H, stavy sběrnice a kódování přenášených bitů
2. Způsob přenosu dat
3. Začátek a konec paketu
4. Token paket
5. Datové pakety
6. SOF (Start of Frame) paket
7. Handshake pakety
8. Funkce suspend, resume a reset
9. Literatura a odkazy na Internetu
1. Napěťové úrovně L a H, stavy sběrnice a kódování přenášených bitů
Před popisem způsobu přenosu řídicích i datových paketů používaných na universální sériové sběrnici (USB) si připomeňme některé charakteristické vlastnosti přenosu dat po kroucené dvojlince, kterou jsou propojeny vždy dvě zařízení (uzly) připojená na jeden segment USB. Pro zařízení pracující v režimu nízké rychlosti (Low Speed) i rychlosti normální (Full Speed) se používají shodné napěťové úrovně na signálových vodičích označovaných symboly D+ a D-. Pro nízkou logickou úroveň L je stanoven rozsah 0,0 až 0,3 V, pro vysokou logickou úroveň H pak rozsah 2,8 až 3,6 V. V režimu vysoké rychlosti (High Speed) jsou však napěťové úrovně zcela odlišné: –10mV až 10mV pro logickou úroveň L a 360–440 mV pro logickou úroveň H. Ovšem zmíněné úrovně H a L nereprezentují přímo přenášené bity, protože je použito poněkud upravené kódování NRZI (viz další odstavec). Data jsou přenášena pomocí změny stavu datových linek. Rozeznávají se přitom dvě výše uvedená základní napětí vodičů – H a L. To znamená, že na dvou datových (signálových) vodičích je možné binárně zakódovat vždy jeden ze čtyř stavů. Tři z těchto stavů jsou povoleny (mohou se v průběhu komunikace na datových vodičích vyskytnout), čtvrtý stav je za obvyklých podmínek zakázaný. Stav sběrnice, při níž jsou logické úrovně na signálových vodičích opačné, se označuje písmeny J nebo K, v závislosti na polaritě napětí měřeného mezi signálovými vodiči a zvolenou přenosovou rychlostí.
Stav sběrnice | Úroveň na vodiči D+ | Úroveň na vodiči D- | Poznámka |
Differential ‚1‘ | H | L | představuje buď J či K podle zvolené rychlosti |
Differential ‚0‘ | L | H | představuje buď J či K podle zvolené rychlosti |
Single Ended Zero (SE0) | L | L | konec paketu, reset atd. |
Single Ended One (SE1) | H | H | nepovoleno |
Obrázek 1: Kit umožňující připojení mikrořadičů Atmel k universální sériové sběrnici.
Samotný proud bitů je zakódován (inverzní) metodou NRZI, jejíž princip je velmi jednoduchý – bit s binární hodnotou nula je reprezentován jako změna stavu mezi J a K či naopak jako změna stavu mezi K a J, zatímco bit s logickou hodnotou jedna znamená, že se stav přenosové linky nezmění, tj. linka zůstane v původním stavu (buď J nebo K). To však není všechno. Kvůli tomu, aby byla zaručena synchronizace přenášených dat, je v případě, že se v bitovém proudu vyskytne za sebou šest jedniček (tj. šestkrát za sebou by se stav linky nezměnil), navíc vložen bit s hodnotou nula, což znamená, že se „vynutí“ změna stavu na lince, čehož mohou obě komunikující strany využít k vzájemné synchronizaci hodin (přijímač se zasynchronizuje podle vysílače). Pokud by se na přenosové lince vyskytlo sedm za sebou jdoucích bitů s logickou hodnotou jedna, je to považováno za chybu. Napěťové úrovně přiřazené stavům J a K, které jsou použité pro přenos zakódovaného proudu bitů, se liší podle toho, jakou rychlostí se data přenáší:
Stav | Režim Low speed | Režim Full speed |
J | Differential ‚0‘ | Differential ‚1‘ |
K | Differential ‚1‘ | Differential ‚0‘ |
Obrázek 2: LCD displej ovládaný přes sběrnici USB pomocí mikrořadiče Atmel.
2. Způsob přenosu dat
Vzhledem k tomu, že universální sériová sběrnice je na fyzické úrovni tvořena uzly, které jsou navzájem propojeny tak, že tvoří stromovou strukturu s jedním kořenovým uzlem (nazývaným host), je řízení přenosu dat centralizováno právě do kořenového uzlu – tento uzel postupně adresuje ostatní připojená zařízení a iniciuje přenosy dat. Předností tohoto způsobu řízení je značná jednoduchost, protože není zapotřebí zavádět složitou arbitráž sběrnice, souběžně běžící přenosy mezi několika uzly apod. Nevýhodou je nedostatečné využití přenosového pásma a také nutnost aktivního zjišťování stavu všech připojených zařízení, protože neexistuje možnost, jak by zařízení (kromě kořenového uzlu) samo o sobě mohlo požádat o předání sběrnice. Pro některé účely tedy není použití USB vhodné – například tam, kde se vyžadují rychlé reakce v zaručeném časovém intervalu. Nyní si řekněme základní princip přenosu dat. Vzhledem k tomu, že kromě dvou datových vodičů a dvou vodičů napájecích USB neobsahuje žádné další signálové vodiče, musí být řízení přenosu realizováno na vyšší úrovni. Kromě vlastních „užitečných“ dat jsou přenášeny i příkazy, kterými host řídí připojená zařízení a ty mu naopak posílají informaci o stavu přenosu dat, připravenosti pro příjem či vysílání dat atd.
Obrázek 3: Zapojení LCD displeje na USB je s pomocí mikrořadiče Atmel velmi jednoduché. Ve schématu je navíc i IR přijímač, data jsou dekódována programově (ostatně i USB protokol je naprogramovaný).
3. Začátek a konec paketu
V předchozím textu jsme si řekli, že sběrnice je řízena vždy z kořenového uzlu. Tento uzel na zařízení, se kterým potřebuje komunikovat, pošle takzvaný token paket s příkazem, za ním typicky následuje datový paket (přenášený buď ze zařízení do kořenového uzlu či naopak) a komunikace je ukončena handshake paketem, ve kterém je potvrzen přenos dat nebo je naopak indikována nějaká chyba. Pokud je na sběrnici zapojen i rozbočovač (hub), je jeho povinností pakety směrovat do požadovaného uzlu v závislosti na přenášené adrese zařízení (viz další kapitoly). Každý paket začíná synchronizačním bajtem, který má bitovou hodnotu 00000001. Vzhledem k tomu, že klidový stav sběrnice (datových vodičů) odpovídá stavu J a bitová nula se přenáší jako změna stavu J→K či K→J, vypadá přenos synchronizačního bajtu následovně: KJKJKJKK. Poslední dvojice stavů KK značí konec synchronizačního bajtu a začátek paketu. Paket může mít podle svého typu různou délku (na rozdíl od Ethernetových rámců), počet bitů je však vždy zarovnán na celé bajty. U zařízení pracujících vysokou rychlostí je synchronizační sekvence prodloužena – místo osmi bitů se přenáší celých 32 bitů, přičemž pouze poslední bit je jedničkový; tj. na sběrnici se vyskytnou následující stavy: KJKJKJKJKJKJKJKJKJKJKJKJKJKJKJKK (ve skutečnosti na délce synchronizační sekvence příliš nezáleží, zařízení začne přijímat data až tehdy, když zjistí dvojici za sebou jdoucích stavů KK).
Obrázek 4: Stromová topologie universální sériové sběrnice. V celém segmentu sběrnice USB existuje pouze jeden řídicí uzel (host), který je většinou představován samotným počítačem (přesněji řečeno řadičem USB umístěným na základní desce nebo přídavné kartě). K tomuto uzlu se připojují buď přímo koncová zařízení pracující různou rychlostí nebo rozbočovače (hubs). Maximální počet připojených zařízení může dosáhnout hodnoty 127 (adresa zařízení má rozsah sedmi bitů, jedna adresa je rezervovaná), počet úrovní je omezen na pět.
Přenos celého paketu je ukončen sekvencí nazvanou EOP (End of Packet). Nejprve se na dobu přenosu dvou bitů nastaví stav SE0 (Single Ended Zero – viz předchozí kapitola), po němž následuje přechod do stavu J na dobu minimálně jednoho bitu. V tomto stavu může daný segment sběrnice setrvat po libovolně dlouhou dobu; jedná se o režim idle. V předchozí části tohoto seriálu jsme si řekli, jakým způsobem jsou nastaveny napěťové úrovně na obou signálových vodičích ihned po připojení nějakého zařízení – pomocí pull-up a pull-down rezistorů je vždy jeden signálový vodič nastaven na vysokou úroveň a druhý vodič na úroveň nízkou. Jedná se o stejné úrovně, jaké jsou použité v režimu idle, což znamená, že pro udržení tohoto režimu není zapotřebí žádná řídicí logika – vše obstarají pull-up a pull-down rezistory tvořící na jednom signálovém vodiči napěťový dělič.
Obrázek 5: Konec paketu (EOP) a přechod do režimu idle.
4. Token paket
Prvním typem paketu, který kořenový uzel posílá do zvoleného zařízení, je takzvaný token paket. Tímto paketem kořenový uzel zvolené zařízení adresuje, specifikuje i jeho koncový bod (jedná se o logickou adresu v rámci zvoleného zařízení – použito u těch zařízení, které mají více funkcí, například se jedná o čtečky více typů paměťových karet) a mj. určuje, zda se data budou přenášet od kořenového uzlu do zařízení či naopak. Token paket má vždy délku 24 bitů (bez započítání synchronizačního bajtu) s následující strukturou:
Označení | Počet bitů | Význam |
---|---|---|
Sync | 8/32 | synchronizační sekvence |
PID | 8 | identifikace typu paketu |
ADDR | 7 | adresa zařízení 1–127 |
ENDP | 4 | koncový bod v rámci zvoleného zařízení |
CRC5 | 5 | kontrolní součet |
EOP | konec paketu |
PID, neboli identifikace typu paketu, je čtyřbitové číslo, které je v osmi bitech zapsáno dvakrát – jednou v přímé podobě, podruhé inverzně. Díky tomu je umožněna detekce chyby při přenosu a také to, že je PID vždy přenesen bez nutnosti vkládání dodatečného bitu (ten je do sekvence přenášených bitů vložen tehdy, když za sebou následuje sedm jedniček, důvod byl uveden v úvodních kapitolách). Význam jednotlivých kódů PID je vypsán v tabulce níže. Adresa zařízení má délku sedmi bitů, z čehož vyplývá, že je možné adresovat až 127 zařízení připojených na jeden segment USB. Adresa s hodnotou 0 je rezervována pro ta zařízení, kterým ještě nebyla adresa přidělena. V jednom zařízení se může nacházet až šestnáct koncových bodů (endpoint), které jsou adresovány čtyřmi bity. To znamená, že přenos dat není na logické úrovni prováděn mezi uzly (fyzickými zařízeními), ale mezi koncovými body. Z tohoto hlediska se může například již zmíněná čtečka paměťových karet v systému chovat jako několik zařízení typu mass-storage (několik logických disků). Za číslem koncového bodu následuje pětibitový kontrolní součet CRC5 a konec paketu. Povolené PID v token paketu:
PID | Bitová hodnota | Význam |
---|---|---|
OUT | 0001 | přenos dat z kořenového uzlu do zařízení (zápis) |
IN | 1001 | přenos dat ze zařízení do kořenového uzlu (čtení) |
SETUP | 1101 | inicializace zařízení (speciální datový paket o délce osmi bytů) |
5. Datové pakety
Po vyslání výše popsaného token paketu může následovat datový paket, který je přenášen buď z adresovaného zařízení do kořenového uzlu či naopak. Pakety z této skupiny mají podobnou strukturu jako token paket: začínají synchronizačním bajtem následovaným identifikátorem paketu. Poté jsou přenesena data, za nimiž je uložen kontrolní součet (nyní šestnáctibitový, ne pouze pětibitový) a konečně EOP:
Označení | Počet bitů | Význam |
---|---|---|
Sync | 8/32 | synchronizační sekvence |
PID | 8 | identifikace typu paketu |
DATA0/DATA1/DATA2/MDATA | max. 8192 | přenášená data |
CRC16 | 16 | kontrolní součet |
EOP | konec paketu |
Datové pakety typu DATA0 a DATA1 se používají pro zařízení pracujících pomalou i normální rychlostí (délka datového bloku je v režimu normální rychlosti 0–1023 bajtů, v režimu rychlosti pomalé však pouze osm bajtů! – v tomto případě je přenosová kapacita sběrnice využita velmi neefektivně), ve standardu USB 2.0 pak přibyly typy DATA2 a MDATA, které umožňují přenášet data rozdělená do bloků o velikosti až jeden kilobajt. Při přenosu většího množství dat do či z jednoho uzlu se musí střídat pakety typu DATA0 a DATA1. Střídání těchto paketů je totiž součástí přenosového protokolu – nejprve jsou přenesena data, která by měla být potvrzena handshake paketem typu ACK. Pokud však vysílací uzel tento paket nepřijme, může to znamenat, že se buď data vůbec nepřenesla, nebo se ztratil samotný potvrzovací paket. Proto si přijímací zařízení pamatuje, který typ datového paketu byl přenesen a v případě, že se začíná vysílat paket stejného typu, je sice přečten, ale ignorován (jedná se totiž s velkou pravděpodobností o situaci, kdy přijímač z různých příčin nedostal handshake paket ACK a proto data vyslal znovu). Následuje výpis identifikačních kódů jednotlivých typů datových paketů:
PID | Bitová hodnota | Význam |
---|---|---|
DATA0 | 0011 | data o délce 0–1023 bytů (pro low speed 8 bytů) |
DATA1 | 1011 | data o délce 0–1023 bytů (pro low speed 8 bytů) |
DATA2 | 0111 | použito pro vysokorychlostní přenosy |
MDATA | 1111 | použito pro vysokorychlostní přenosy |
6. SOF (Start of Frame) paket
Paket typu SOF (Start of Frame) je používán pro synchronizaci při izochronním přenosu dat. Formát tohoto paketu je (opět) odvozen od token paketu, ovšem s tím rozdílem, že místo adresy zařízení a čísla koncového bodu je přenášena jedenáctibitová hodnota počitadla. Tento paket by měl být na zařízení vyslán každou milisekundu, tj. pro zařízení pracující plnou rychlostí po uplynutí doby odpovídající přenosu 12000 bitů. Hodnota počitadla se postupně zvyšuje s tím, že po překročení maximální hodnoty (211-1=2047) se začíná s čítáním od nuly. Formát tohoto paketu je následující:
Označení | Počet bitů | Význam |
---|---|---|
Sync | 8/32 | synchronizační sekvence |
PID | 8 | identifikace typu paketu |
frame# | 11 | aktuální hodnota počitadla |
CRC5 | 5 | kontrolní součet |
EOP | konec paketu |
PID | Bitová hodnota | Význam |
---|---|---|
SOF | 0101 | PID paketu typu Start of Frame |
7. Handshake pakety
Pomocí této skupiny paketů oznamuje zařízení svůj stav kořenovému uzlu, popř. je možná i opačná varianta, podle směru přenosu dat. Jedná se o paket, který je vybraným zařízením poslaný ihned po příjmu datového paketu (popř. inicializačního paketu) nebo naopak po pokusu o odvysílání datového paketu do kořenového uzlu. Formát je velmi jednoduchý:
Označení | Počet bitů | Význam |
---|---|---|
Sync | 8/32 | synchronizační sekvence |
PID | 8 | identifikace typu paketu |
EOP | konec paketu |
Mezi dva základní stavy přenosu patří ACK (acknowledged – potvrzení vysílání/příjmu) a NAK (not acknowledged – vysílání/příjem se nezdařil, nejde však o trvalou chybu). Pokud zařízení zjistí trvalou chybu, vrátí stav STALL. Při přenosu blokových dat v takzvaných rozdělených transakcích se používají stavy NYET (not responsible yet) a ERR (rozdělené transakce jsou podporovány až ve standardu USB 2.0). Význam jednotlivých potvrzovacích kódů a jim přidělených identifikátorů paketů:
PID | Bitová hodnota | Význam |
---|---|---|
ACK | 0010 | datový paket byl v pořádku přečten |
NAK | 1010 | zařízení nemohlo data přijmout či odvysílat |
STALL | 1110 | zařízení je ve stavu trvalé chyby, čeká se na reset od kořenového uzlu |
NYET | 0110 | USB 2.0 – rozdělená transakce (více bloků dat) nebyla ještě dokončena |
ERR | 1100 | rozdělená transakce (více bloků dat) nebyla dokončena z důvodu chyby |
8. Funkce suspend, resume a reset
Zařízení může být kořenovým uzlem přepnuto do režimu idle, který je po určité době nahrazen režimem suspend. Přechod do tohoto režimu je zobrazen na šestém obrázku. Po přenosu posledního paketu (s jeho korektním ukončením) zařízení přechází do režimu idle, ve kterém očekává příjem dalších paketů (vysílání, jak jsme si již řekli, nemůže samo zařízení iniciovat). Pokud režim idle trvá alespoň 3ms, přechází se do režimu suspend:
Obrázek 6: Přechod do režimu suspend
Z režimu suspend se může zařízení „probudit“ posloupností signálů zobrazených na sedmém obrázku. Nejprve dojde ke změně napěťových úrovní na obou signálových vodičích, které by mělo zůstat zachováno po dobu alespoň 20 ms. Poté řídicí uzel (host nebo rozbočovač) po dobu trvání přenosu dvou bitů nastaví stav SE0, který je následně změněn na stav J. V této chvíli je zařízení připraveno přijmout synchronizační sekvenci a řídicí či datový paket.
Obrázek 7: Funkce resume
Reset zařízení (přesněji řečeno pouze reset jeho komunikační části) se provádí posloupností signálů zobrazených na osmém obrázku. Pokud se zařízení nachází v režimu idle, postačuje, aby po dobu alespoň deseti milisekund byl nastavený stav SE0. Poté dojde k resetu komunikační části zařízení. Po uplynutí dalších několika milisekund lze začít s přenosem synchronizační sekvence a řídicího či datového paketu.
Obrázek 8: Funkce reset
9. Literatura a odkazy na Internetu
- USB in a Nutshell,
http://www.beyondlogic.org/usbnutshell/usb2.htm - USB Chips, Links to USB Host and Device Controller Chips,
http://www.lvr.com/usbchips.htm - Jan Axelson: USB Complete. Everything You Need to Develop Custom USB Peripherals, Third Edition,
http://www.lvr.com/usbc.htm - Jan Axelson: USB Mass Storage. Designing and Programming Devices and Embedded Hosts,
http://www.lvr.com/usbms.htm - NRZ Encoding Definition,
http://www.interfacebus.com/NRZ_Definition.html - Non-return-to-zero,
http://en.wikipedia.org/wiki/Non-return-to-zero - Universal Serial Bus – USB Interface,
http://www.interfacebus.com/Design_Connector_USB.html - USB.ORG,
http://www.usb.org/ - Bit-banging,
http://en.wikipedia.org/wiki/Bit-banging - List of USB ID's,
http://www.linux-usb.org/usb.ids - EUSB to SPI bus Kit,
http://www.eidusa.com/Electronics_Kits_EUSB_To_SPI_BUS.htm - Basic USB Configuration,
http://www.linux-usb.org/USB-guide/c122.html#AEN124 - Linux-USB device overview,
http://www.qbik.ch/usb/devices/ - USBMan – USB 1, 2, & 3 Help and Information,
http://www.usbman.com/linuxusb.htm - ThinkGeek – Elekronics Gadgets,
http://www.thinkgeek.com/gadgets/electronic/85b6/ - HID Information,
http://www.usb.org/developers/hidpage/ - Bit rate,
http://en.wikipedia.org/wiki/Bit_rate - USB 3.0 vs. FireWire 3200,
http://www.pcfastlane.com/features/usb-30-vs-firewire-3200/
Obrázek 9: Postupný vývoj přenosových rychlostí interních sběrnic, externí sběrnice USB a síťového rozhraní Ethernet.