Přenos dat po universální sériové sběrnici

Pavel Tišnovský 29. 1. 2009

Dnes si v našem článku 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 (USB). Také si řekneme, jak lze zařízení převést do režimu spánku a posléze ho opět vzbudit.

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
pc4701

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‘
pc4702

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.

pc4703

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: KJKJKJKJKJKJK­JKJKJKJKJKJKJKJKJKK (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).

pc4704

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č.

pc4705

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/DA­TA2/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ř. inicia­lizač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:

pc4706

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.

pc4707

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.

pc4708

Obrázek 8: Funkce reset

9. Literatura a odkazy na Internetu

  1. USB in a Nutshell,
    http://www.be­yondlogic.org/us­bnutshell/usb2­.htm
  2. USB Chips, Links to USB Host and Device Controller Chips,
    http://www.lvr­.com/usbchips­.htm
  3. Jan Axelson: USB Complete. Everything You Need to Develop Custom USB Peripherals, Third Edition,
    http://www.lvr­.com/usbc.htm
  4. Jan Axelson: USB Mass Storage. Designing and Programming Devices and Embedded Hosts,
    http://www.lvr­.com/usbms.htm
  5. NRZ Encoding Definition,
    http://www.in­terfacebus.com/NRZ_De­finition.html
  6. Non-return-to-zero,
    http://en.wiki­pedia.org/wiki/Non-return-to-zero
  7. Universal Serial Bus – USB Interface,
    http://www.in­terfacebus.com/De­sign_Connector_US­B.html
  8. USB.ORG,
    http://www.us­b.org/
  9. Bit-banging,
    http://en.wiki­pedia.org/wiki/Bit-banging
  10. List of USB ID's,
    http://www.linux-usb.org/usb.ids
  11. EUSB to SPI bus Kit,
    http://www.ei­dusa.com/Elec­tronics_Kits_E­USB_To_SPI_BUS­.htm
  12. Basic USB Configuration,
    http://www.linux-usb.org/USB-guide/c122.html#A­EN124
  13. Linux-USB device overview,
    http://www.qbik­.ch/usb/devices/
  14. USBMan – USB 1, 2, & 3 Help and Information,
    http://www.us­bman.com/linu­xusb.htm
  15. ThinkGeek – Elekronics Gadgets,
    http://www.thin­kgeek.com/gad­gets/electronic/85b6/
  16. HID Information,
    http://www.us­b.org/developer­s/hidpage/
  17. Bit rate,
    http://en.wiki­pedia.org/wiki/Bit_ra­te
  18. USB 3.0 vs. FireWire 3200,
    http://www.pcfas­tlane.com/fea­tures/usb-30-vs-firewire-3200/
pc4709

Obrázek 9: Postupný vývoj přenosových rychlostí interních sběrnic, externí sběrnice USB a síťového rozhraní Ethernet.

Našli jste v článku chybu?
120na80.cz: Cestovní nevolnost. Co pomůže?

Cestovní nevolnost. Co pomůže?

120na80.cz: Cestovní lékárnička: na co nezapomenout

Cestovní lékárnička: na co nezapomenout

Lupa.cz: Sdílíte na Facebooku soukromé odkazy?

Sdílíte na Facebooku soukromé odkazy?

DigiZone.cz: VR i AR na vzestupu. Do roku 2018...

VR i AR na vzestupu. Do roku 2018...

120na80.cz: Léky a dietní opatření při kopřivce

Léky a dietní opatření při kopřivce

Měšec.cz: Inspirujte se: kam investují čeští dolaroví milionáři?

Inspirujte se: kam investují čeští dolaroví milionáři?

Měšec.cz: Ceny PHM v Evropě. Finty na úspory

Ceny PHM v Evropě. Finty na úspory

DigiZone.cz: Soud zakázal šíření TV Markíza v ČR

Soud zakázal šíření TV Markíza v ČR

Lupa.cz: Vydavatelé jsou v háji, ale neumí si to připustit

Vydavatelé jsou v háji, ale neumí si to připustit

DigiZone.cz: Pardubicko: Výrazně posílen Mux 3

Pardubicko: Výrazně posílen Mux 3

Lupa.cz: Jaké IoT tarify nabízejí mobilní operátoři?

Jaké IoT tarify nabízejí mobilní operátoři?

Podnikatel.cz: Babiš představil daňovou revoluci Moje daně

Babiš představil daňovou revoluci Moje daně

DigiZone.cz: HbbTV KinoSvět: už jede na dalších TV

HbbTV KinoSvět: už jede na dalších TV

DigiZone.cz: Dabingové ceny znají letošní nominace

Dabingové ceny znají letošní nominace

Vitalia.cz: Margit Slimáková nesnáší rajskou, Petr Fořt pizzu

Margit Slimáková nesnáší rajskou, Petr Fořt pizzu

Měšec.cz: Vyplatí se spořit přes DPS?

Vyplatí se spořit přes DPS?

Vitalia.cz: Tohle kafe má být hit léta

Tohle kafe má být hit léta

Lupa.cz: U Chomutova vyroste dotované datacentrum

U Chomutova vyroste dotované datacentrum

Podnikatel.cz: Výpadek internetu a #EET. Co s tím?

Výpadek internetu a #EET. Co s tím?

DigiZone.cz: Slováci první, Češi třetí. Krásný...

Slováci první, Češi třetí. Krásný...