Obsah
1. Komunikační protokol universální sériové sběrnice
2. Přenosové médium
3. Detekce rychlosti zařízení a impedanční ukončení přenosové linky
4. Logické úrovně a kódování přenášených bitů
5. Stavy a řízení sběrnice
6. Literatura a odkazy na Internetu
7. Obsah dalšího pokračování seriálu
1. Komunikační protokol universální sériové sběrnice
V předchozí části tohoto seriálu jsme si uvedli základní informace o universální sériové sběrnici (USB – Universal Serial Bus). Připomeňme si, že se jedná o externí sběrnici, po které se data přenáší sériově (poloduplexně), přičemž se používají dva signálové vodiče s využitím diferenčního kódování, podobně jako u sběrnice RS-422. Díky tomuto způsobu přenosu se – i za cenu zvýšení počtu vodičů v propojovacích kabelech – dosáhlo větší odolnosti vůči rušivým okolním vlivům (elektromagnetický šum). Na fyzické úrovni jsou jednotlivá komunikující zařízení propojena systémem point to point, tj. jeden kabel propojuje vždy pouze dva sousední uzly. Kromě jednoho řídicího uzlu nazývaného host controller a obecně většího počtu koncových zařízení je možné na sběrnici zapojit i rozbočovače (hubs) mající pouze jeden vstup a několik výstupů. Na úrovni logické se však jedná o skutečnou sběrnici, protože řídicí uzel může komunikovat s jakýmkoli připojeným zařízením, bez ohledu na to, v jakém místě stromové struktury se toto zařízení ve skutečnosti nachází.

Obrázek 1: 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.
Vzhledem k tomu, že existuje vždy jen jeden řídicí (kořenový) uzel a rozbočovače mají jeden vstup (vstupní a výstupní konektory jsou konstrukčně odlišné), je zajištěno, že se v topologické struktuře vzájemně propojených uzlů nevyskytují smyčky, což vede ke značnému zjednodušení komunikačního protokolu a také k možnosti připojovat a odpojovat periferní zařízení bez ovlivnění činnosti ostatních uzlů. Celkový počet zařízení připojitelných ke kořenovému uzlu dosahuje hodnoty 127, protože každému zařízení je přiřazena jedna sedmibitová adresa (27=128), přičemž jedna adresa z tohoto rozsahu je určena pro přenos speciálního tokenu do uzlu, kterému ještě adresa nebyla přidělena (viz navazující kapitoly). Také jsme si řekli, že zařízení, která jsou na tuto sběrnici připojena, mohou přenášet data několika standardizovanými rychlostmi. Původní norma označovaná jako USB 1.0 stanovovala dvě rychlosti: základní rychlost 1,5 MB za sekundu (12 Mb za sekundu), neboli Full Speed, a nízkou rychlost pro pomalá zařízení pracujíci na rychlosti 187,5 kB za sekundu (1,5 Mb za sekundu), jež se označuje termínem Low Speed. V roce 2001 byla v normě USB 2.0 stanovena ještě vyšší rychlost – High speed – při které lze teoreticky dosáhnout až hodnot 60 MB za sekundu (480 Mb za sekundu). Rychlost přenosu reálných informací je ve skutečnosti někdy i podstatně nižší, protože se kromě „užitečných“ dat musí přenášet i další informace – adresy, CRC, řídicí tokeny atd.
Obrázek 2: Porovnání doby latence a přenosové rychlosti vybraných v současnosti používaných interních a externích komunikačních rozhraní. Pro některé účely je nutné zvolit velmi rychlé rozhraní, další zařízení pak vyžadují spíše nízkou latenci (například z toho důvodu, že nemají zabudovanou vyrovnávací paměť s dostatečnou kapacitou). V neposlední řadě se také při výběru vhodného komunikačního prostředku musí vzít v úvahu celková cena zařízení, jeho spotřeba, jednoduchost připojení dalších uzlů (nevýhoda interních sběrnic) atd.
2. Přenosové médium
Pro propojení dvou komunikujících uzlů se používá kabel se čtyřmi vodiči, který má na první pohled poněkud neobvyklou strukturu, především při porovnání s kabely používanými u jiných typů sběrnic. Dva vodiče označené symboly VBUS (popř. UBUS) a GND slouží pro napájení připojených periferních zařízení, což umožňuje zjednodušenou konstrukci těchto zařízení (myši, klávesnice, čtečky paměťových karet, flash disky atd.). Další dva vodiče, které se označují symboly D+ a D-, jsou určeny pro sériový poloduplexní přenos dat s využitím diferenčního kódování, díky čemuž se dosáhlo vyšší necitlivosti na okolní elektrostatická pole i možnosti prodloužení přenosové linky. Oba dva signálové vodiče jsou tvořeny kroucenou dvojlinkou, jejíž impedance by měla dosahovat hodnoty přibližně 90 Ω (odchylka od této hodnoty může být maximálně patnáctiprocentní). Povšimněte si, že u této sběrnice není vyvedený samostatný hodinový signál. Není to nutné, protože díky použitému způsobu kódování bitů metodou NRZI s vkládanými bity (bit shuffling) se přijímací zařízení může s každým přeneseným bajtem znovu zasynchronizovat (je zaručeno, že v jednom bajtu vždy dojde ke změně datového signálu).

