Hlavní navigace

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

Pavel Tišnovský

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?

30. 1. 2009 9:22

BLEK. (neregistrovaný)
Řadiče USB (UHCI, OHCI, EHCI) vypadají asi tak, že mají seznam front pro jednotlivé endpointy, a ke každé frontě seznam deskriptorů s pointery na data. Řadič to pak sám hardwarově prochází bez účasti procesoru --- cyklí přes seznam front a z každé fronty se snaží poslat jeden packet.

Na UHCI je třeba do front dávat rovnou packety o velikosti 64 bytů (t.j. driver ke každým 64 bytům dat musí vytvářet strukturu popisující packet). OHCI a EHCI jsou kvalitnější, tam stačí dát velký blok dat a řadič …

30. 1. 2009 9:20

dejfson (neregistrovaný)
uhmmmmmmmm .... uz je objednana ..... dekujeme
Vitalia.cz: 7 originálních adventních kalendářů pro mlsné

7 originálních adventních kalendářů pro mlsné

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

Měšec.cz: Za palivo zaplatíte mobilem (TEST)

Za palivo zaplatíte mobilem (TEST)

DigiZone.cz: SES zajistí HD pro M7 Group

SES zajistí HD pro M7 Group

120na80.cz: Rovnátka, která nejsou vidět

Rovnátka, která nejsou vidět

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Obchod budoucnosti je bez front, košíků i pokladen

Obchod budoucnosti je bez front, košíků i pokladen

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

DigiZone.cz: Sat novinky: slovenská TV8 HD i ruský NTV Mir

Sat novinky: slovenská TV8 HD i ruský NTV Mir

Podnikatel.cz: E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?