Obrázek 3: Struktura propojovacího kabelu používaného na USB. Zatímco napájecí vodiče jsou vedeny přímo, vodiče datové (D+ a D-) tvoří kroucenou dvojlinku.
3. Detekce rychlosti zařízení a impedanční ukončení přenosové linky
V první kapitole jsme si řekli, že konektory umístěné na obou koncích propojovacích kabelů (a samozřejmě také jejich protějšky zabudované do zařízení) jsou konstrukčně odlišné, mj. i proto, aby byla zaručena stromová topologie vzájemně propojených uzlů. I elektrické vlastnosti konektorů umístěných v samotných uzlech jsou odlišné. Na straně konektoru typu A (jedná se buď o host controller, tj. samotný počítač nebo výstupní konektor rozbočovače) je na každou datovou linku, tj. jak D+, tak i D-, připojen rezistor o hodnotě 15 kΩ jehož druhý konec je uzemněný. To znamená, že pokud není na tento konektor zapojeno žádné další zařízení, jsou na obou signálových vodičích nízké úrovně L. Tento stav se označuje zkratkou SE0, neboli Single Ended Zero. Vzhledem k tomu, že je tento stav snadno a za všech okolností detekovatelný (v přenášených datech se nemůže nikdy objevit), používá se pro mnoho účelů, například pro poslání příkazu reset, ukončení paketu atd.

Obrázek 4: Rezistory uzemňující datové vodiče na straně řadiče sběrnice a rezistor, který naopak zvyšuje klidovou úroveň na vodiči D- u zařízení, které dokáže pracovat nízkou rychlostí (Low Speed).
Naproti tomu na straně USB zařízení (či na vstupu rozbočovače) je na jedné datové lince umístěn pull-up rezistor o odporu 1,5 kΩ připojený na napájecí napětí 3,3 V. Pokud se tedy zařízení připojí k host controlleru, vytvoří se napěťový dělič 1,5 kΩ-15 kΩ a napětí na tomto signálovém vodiči se zvýší na logickou úroveň H – cca tři volty. Podle toho, na který signálový vodič je tento pull-up rezistor umístěn, je určena přenosová rychlost zařízení. Pokud je „zvednuta“ logická úroveň vodiče D+, jedná se o zařízení zvládající normální rychlost (Full Speed), pokud je naopak zvednuta úroveň druhého vodiče D-, jde „pouze“ o zařízení pracující nízkou rychlostí (Low Speed – většinou na této rychlosti pracují HID zařízení typu klávesnice, joystick či myš).

Obrázek 5: Rezistory uzemňující datové vodiče na straně řadiče sběrnice a rezistor, který naopak zvyšuje klidovou úroveň na vodiči D+ u zařízení, které dokáže pracovat normální rychlostí (Full Speed).
Zařízení pracující v režimu vysoké rychlosti (High Speed) jsou zapojena stejně jako zařízení pracující v režimu rychlosti normální, tj. obsahují pull-up rezistor o hodnotě 1,5 kΩ zapojený mezi napájecí napětí 3,3 V a linku D+. Během resetu se zařízení identifikuje jako High Speed zařízení a pokud i druhá strana komunikace podporuje režim High Speed, je pull-up rezistor odpojen (přes tranzistor), protože obě linky musí být kvůli diferenčnímu kódování vyváženy. Naopak se v režimu vysoké rychlosti aktivuje rezistor o hodnotě 90 Ω zapojený mezi oběma datovými vodiči, který zajišťuje útlum odrazů (stejnou impedanci má, jak již víme, i kroucená dvojlinka). Jedna z příčin, proč nějaké zařízení nepracuje korektně například při jeho připojení do levnějších rozbočovačů, může spočívat právě v tom, že není korektně odpojen pull-up rezistor po přechodu do režimu vysoké rychlosti nebo naopak není připojen terminátor – rezistor zapojený mezi datové vodiče.

Obrázek 6: Rozdíl mezi konektorem typu A, konektorem typu B a USB Mini.
4. Logické úrovně a kódování přenášených bitů
Pro zařízení pracující v režimu nízké rychlosti i rychlosti normální se používají shodné napěťové úrovně na signálových vodičích. 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 (zde si můžeme ověřit, že výše popsaný napěťový dělič je skutečně navržen korektně, protože po připojení k napájecímu napětí se skutečně dostáváme do rozsahu stanoveného pro logickou úroveň H). Pro režim vysoké rychlosti 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 popsané dále. V následujícím odstavci budeme mluvit o stavech J a K, nikoli o úrovních H a L. Je tomu tak proto, že při použití nízké přenosové rychlosti je použita opačná polarita, než v případě, že komunikace probíhá rychlostí plnou. Rozdíly si ukážeme v tabulce vypsané v následující kapitole.

Obrázek 7: Kódování NRZ (není použito u USB, zde je jen pro ilustraci). Bit s logickou hodnotou nula je zakódován jako nízká úroveň na datovém vodiči, zatímco bit s logickou hodnotou jedna je zakódován jako úroveň vysoká. Jedná se o jeden z nejjednodušších způsobů přenosu binární informace.
Data jsou přenášena pomocí změny stavu datových linek. Rozeznávají se přitom dva stavy – J a K. Samotný proud bitů je zakódován (inverzní) metodou NRZI, jejíž princip je velmi jednoduchý – bit s 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.

Obrázek 8: Původní (neinverzní) kódování NRZI. Bit s hodnotou nula znamená, že se stav linky nezmění, naopak bit s hodnotou jedna je přenesen jako změna stavu linky. U sběrnice USB je použita inverzní varianta NRZI, při které se úloha logické hodnoty bitů otáčí.
5. Stavy a řízení sběrnice
Vzhledem k tomu, že na universální sériové sběrnici se data přenáší po dvojici vodičů, je možné v jeden okamžik binárně zakódovat vždy jeden ze čtyř stavů. Tyto stavy jsou vypsány v následující tabulce, přičemž v dalším textu se na jména těchto stavů budeme odkazovat:
Stav sběrnice | Úroveň na vodiči D+ | Úroveň na vodiči D- | Poznámka |
Differential ‚1‘ | H | L | |
Differential ‚0‘ | L | H | |
Single Ended Zero (SE0) | L | L | konec paketu, reset atd. |
Single Ended One (SE1) | H | H | nepovoleno |

Obrázek 9: Měření napětí na obou datových vodičích D+ a D-. Ze snímku získaného několikerým měřením přenosu jednoho bitu osciloskopem (jsou tedy zobrazeny všechny čtyři možné varianty) je patrné, že napěťové úrovně na vodiči D+ a D- jsou po ustálení vždy opačné (nízká vs vysoká úroveň). Červený objekt uprostřed označuje oblast ustálení dat; v této době již nesmí dojít k tomu, že by napěťové úrovně na některém datovém vodiči překročily normou stanovený rozsah napětí pro úroveň L a H. Zelený průběh označuje napětí na vodiči D-, modrý průběh pak napětí na vodiči D+.
Stavy J a K, které jsou použité, jak jsme si již řekli v předchozí kapitole, 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‘ |
V níže zobrazené tabulce jsou navíc uvedeny i další povolené stavy či příkazy, které si podrobněji popíšeme v následující části tohoto seriálu:
Název stavu/příkazu | Průběh signálu na vodičích D- a D+ |
Idle na Low-speed | D- na úrovni H, D+ na úrovni L |
Idle na Full-speed | D+ na úrovni H, D- na úrovni L |
Resume State | stav K |
Start of Packet (SOP) | změna datových linek ze stavu Idle na stav K |
End of Packet (EOP) | stav SE0 po dobu trvání dvou bitů následovaný stavem J po dobu trvání jednoho bitu |
Disconnect | stav SE0 po dobu delší než 2µs |
Connect | stav Idle po dobu delší než 2,5µs |
Reset | stav SE0 po dobu delší než 2,5µs |

Obrázek 10: Přenos jednoho paketu zobrazený na osciloskopu. Dole je uvedeno i označení jednotlivých stavů. Všimněte si, že při přenosu jsou napětí na D+ a D- vždy opačná (nízká versus vysoká úroveň), ale na konci paketu je dosaženo již výše zmíněného stavu SE0, ve kterém jsou obě napětí stažena na nízkou úroveň nula. Tento stav označuje konec přenosu paketu.
6. 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/
7. Obsah dalšího pokračování seriálu
V následující části seriálu o architekturách počítačů si podrobně popíšeme jednotlivé typy paketů, které jsou použity pro řízení přenosu dat i pro vlastní přenos užitečných informací mezi jednotlivými uzly připojenými k universální sériové sběrnici. Také si řekneme, jakým způsobem je možné některé zařízení uspat či ho naopak probudit z režimu spánku.

Obrázek 11: Velmi zajímavý rozbočovač, který od sebe elektricky izoluje jednotlivé uzly, protože používá optické členy (LED + fototranzistor). Podobné rozbočovače se využívají především v průmyslu, aby se zabránilo zničení zařízení příliš vysokým indukovaným napětím. Pokud by bylo rušení příliš velké, lze použít přímo optických kabelů.