Protocol USB 2.0. Protocol magistrală USB. Specificații USB

La sfârşitul anului 2008. După cum vă puteți aștepta, noul standard a crescut debitul, deși creșterea nu este la fel de semnificativă ca creșterea de 40 ori a vitezei atunci când treceți de la USB 1.1 la USB 2.0. În orice caz, o creștere de 10 ori a debitului este binevenită. USB 3.0 suporturi viteza maxima de transfer de 5 Gbit/s. Debitul este aproape de două ori mai mare decât standardul modern Serial ATA (3 Gbit/s, ținând cont de transferul de informații redundante).

Sigla USB 3.0

Fiecare entuziast va confirma că interfața USB 2.0 este principalul blocaj al computerelor și laptopurilor moderne, deoarece debitul său „net” de vârf este cuprins între 30 și 35 MB/s. Dar hard disk-urile moderne de 3.5″ pentru PC-uri desktop au deja viteze de transfer care depășesc 100 MB/s (apar și modele de 2.5″ pentru laptopuri care se apropie de acest nivel). Unitățile SSD de mare viteză au depășit cu succes pragul de 200 MB/s. Și 5 Gbit/s (sau 5120 Mbit/s) corespunde la 640 MB/s.

Nu credem că hard disk-urile se vor apropia de 600 MB/s în viitorul apropiat, dar următoarea generație de SSD-uri ar putea depăși acest număr în doar câțiva ani. Creșterea debitului devine din ce în ce mai importantă pe măsură ce cantitatea de informații crește și timpul necesar pentru a le face backup crește în consecință. Cu cât stocarea funcționează mai rapid, cu atât timpul de rezervă va fi mai scurt, cu atât va fi mai ușor să creați „ferestre” în programul de backup.

Tabel de comparație a vitezei USB 1.0 – 3.0

Camerele video digitale de astăzi pot înregistra și stoca gigaocteți de date video. Ponderea camerelor video HD este în creștere și necesită stocare mai mare și mai rapidă pentru a înregistra cantități mari de date. Dacă utilizați USB 2.0, transferul mai multor zeci de gigaocteți de date video pe un computer pentru editare va dura considerabil. USB Implementers Forum consideră că lățimea de bandă va rămâne fundamental importantă și USB 3.0 va fi suficient pentru toate dispozitivele de consum în următorii cinci ani.

Codare pe 8/10 biți

Pentru a asigura un transfer de date fiabil Interfață USB 3.0 folosește codare pe 8/10 biți, cunoscută nouă, de exemplu, de la Serial ATA. Un octet (8 biți) este transmis utilizând codificarea pe 10 biți, ceea ce îmbunătățește fiabilitatea transmisiei în detrimentul debitului. Prin urmare, trecerea de la biți la octeți se realizează cu un raport de 10:1 în loc de 8:1.

Comparație între lățimea de bandă USB 1.x – 3.0 și concurenții

Moduri de economisire a energiei

Cu siguranță, scopul principal interfata USB 3.0 este de a mări lățimea de bandă disponibilă, cu toate acestea, noul standard în mod eficient optimizează consumul de energie. Interfața USB 2.0 verifică în mod constant disponibilitatea dispozitivului, ceea ce consumă energie. În schimb, USB 3.0 are patru stări de conectare, numite U0-U3. Starea de conexiune U0 corespunde transferului de date activ, iar U3 pune dispozitivul în „repaus”.

Dacă conexiunea este inactivă, atunci în starea U1 capacitatea de a primi și transmite date va fi dezactivată. Starea U2 face un pas mai departe prin dezactivarea ceasului intern. În consecință, dispozitivele conectate pot trece la starea U1 imediat după finalizarea transferului de date, ceea ce este de așteptat să ofere avantaje semnificative în ceea ce privește consumul de energie în comparație cu USB 2.0.

Curent mai mare

Pe lângă diferitele stări de consum de energie, standardul USB 3.0 este diferit de la USB 2.0 și curent suportat mai mare. Dacă USB 2.0 a furnizat un prag de curent de 500 mA, atunci în cazul noului standard limitarea a fost mutată la 900 mA. Curentul de inițiere a conexiunii a fost crescut de la 100 mA pentru USB 2.0 la 150 mA pentru USB 3.0. Ambii parametri sunt destul de importanți pentru hard disk-urile portabile, care necesită de obicei curenți puțin mai mari. Anterior, problema putea fi rezolvată prin utilizarea unei mufe USB suplimentare, care atrage puterea de la două porturi, dar folosind doar unul pentru transferul de date, chiar dacă acest lucru a încălcat specificațiile USB 2.0.

Cabluri noi, conectori, codare culori

Standardul USB 3.0 este compatibil cu USB 2.0, adică mufele par a fi aceleași ca mufele obișnuite de tip A. Pinii USB 2.0 rămân în același loc, dar acum există cinci pini noi localizați adânc în conector. Aceasta înseamnă că trebuie să introduceți mufa USB 3.0 până la capăt în portul USB 3.0 pentru a asigura funcționarea USB 3.0, care necesită pini suplimentari. În caz contrar, veți obține viteza USB 2.0. USB Implementers Forum recomandă producătorilor să folosească codificarea culorilor Pantone 300C în interiorul conectorului.

Situația a fost similară pentru mufa USB tip B, deși diferențele sunt mai vizibile vizual. O mufă USB 3.0 poate fi identificată prin cinci pini suplimentari.

USB 3.0 nu folosește fibră optică, pentru că este prea scump pentru piața de masă. Prin urmare, avem în față vechiul cablu de cupru bun. Cu toate acestea, acum va avea nouă fire în loc de patru. Transmiterea datelor se realizează pe patru din cele cinci fire suplimentare în modul diferenţial (SDP-Shielded Differential Pair). O pereche de fire este responsabilă pentru primirea informațiilor, cealaltă pentru transmitere. Principiul de funcționare este similar cu Serial ATA, dispozitivele care primesc lățime de bandă completă în ambele direcții. Al cincilea fir este împământat.

Rată de biți de semnalizare de mare viteză - 12 Mb/s - Lungime maximă a cablului pentru rată de biți de semnalizare de mare viteză - 5 m - Rată de biți de semnalizare de viteză mică - 1,5 Mb/s - Lungime maximă a cablului pentru rată de biți de semnalizare de viteză mică - 3 m - Dispozitive conectate maxim (inclusiv multiplicatori) - 127 - Este posibil să se conecteze dispozitive cu viteze baud diferite - Nu este nevoie ca utilizatorul să instaleze elemente suplimentare, cum ar fi terminatoare pentru SCSI - Tensiune de alimentare pentru dispozitive periferice - 5 V - Consum maxim de curent per dispozitiv - 500 mA

Cablajul conectorului USB 1.1 și 2.0

Semnalele USB sunt transmise prin două fire ale unui cablu ecranat cu patru fire.

Aici :

GND- circuit „carcasă” pentru alimentarea dispozitivelor periferice V AUTOBUZ- +5V, de asemenea, pentru circuitele de alimentare Bus D+ concepute pentru transmiterea datelor

Obosi D- pentru a primi date.

Dezavantajele usb 2.0

Deși rata maximă de transfer de date a USB 2.0 este de 480 Mbps (60 MB/s), în viața reală este nerealist să se atingă astfel de viteze (~33,5 MB/s în practică). Acest lucru se datorează întârzierilor mari de pe magistrala USB între cererea de transfer de date și începerea efectivă a transferului. De exemplu, magistrala FireWire, deși are un debit de vârf mai mic de 400 Mbps, care este cu 80 Mbps (10 MB/s) mai puțin decât USB 2.0, permite de fapt un debit mai mare pentru schimbul de date cu hard disk-uri și alte dispozitive de stocare a informațiilor dispozitive. În acest sens, diverse unități mobile au fost mult timp limitate de lățimea de bandă practică insuficientă a USB 2.0.

Cel mai semnificativ beneficiu al USB 3.0 este viteza sa mai mare (până la 5 Gbps), care este de 10 ori mai rapidă decât portul mai vechi. Noua interfață a îmbunătățit economisirea energiei. Acest lucru permite unității să intre în modul de repaus atunci când nu este utilizat. Este posibil să se efectueze transmisia de date în două sensuri în același timp. Acest lucru va oferi o viteză mai mare dacă conectați mai multe dispozitive la un port (împărțiți portul). Puteți ramifica folosind un hub (un hub este un dispozitiv care se ramifică dintr-un port în 3-6 porturi). Acum, dacă conectați hub-ul la un port USB 3.0 și conectați mai multe dispozitive (de exemplu, unități flash) la hub și efectuați transferul de date simultan, veți vedea că viteza va fi mult mai mare decât era cu USB-ul interfata 2.0. Există o caracteristică care poate fi un plus și un minus. Interfața USB 3.0 a crescut curentul la 900 mA, iar USB 2.0 funcționează cu un curent de 500 mA. Acesta va fi un plus pentru acele dispozitive care au fost adaptate pentru USB 3.0, dar un mic minus este că poate exista un risc la încărcarea dispozitivelor mai slabe, cum ar fi un telefon. Dezavantajul fizic al noii interfețe este dimensiunea cablului. Pentru a menține viteza mare, cablul a devenit mai gros și mai scurt în lungime (nu poate fi mai lung de 3 metri) decât USB 2.0. Este important să rețineți că dispozitivele cu interfețe USB diferite vor muncă bun si nu ar trebui sa fie o problema. Dar să nu credeți că viteza va crește dacă conectați USB 3.0 la un port mai vechi sau conectați un cablu de interfață mai vechi la un port nou. Viteza de transfer de date va fi egală cu viteza celui mai slab port.

  • Tutorial

Proiectare ilustrată a modelului de rețea OSI pe Universal Serial Bus.

Trei niveluri „remarcabile” ale stivei USB

Nu am fost mulțumit de aspectul stivei USB, care poate fi găsită cel mai des pe Internet:

Stiva USB nu foarte utilă


Nivel de bus, logic, funcțional... Acestea sunt, desigur, abstracții minunate, dar sunt mai probabil pentru cei care urmează să facă un driver sau un software de aplicație pentru gazdă. În ceea ce privește microcontrolerul, mă aștept la o mașină cu stări finite șablon, în nodurile căreia încorporam de obicei codul nostru util și, la început, va eșua, conform tuturor legilor genului. Sau software-ul de pe gazdă va avea probleme. Sau un șofer. În orice caz, cineva va eșua. De asemenea, este imposibil să descoperi imediat bibliotecile MK. Și așa mă uit la traficul pe magistrala USB cu un analizor, unde evenimentele care au loc într-o limbă necunoscută cu trei niveluri minunate nu se potrivesc deloc. Mă întreb dacă am o asemenea disonanță în cap din cauza febrei gripale?

Dacă cititorul a avut sentimente similare, vă ofer o viziune alternativă a unei stive USB, care mi-a apărut brusc clar în creierul meu supraîncălzit, bazată pe îndrăgitul model OSI cu 7 straturi. M-am limitat la cinci niveluri:

Nu vreau să spun că toate programele și bibliotecile au fost deja realizate sau ar trebui să fie proiectate pe baza acestui model. Din motive de inginerie, codul cu niveluri va fi foarte amestecat. Dar vreau să îi ajut pe cei care încep să se familiarizeze cu magistrala USB, care doresc să înțeleagă protocoalele de schimb de dispozitive și terminologia domeniului, să se apropie de exemple gata făcute, biblioteci și să le navigheze mai bine. Acest model nu este pentru încărcare în MK, ci în mințile voastre strălucite, dragi prieteni. Și atunci mâinile tale de aur vor face totul singure, nu am nicio îndoială :)

Deci, să mergem, corectează dacă vezi greșeli. Aceasta este o versiune nefinalizată și, dacă ceva de genul acesta a fost deja desenat undeva, îmi cer scuze, nu am putut găsi, așa că am făcut-o singur. Cred că poza nu va fugi, dar deocamdată voi explica publicului respectabil de ce am început această publicație în primul rând.

Un alt flashback din anii '90

Am scos primul meu bug din codul altcuiva la sfârșitul anilor nouăzeci, în timp ce lucram ca student ca student. A fost pppd pentru FreeBSD, pe care apoi l-am instalat pe pool-ul de modemuri. Modemurile Motorola au rămas blocate, nimeni nu a putut trece, linia a fost irosită și singura metodă rămasă prin intermediul PPP de menținere în viață a fost, dintr-un motiv oarecare, greșită. Atunci am aflat că din anumite motive pppd aștepta șase octeți de răspuns LCP în loc de cei patru necesari. M-am simțit atât de nebun atunci scuturator de insecte din anii '90 :-) Ce legătură are PPP cu asta? Este doar similar cu USB: pachet și punct la punct. Adevărat, spre deosebire de USB 2.0, este full duplex.


Fie că ne place sau nu, evoluția microcontrolerelor clar nu va sta pe loc. Nu, nu și va apărea în publicații (http://habrahabr.ru/post/208026/, http://habrahabr.ru/post/233391/) „periferice grele” - implementări de magistrală USB încorporate în MK, cu exemple de analiză, folosind HID etc. Trebuie să aducem un omagiu autorului cărții RaJa: din opt exemple date în biblioteca standard STSW-STM32121 (UM0424) și cumva, l-a ales pe cel mai util (Custom HID), l-a portat în mediul gratuit Em::Blocks, l-a prezentat într-un limbaj ușor de înțeles și l-a înfrumusețat puțin, bravo! Acest lucru mi-a economisit mult timp.

Cum ajung la bibliotecă?

După ce am primit proiectul RHIDDemo pentru Em::Blocks postat cu amabilitate pe GitHub de către autor, am început să-l port la Keil (depanatorul meu CoLink bazat pe FTDI; cineva să-mi spună pluginul Coocox pentru Em::Blocks). Dar pur și simplu nu puteam înțelege: de unde naiba a luat autorul SPL 3.6.1 din 2012, dacă site-ul a postat 3.5.0 din 2011? Am trecut printr-o căutare destul de plictisitoare, care, spre surprinderea mea, a condus... direct la un proiect Custom HID gata făcut pentru Keil, ca parte a bibliotecii USB FS 4.0.0. Zace la vedere, ca un șoarece sub o mătură. Ei bine, bine. Dar în sfârșit am ajuns la versiunile STMicroelectronics, am găsit o descriere a bibliotecii USB FS STSW-STM32121 (UM0424) și am oprit încercările dezvoltatorului de a mă înnebuni. Spune-mi, este normal să pui CMSIS vintage 1.30 din 2009 în setul SPL 3.5.0 din 2011, să ascunzi noul SPL 3.6.1 din 2012 în USB-FS 4.0.0 din 2013 (punând CMSIS 3.0.1 din 2012 în și acolo), în ciuda faptului că au versiunea actuală a CMSIS 3.30 lansată în 2014? Apropo, în SPL 3.6.x pentru STM32F10X, au fost remediate câteva erori cu USART legate de semnalele de depășire a tamponului. Mulțumesc, măcar au lăsat note de lansare...

HID vs SNMP

Deci, după ce am preluat STM32F103C8T6, am decis să mă aprofundez puțin în subiectul USB HID, abstracția USB HID se potrivește foarte bine în conceptul de tot felul de senzori, senzori și alte drivere de putere controlate de PWM. Cumva mi-a amintit de SNMP, doar într-o formă foarte simplificată: descriptorii HID joacă rolul unui MIB SNMP. Când dispozitivul este inițializat de gazdă: „Bună, gazdă! Sunt aparat de cafea. Am un buton [start], [cremă], comenzi [zahăr], [cafea rămasă], [apă rămasă], [zăhăr rămasă], [cremă rămasă]. Trageți șoferii, apăsați butonul, să bem niște cafea.” Nu-ți aduce aminte de nimic? Un exemplu de dialog SNMP: „Ei bine, salut, o stație de management cu software pentru 100.000 USD. Și am un șasiu comutator pentru 200.000 USD și mai am 4 module pe el pentru 100.000 USD fiecare; fiecare are încă 16 porturi cu viteză indecentă și este pur și simplu imposibil să enumerați toate funcțiile aici... cereți separat pentru fiecare articol; oh, da, sarcina procesorului este așa și așa, memoria este așa și așa...” Și încă o duzină de pagini în același spirit.

Mi-a plăcut ideea de HID. Dar de îndată ce am lăsat Windows dincolo de sarcinile educaționale ale LED-urilor intermitente (înainte către mediile UNIX reale!), a început să se scurgă prin toate crăpăturile nesigilate și m-am simțit ca un fel de șchiopăt neputincios. În timp ce depanam proiectul, am luat instinctiv un fel de tcpdump (așa se numește: usbdump(8) sau usbmon), dar am văzut doar mesaje într-o limbă necunoscută.

A devenit evident: există o lipsă de cunoștințe fundamentale despre magistrala USB. Dacă orice specialist IT experimentat înțelege modelul OSI și stiva TCP/IP undeva la nivelul măduvei spinării pur și simplu din necesitate, atunci cu USB situația este diferită. Este de înțeles: acolo puteți (aveți nevoie) să spionați traficul prin același tcpdump și să configurați hardware-ul și software-ul, dar aici este complet plug and play și puteți repara ceva actualizând driverul sau firmware-ul (sau reinstalând sistemul de operare). Dar ne-am adunat aici doar pentru a face un firmware bun, nu? După ce am citit câteva descrieri USB online, am fost surprins de cât de confuză poate fi documentația. Am avut chiar senzația că au vrut în mod intenționat să ne inducă în rătăcire împrăștiind ceață și scăpând din răsputeri de concurență. Nu sunt de acord cu această stare de lucruri!

O altă schemă grozavă

Pe Internet am dat peste o altă ilustrație (era în format BMP, nu glumă):

La început pare optimist. În cele din urmă, stiva este dezasamblată. Cadrele, însă, sunt prost marcate: le-aș desena cu linii punctate verticale, iar EOF este doar o pauză, nu se transmit efectiv date. Dar începem să citim contextul și pierdem înțelegerea adevăratei intenții a autorului (pentru a ne deruta):

Controlerul gazdă interfață magistrală USB generează personal;
Personal transmis prin transmisie serială de biți folosind metoda NRZI.
Și iată un altul:
fiecare cadru constă în cea mai mare prioritate colete, a cărui componență este formată de șoferul gazdă;
fiecare difuzat constă dintr-una sau mai multe tranzacții;
fiecare tranzactie consta din pachete;
fiecare punga de plastic constă dintr-un identificator de pachet, date (dacă există) și o sumă de control.

Se pare că totul este desenat corect, dar pe măsură ce citești, întrebările devin din ce în ce mai multe. Structura minimă de date transmisă pe magistrală este un cadru sau un pachet? În general, ar trebui să privim de sus în jos sau invers? Și ce este codificat folosind metoda NRZI - cadre, pachete sau doar întregul flux de biți de pe magistrală? Tranzacțiile constau într-un colet, un transfer sau poate un fel de colet valoros?
De ce nu poți doar: gazda grupează pachetele în tranzacții și le distribuie în segmente de timp numite cadre pentru a acorda prioritate datelor critice de timp (video, audio) pe baza lățimii de bandă curente a magistralei? Da, USB are nuanțe în ceea ce privește programarea transferurilor de pachete, încă nu le abordez.

Viziunea mea despre stiva USB

Consider că USB într-un NutShell menționat aici pe hub (hura, traducere), precum și USB Made Simple, sunt o documentare bună. Pe baza lor, mi-am asamblat versiunea stivei USB, o voi desena din nou.

Strat fizic
La nivel fizic, un set de moduri electrice ale unei perechi diferențiale de conductori (împreună cu masă) este utilizat pentru a desemna stările cu care fluxul de biți este codificat folosind metoda NRZI cu umplutură de biți: aici după șase „1” consecutive ( ei bine, am vrut să transmit, să zicem , 0xffff) „0” este introdus astfel încât receptorul să nu rămână blocat într-o stare mult timp; receptor A Nu există „0” inserat și nu va fi numărat ca date, aceasta este o tehnică destul de comună în codificare pentru o mai bună reglare automată a frecvențelor. O pereche de fire împreună cu masă face posibilă formarea a cel puțin patru stări statice (sunt desemnate J, K, SE0, SE1). În USB 2.0, SE1 nu este utilizat, iar cele trei rămase sunt jucate suplimentar în dinamică (cu ceasuri și tranziții) pentru a transmite mai multe caractere de control (limite de pachete, resetare, conectare/deconectare, economisire/ieșire de energie). Există ilustrații bune în USB Made Simple, Partea 3 - Flux de date.
Acestea. Drept urmare, datele sunt transmise sub formă de zerouri și unu, plus tot felul de caractere de control, astfel încât pachetele de date normale să poată fi pregătite din toată această bucătărie electrodinamică.
(adăugat la cererea cititorilor)
Nivelul lotului
La nivel de pachet, pachetele fără adresă sunt transmise între gazdă și dispozitiv (o pereche de dispozitive pe o linie semi-duplex poate face fără adresare). Pachetul constă dintr-un marker SYNC pentru sincronizarea ceasului receptorului, o secvență de octeți și un caracter EOP. Lungimea pachetului este variabilă, dar este negociată prin nivelurile superioare ale stivei. Primul octet se numește Packet Identifier (PID), are un format redundant simplu pentru imunitate la zgomot și este potrivit pentru alimentarea la mașina de nivel următor (pentru asamblarea tranzacțiilor din pachete). Pachetele cu umplutură (mai mare de un octet PID) sunt furnizate cu o sumă de control (CRC5 scurt sau CRC16 lung, în funcție de tipul de pachet). Analizorul de protocol ar trebui, cel puțin, să ne arate pachetele.
Nivelul tranzacției
La nivelul următor de la pachete merg tranzacții. O tranzacție este un set mic de pachete (în Full Speed ​​​​USB 1, 2 sau 3), care urmează strict unul după altul, pe care (în modul half-duplex) gazda le schimbă cu un punct final și numai unul. Este foarte important ca doar gazda să deschidă tranzacția aceasta este o specificitate USB (există mai puține bătăi de cap pentru noi în firmware-ul MK). La nivel de tranzacție putem vorbi canal(conductă) între gazdă și unul dintre punctele finale ale dispozitivului, dar evit în mod intenționat termenul „Legătură de date” din modelul OSI. Analizatorul de protocol trebuie cel puțin să decodeze tranzacțiile.
Nivelul vitezei
Pe deasupra tranzacțiilor vom plasa stratul de transferuri. Există patru tipuri de ele în USB: transferuri de control cu ​​punctul final nr. 0, transferuri de întrerupere, transferuri izocrone și transferuri în bloc. Ultimele trei sunt variante de canale de streaming (stream pipe), despre care voi spune câteva cuvinte mai târziu. Acest nivel ar trebui să afișeze, de asemenea, un analizor de protocol bun.
Strat de aplicație
În partea de sus a stivei, ca de obicei, se află stratul de aplicare. Ceea ce se întâmplă aici este: setarea adresei dispozitivului de către gazdă, spunerea dispozitivului despre sine în limba descriptorilor, comenzile gazdei pentru a selecta o configurație (transmisii de control), schimbul de date cu dispozitive HID (în exemple am găsit un transmisie cu intreruperi de pana acum, vreau sa o incerc pe cea de control), printare pe o imprimanta si scanare, acces la stocare USB (bloc mare), comunicare prin casti si camere web (izocrone) si multe alte lucruri grozave.
Atingerea finală
Sărind nivelurile pentru o secundă, putem adăuga că gazda aruncă periodic aceleași pachete Start of Frame (SOF) peste magistrală, împărțind timpul în intervale egale, dar în așa fel încât să nu rupă tranzacțiile în sine. Prin urmare, pachetele SOF pot fi considerate tranzacții independente. Cadrul USB nu trebuie confundat cu un omonim pentru stratul de legătură de date al modelului OSI. Este mai bine să vă amintiți cadrele (cadrele) unui CD audio, acesta este doar o sumă de timp: gazda „bifează” în autobuz cu pachete SOF, astfel încât dispozitivele conectate plănuiesc în avans să participe la așa-numitul. transmisii izocrone, conducând fluxuri de date în timp real. Ei bine, sau așa: grupurile de tranzacții sunt programate de gazdă în intervale de timp numite cadre. Un cadru este de 1 ms pe Full Speed ​​​​și 125μs pe High Speed ​​​​USB, dar High Speed ​​​​este un standard mai complex, este mai bine să-l studiați separat.
UPD:
O întrebare bună a fost pusă de cititori: cum rămâne cu fragmentarea? Nu am găsit semne de fragmentare în USB 2.0 la nivel de tranzacție și mai jos, adică. Tranzacțiile sunt menite să fie transmise în întregime. În unele cazuri, transferurile pot și ar trebui să fie împărțite în mai multe tranzacții, mai ales ținând cont de modurile isocrone. Și voi repet că deocamdată gazda se ocupă de toată planificarea pentru noi (din partea MK trebuie să ne gândim mai puțin).

Privind traficul USB

O selecție bună de ilustrații este în cartea menționată USB Made Simple, capitolul 5: www.usbmadesimple.co.uk/ums_5.htm

Iată una dintre ele


Deci, tranzacția este întotdeauna inițiată de gazdă în legătură cu un punct final selectat pe dispozitiv (în plus față de punctul special cu numărul 0, pot exista până la 15 dintre ele pe un dispozitiv, de exemplu, o tastatură combinată cu un mouse, termometru, unitate flash, aparat de cafea și un buton de apel pentru o comandă de pizza instalator).
Dacă gazda primește date de la dispozitiv, acesta din urmă nu poate deschide singur o tranzacție, ci poate doar aștepta momentul potrivit si ia parte la ea. Gazda deschide o tranzacție către dispozitiv cu un pachet cu PID = IN (Token group) și garantează libertatea magistralei pentru timpul necesar, dispozitivul aruncă un pachet din grupul de date, în funcție de tipul tranzacției, gazda poate confirma succes cu al treilea pachet din grupul Handshake (ACK, NAK, STALL, NYET), tranzacția este închisă.
La trimiterea datelor către dispozitiv (PID = OUT, grup Token), gazda deschide o tranzacție, trimite un pachet de date (Date) și, în funcție de mod, poate primi și un pachet Handshake care confirmă succesul tranzacției.
La sfârșitul tranzacției, totul va reveni la normal, dispozitivul va aștepta din nou pachetele de control de la gazdă.

Moduri de transfer USB în exemplele STM32 USB FS

Pentru ca o pereche de fire să poată fi folosită pentru a copia de pe un disc simultan cu un flux audio-video, gesturi ale mouse-ului și un semnal de osciloscop de mare viteză, există diferite tipuri de mesaje și transmisii.
Chiar mai sus am descris un simplu canal de streaming(Stream Pipe) între gazdă și punctul final, unde pachetele cu umplere (grupuri de date) nu transportă nicio informație specială sau de control către subsistemul USB însuși. Libertate completă de corespondență, biblioteca controlerului trebuie să furnizeze primitive pentru descărcarea unui buffer de dimensiune arbitrară din memoria MK către gazdă sau înapoi. Lăsați biblioteca MK împreună cu driverul gazdă să gestioneze tăierea în pachete, redirecționarea și „defragmentarea”. În STM32 acestea sunt USB_SIL_Write() și USB_SIL_Read(), descrise în UM0424. Ele sunt nivelul foarte logic al abstractizării. Pe partea gazdă, vezi descrierea driverului corespunzător (de exemplu, pe FreeBSD este ugen(4)).
Cu toate acestea, consider că este o blasfemie să folosești periferice grele precum USB pentru a organiza un simplu canal de streaming (întrebarea este: ce este în neregulă cu USART?). Dar, desigur, există tot felul de situații.
În orice caz, pentru ca subsistemul USB să prindă viață deloc și dispozitivul să fie detectat, este necesar un schimb de tranzacții de control.

DISCLAIMER

Alte exemple vor fi menționate din aceeași bibliotecă UM0424 pentru lucrul cu USB Full Speed ​​de la STMicroelectronics, dar sunt proiectate pentru plăcile lor demo native. Luați un exemplu de la autorul Raja, arătați cunoștințe în inginerie în adaptarea proiectelor la panoul dvs. demo.

Totul este clar despre software: acestea sunt exemple care nu sunt pentru uz industrial, pot exista erori, unele părți (cum ar fi tabelul de linkuri din exemplul de stocare în masă) sunt protejate de un brevet și nu aveți dreptul să le utilizați într-un proiect comercial. Dar asta nu e nimic, chinezii reușesc apoi să vândă pe piață produse USB, pentru care nici măcar nu se deranjează să schimbe biblioteca VID și PID.

Pentru fier, după cum am înțeles, trebuie să începeți cu cuarț. Am un Chelyabinsk PinBoard II cu quartz de 12 MHz (toate bibliotecile sunt proiectate pentru 8 MHz), am schimbat multiplicatorul PLL de la 9 la 6 (link cu explicații), altfel MK-ul va accelera la 108 MHz în loc de 72 MHz și USB nu va merge la 72 MHz în loc de 48 MHz necesar. De asemenea, puteți încetini viteza MK la 48 MHz schimbând divizorul magistralei USB de la unu și jumătate la unu. Specialiștilor nu le place să folosească generatorul intern al HSI MK: frecvența poate varia ușor din cauza încălzirii și este dificil de prezis consecințele pentru USB. Ei bine, nu uitați de periferie, desigur. Fără memorie flash SPI/SDIO, din exemplul de stocare în masă poți face doar un analog pentru /dev/null, dar nu îl poți formata :-)

Controlați transmisiile și canalele de mesaje
Gândindu-mă la USB, îmi amintesc de vechiul protocol PPP cu LCP, IPCP, CCP și xzCP. Schimbul de mesaje de tip special între gazdă și punctul final nr. 0 este echivalentul local al x3CP.
Prin transmisii de control, dispozitivul este inițializat, primește o adresă și spune gazdei despre sine în limbajul descriptorilor (astfel încât să poată găsi și activa driverul necesar). Fără operațiuni de control, streamingul simplu nu va funcționa dacă dispozitivul nu răspunde în formă, gazda va închide rapid portul: trebuie respectat protocolul.
În principiu, protocolul nu interzice conectarea schimbului de date la punctul de control nr. 0, similar modului cu întreruperi. În același timp, gândiți-vă: cum veți actualiza firmware-ul MK, ca să spunem așa, în teren? Ai programatorul gata? Există o altă soluție.
Exemplu: Actualizare firmware a dispozitivului
Transmisii întrerupte
Acest soi ( întreruperea transferului) este destinat schimbului de tranzacții mici similare celor de control. Nu, dispozitivul nu poate întrerupe gazda, așteaptă interogarea, frecvența acestora și dimensiunile pachetelor sunt specificate în prealabil în descriptorul dispozitivului. Potrivit pentru toate tipurile de telecomenzi, senzori, șoareci, LED-uri și alte aparate de cafea HID. Canalul cu întreruperi în fiecare punct este unidirecțional.
Exemple: HID personalizat, Mouse cu joystick, Port COM virtual
Transmisii izocrone
Χρόνος în greacă înseamnă „timp”. transmisie izocronă ( transfer izocron) - high-tech local care vă permite să gestionați fluxurile de date în timp real. Dispune de lățime de bandă garantată (dar nu neapărat largă) și fără tranzacții de confirmare, la fel ca UDP cu QoS. Pachet spart? Zeul Chronos a fost cel care l-a împins pe MK pe picior. Nu este nevoie să încerci să trimiți coletul din nou, altfel Dumnezeu se va supăra. Cu toate acestea, verificăm sumele de control în liniște de la Chronos. Transferurile izocrone sunt bune pentru sistemele audio-video și de măsurare în timp real, precum și pentru alte jucării dublă utilizare. Deși unii dintre ei ar putea. Este mai interesant să închidem un fel de AVR, conectându-l la ARM prin USART sau SPI. Operațiunile izocrone sunt implicate în semnalizarea cadru (amintiți-vă de bifarea unui pachet SOF).
Exemplu: Difuzor de voce USB
Transmisii bloc mari
Nu, nu vom transporta saci de ciment. Cred că toată lumea a învățat modul de funcționare al tuturor tipurilor de unități USB. Transferuri transfer în vrac au scopul de a trimite date cât mai mult și cât mai rapid posibil, întotdeauna cu transferul pachetelor rupte, dar fără garanții asupra lățimii de bandă, cedându-le transmisiilor isocrone dacă este necesar (ca în TCP fără QoS). Am vorbit deja despre structura internă a unităților flash USB, acum puteți descărca și rula un prototip funcțional. Nu l-am încercat eu, dar tabelul de comenzi SCSI din descrierea exemplului (apropo) este destul de simbolic. Nu am găsit semne ale unui algoritm de gestionare a uzurii pentru memoria NAND :-)
NOTĂ: Protecția prin brevet STM se aplică în unele locuri.
Exemplu: Stocare în masă

Ce a rămas nedezvăluit

Nu am scopul de a face un alt manual pe USB, sunt destule fără mine și sunt bine descrise: partea electrică, detaliile protocolului, lucrul cu hub-uri, limbajul descriptorului și nivelul de abstractizare HID, probleme cu unicitatea VID/PID, USB 3.0 și multe alte caracteristici minunate ale magistralei USB, atât utile, cât și nu atât de utile pentru noi. Pentru IT, recomand în special o excursie în partea întunecată cu o privire de ansamblu asupra dispozitivelor inamice (o unitate flash cu o tastatură HID deghizată care va face lucruri groaznice).

Legături

Adaptarea exemplului HID personalizat la mediul gratuit Em::Blocks și la placa demo pentru buget STM32F103C8T6 produsă de LC-Tech Industrial Electronics și oameni IT. Acesta este un fel de inginerie Yin și Yang, fiecare dintre noi are o parte din ambele.

Inginerii în electronică industrială au cunoștințe și abilități strălucitoare în materie de hardware lipează componente radio subțiri ca părul cu mâna stângă cu ochii închiși (și apoi funcționează). Privind un circuit electronic, aproape fizic începem să-i simți toți curenții cu potențiale, ei funcționează și cu circuite de putere și cu produse industriale (mari, rapide, periculoase). Abordarea programării MK este adecvată: pur și simplu trebuie să transmită nivelurile logice necesare la picioarele potrivite la momentul potrivit, nu contează în ce fel. Sunt conservatori în tehnologie (nu interferați - funcționează), perifericele MK grele nu sunt deosebit de favorizate. Când discutăm despre programare orientată pe obiecte, securitatea informațiilor, proiecte uriașe cu un milion de linii de cod și tot felul de interfețe grafice fanteziste, oamenii se plictisesc. În locul magistralei USB orientate pe pachete, ei preferă modul de streaming USART, îmbunătățit fie de RS-232 obișnuit, fie de RS-485 mai brutal (magistrală serială pentru aplicații industriale, până la 10Mbit/s la 15m, până la 100kbit/s). la 1200m, până la 32 de dispozitive).

Specialiștii IT sunt educați cu o înțelegere a sistemelor de operare, a infrastructurii de rețea și a interacțiunilor complexe; Unii oameni iubesc cu adevărat pisicile (cum să nu le iubești? Eu, totuși, nu păstrez, cresc și nu gătesc :-). Mulți oameni iubesc libertatea de informare, criticând corporațiile/guvernele și înfrângând forțele naturii cu puterea gândirii. Sunt leneși patologic, dar iubesc noile tehnologii și puzzle-urile de inginerie răsucite cu jucării scumpe (de preferință rezolvate la nivel de software sau, în cazuri extreme, săritori). Relațiile cu un fier de lipit sunt păzite: nu întrebați IT-ul dacă îi place un fier de lipit, poate înțelege greșit; Mai bine întrebați dacă îi place să lipiți circuitele electronice.

Despre ce vorbesc? Vedem lumea asta altfel... La urma urmei, nucleul Linux a fost creat de aceiași băieți, din module în C și inserții de asamblare pentru anumite platforme și păreau să se descurce fără holivar. Văd un proiect cu adevărat serios ca un sistem multi-core care combină cele mai noi microcontrolere cu periferice grele, dar nu exclud combinațiile cu modele clasice precum AVR: ele pot fi folosite pentru a agăța niște vârfuri de lance critice, care se rotesc rapid, ale progresului tehnic. Dacă codul a fost testat de ani de zile, atunci de ce nu?

Adaugă etichete

Articolul de astăzi va fi dedicat, așa cum sugerează și titlul, discuției despre elementele de bază interfață USB. Să ne uităm la conceptele de bază, la structura interfeței, să ne dăm seama cum are loc transferul de date, iar în viitorul apropiat vom pune toate acestea în practică 😉 Pe scurt, să începem!

Există o serie de specificații diferite USB. Totul a început cu USB 1.0Și USB 1.1, apoi interfața a evoluat în USB 2.0, specificația finală a apărut relativ recent USB 3.0. Dar în acest moment implementarea cea mai comună este USB 2. 0.

Ei bine, pentru început, punctele și caracteristicile principale. USB 2.0 acceptă trei moduri de operare:

  • De mare viteză– până la 480 Mb/s
  • Viteza maxima– până la 12 Mb/s
  • Viteza mica– până la 1,5 Mb/s

Comenzi în autobuz gazdă USB(de exemplu, un PC), la care puteți conecta până la 127 de dispozitive diferite. Dacă acest lucru nu este suficient, atunci trebuie să adăugați o altă gazdă. Mai mult, este important ca dispozitivul în sine să nu trimită/primi date către/de la gazdă este necesar ca gazda să contacteze dispozitivul în sine.

Aproape toate articolele despre USB Am văzut termenul folosit punctul final„, dar ceea ce este este de obicei scris destul de vag. Deci, punctul final este parte a dispozitivului USB, care are propriul său identificator unic. Fiecare dispozitiv USB poate avea mai multe puncte finale. În general, un punct final este doar o zonă de memorie USB un dispozitiv în care pot fi stocate orice date (tampon de date). Și în cele din urmă obținem asta - fiecare dispozitiv are propria sa adresă unică pe autobuz USB, iar fiecare punct final al acestui dispozitiv are propriul său număr. Ca aceasta)

Să ne abatem puțin și să vorbim despre „hardware”-ul interfeței.

Există două tipuri de conectori - Tipul A și Tipul B.

După cum reiese deja din figură Tip A se confruntă întotdeauna cu gazda. Aceștia sunt conectorii pe care îi vedem pe computere și laptopuri. Conectori Tip B referiți întotdeauna la dispozitivele USB conectate. Cablul USB este format din 4 fire de culori diferite. Ei bine, de fapt, roșu este putere (+5 V), negru este împământat, albul și verde sunt pentru transmisia de date.

Pe lângă cele prezentate în figură, există și alte opțiuni pentru conectorii USB, de exemplu, mini-USB și altele, ei bine, știți deja asta 😉

Probabil că merită să atingem puțin metoda de transfer de date, dar nu vom aprofunda acest lucru) Deci, atunci când transferăm date prin autobuz USB se foloseste principiul codificarii NRZI(fără revenire la zero cu inversare). Pentru a transmite „1” logic, este necesar să creșteți nivelul liniei D+ peste +2,8 V, iar nivelul liniei D trebuie să fie coborât sub +0,3 V. Pentru a transmite zero, situația este inversă - ( D- > 2,8 V) și (D+< 0.3 В).

Ar trebui să discutăm și despre alimentarea dispozitivelor USB. Și aici sunt posibile mai multe opțiuni.

În primul rând, dispozitivele pot fi alimentate de la magistrală, apoi pot fi împărțite în două clase:

  • Putere redusă
  • De mare putere

Diferența aici este că de putere redusă dispozitivele nu pot consuma mai mult de 100 mA. A dispozitive de mare putere nu ar trebui să mai consume 100 mA doar în etapa de configurare. Odată configurate de gazdă, consumul acestora poate fi de până la 500 mA.

În plus, dispozitivele pot avea propria lor sursă de alimentare. În acest caz, ei pot primi până la 100 mA din autobuz și ia orice altceva din sursa ta)

Asta pare să fie tot, să trecem încet la structura datelor transmise. Totuși, acest lucru este de cel mai mare interes pentru noi 😉

Toate informațiile sunt transmise personal, care sunt trimise la intervale regulate. La rândul său, fiecare cadru este format din tranzacții. Poate va fi mai clar astfel:

Fiecare cadru include un pachet , apoi urmează tranzacțiile pentru diferite puncte finale și totul se termină cu un pachet EOF (Sfârșitul cadrului). Pentru a fi absolut precis, atunci EOF- acesta nu este chiar un pachet în sensul obișnuit al cuvântului - este un interval de timp în care schimbul de date este interzis.

Fiecare tranzacție are următoarea formă:

Primul pachet (numit Jeton punga de plastic) conține informații despre adresa dispozitivului USB, precum și numărul punctului final căruia îi este destinată această tranzacție. În plus, acest pachet stochează informații despre tipul tranzacției (vom discuta ce tipuri există, dar puțin mai târziu =)). – totul este clar la el, acestea sunt datele transmise de gazdă sau de endpoint (în funcție de tipul tranzacției). Ultimul pachet - stare– conceput pentru a verifica succesul achiziției de date.

Cuvântul „pachet” a fost auzit de multe ori în legătură cu interfața. USB, așa că este timpul să ne dăm seama ce este. Să începem cu pachetul Jeton:

Pachete Jeton sunt trei tipuri:

  • Înființat

De aceea am spus asta..) În funcție de tipul de pachet, valoarea câmpului PID V Jeton pachetul poate lua următoarele valori:

  • Tip pachet de jetoane OUT – PID=0001
  • Tip pachet de simbol IN – PID = 1001
  • Tip pachet de simboluri SETUP – PID = 1101
  • Tip pachet de jetoane SOF – PID=0101

Să trecem la următoarea componentă a pachetului Jeton- câmpuri AbordareȘi Punct final- conțin Adresa dispozitivului USB și numărul punctului final, care este destinat tranzacţie.

Ce câmp CRC– aceasta este o sumă de control, aceasta este clară.

Există un alt punct important aici. PID include 4 biți, dar în timpul transmisiei sunt completați cu încă 4 biți, care se obțin prin inversarea primilor 4 biți.

Deci, următorul în rând - adică un pachet de date.

Aici totul este practic la fel ca în pachet Jeton, doar în locul adresei dispozitivului și al numărului punctului final, aici avem datele transmise.

Rămâne să luăm în considerare stare pachete și Pachete SOF:

Aici PID poate lua doar două valori:

  • Pachetul a fost primit corect - PID=0010
  • Eroare la primirea pachetului - PID = 1010

Și, în sfârșit pachete:

Aici vedem un nou domeniu Cadru– conține numărul cadrului transmis.

Să ne uităm la procesul de scriere a datelor pe un dispozitiv USB ca exemplu. Adică, luați în considerare un exemplu de structură a unui cadru de înregistrare.

Cadrul, după cum vă amintiți, constă din tranzacții și are următoarea formă:

Care sunt toate aceste tranzacții? Să ne dăm seama acum! Tranzacţie ÎNFIINȚAT:

Tranzacţie OUT:

În mod similar, când citiți date de pe un dispozitiv USB, cadrul arată astfel:

Tranzacţie ÎNFIINȚAT am văzut deja, să ne uităm la tranzacție ÎN 😉

După cum puteți vedea, toate aceste tranzacții au aceeași structură pe care am discutat mai sus)

În general, cred că este suficient pentru astăzi 😉 Acesta este un articol destul de lung, sper că vom încerca să implementăm în practică interfața USB în viitorul apropiat!

Oferă schimb de date între gazdă și dispozitiv. La nivel de protocol, sunt rezolvate sarcini precum asigurarea fiabilității și fiabilității transmisiei și controlului fluxului. Tot traficul de pe magistrala USB este transferat prin tranzacții în fiecare tranzacție, schimbul este posibil doar între gazdă și dispozitivul adresat (punctul final al acestuia).

Toate tranzacțiile (schimburile) cu dispozitive USB constau din două sau trei pachete secvențe tipice de pachete în tranzacții sunt prezentate în Fig. 1. Fiecare tranzacție este programată și inițiată de controlerul gazdă, care trimite un pachet de token de tranzacție. Indicatorul tranzacției descrie tipul și direcția transferului, adresa dispozitivului USB selectat și numărul punctului final. Dispozitivul adresat de marker își recunoaște adresa și se pregătește pentru schimb. Sursa de date identificată de token transmite pachetul de date. În acest moment, tranzacțiile legate de transferurile izocrone sunt finalizate - nu există nicio confirmare de primire a pachetului. Pentru alte tipuri de transmisii, există un mecanism de confirmare care asigură livrarea garantată a datelor. Formatele pachetelor sunt prezentate în Fig. 2, tipurile de pachete sunt în tabel. În toate câmpurile de pachete, cu excepția câmpului CRC, datele sunt transmise mai întâi pe bitul cel mai puțin semnificativ (bitul cel mai puțin semnificativ este afișat în partea stângă în diagramele de timp). Pachetul începe cu secvența Sync și se termină cu terminatorul - EOP. Tipul pachetului este determinat de câmpul PID. Scopul câmpurilor rămase este explicat mai jos. Lungimea câmpurilor Sync și EOP este specificată pentru transmisiile pe FS/LS pentru transmisii de mare viteză, câmpul Sync este extins la intervale de 32 de biți, iar EOP la 8 (în pachetele SOF, câmpul EOP are o lungime de 40 de biți; ).

Toate pachetele primite sunt verificate pentru erori, deoarece formatele de pachete acceptate și anumite convenții permit:

  • un pachet începe cu o secvență de sincronizare urmată de PID-ul său (Packet Identifier). Identificatorul este urmat de copia sa inversă - Verificare. Dacă două copii nu se potrivesc, se consideră o eroare;
  • Corpul pachetului (toate câmpurile pachetului, cu excepția PID și atributul EOP) este protejat de un cod CRC: 5 biți pentru pachetele de marcare, 16 biți pentru pachetele de date. Un CRC care nu se potrivește cu valoarea așteptată este considerat o eroare;
  • pachetul se termină cu un semnal EOP special; Dacă pachetul conține un număr non-întreg de octeți, acesta este considerat eronat. Un EOP fals, chiar și la granița unui octet, nu va permite recepționarea pachetului din cauza unei erori CRC aproape inevitabile în această situație;
  • pachetele de date sunt transmise la stratul fizic (la magistrală) folosind umplerea de biți (un zero este inserat după șase biți unu), ceea ce previne pierderea sincronizării biților în timpul unui semnal monoton. Primirea a mai mult de șase biți unu la rând este considerată o eroare (pe HS - un semn al sfârșitului cadrului).

Detectarea oricăreia dintre aceste erori într-un pachet determină receptorul să îl considere invalid. Nici dispozitivul, nici controlerul gazdă nu răspund la pachetele primite cu o eroare. În transmisia izocronă, pachetele de date invalide trebuie pur și simplu ignorate (se pierd); Pentru alte tipuri de transmisii, sunt utilizate mijloace de asigurare a unei livrări fiabile.

Pentru a detecta eșecul peer-ului de a răspunde la un pachet, fiecare dispozitiv are un contor de timeout care nu mai așteaptă un răspuns după ce a trecut un anumit timp. USB are o limită pentru timpul de călătorie dus-întors pe magistrală: timpul de la sfârșitul EOP-ului pachetului generat până la începutul pachetului de răspuns este primit. Pentru dispozitivul final (și controlerul gazdă), întârzierea maximă de răspuns (timpul de răspuns) de la sfârșitul EOP văzut până la introducerea începutului pachetului este normalizată. Pentru hub-uri, întârzierea transmisiei pachetelor este normalizată pentru cabluri, întârzierea de propagare a semnalului este normalizată. Contorul de timeout trebuie să țină cont de întârzierea maximă posibilă pentru o configurație de magistrală validă: până la 5 hub-uri intermediare, până la 5 metri fiecare cablu. Valoarea de timeout permisă, exprimată în intervale de biți (bt), depinde de viteza:

  • Pentru viteze FS/LS, întârzierea introdusă de un segment de cablu este mică în comparație cu intervalul de biți (bt). Pe baza acestui lucru, în USB 1.0 este adoptat următorul model pentru calcularea întârzierilor admisibile. O întârziere admisă de 30 ns este alocată pentru fiecare segment de cablu și 40 ns pentru hub. Astfel, cinci hub-uri intermediare cu cablurile lor introduc o întârziere de 700 ns în timpul unei duble revoluții, ceea ce corespunde la aproximativ 8,5 bt pe FS. Pentru un dispozitiv FS, întârzierea de răspuns nu trebuie să depășească 6,5 bt (și ținând cont de cablul său - 7,5 bt). Pe baza acestui fapt, specificația cere transmițătorilor pe FS să utilizeze un contor de timeout de 16-18 bt;
  • la viteza HS, întârzierea în segmentul de cablu este mult mai mare decât intervalul de biți, iar în USB 2.0 modelul de calcul este ușor diferit. Aici, 26 ns sunt alocați pentru fiecare segment de cablu și 4 ns plus 36 bt pentru hub. Astfel, trecerea prin 6 segmente de cablu de două ori (2×6×26 = 312 ns ≈ 150 bt) și cinci hub-uri (2×5×4 = 40 ns ≈ 19 bt plus 2×5×36 = 360 bt) durează până la 529 bt . Întârzierea de răspuns a dispozitivului este acceptabilă până la 192 bt, iar întârzierea totală luând în considerare cablurile și hub-urile va fi de până la 721 bt. Pe baza acestui fapt, specificația cere transmițătorilor de pe HS să utilizeze un contor de timeout de 736-816 bt.

Controlerul gazdă are propriul contor de erori asociat cu fiecare punct final al tuturor dispozitivelor, care este resetat la zero atunci când fiecare tranzacție este programată. Acest contor contorizează toate erorile de protocol (inclusiv erorile de timeout), iar dacă numărul de erori depășește pragul (3), atunci canalul cu acest punct final este oprit și proprietarul acestuia (driver de dispozitiv sau USBD) este notificat. Până la depășirea pragului, gazda tratează erorile pentru transferurile neizocrone încercând să reîncerce tranzacțiile, fără a anunța software-ul client. Transferurile izocrone nu se repetă; gazda raportează imediat erorile.

Pachetele de strângere de mână sunt utilizate pentru confirmare, controlul fluxului și semnalizarea erorilor. Dintre aceste pachete, controlerul gazdă poate trimite dispozitivului doar un pachet ACK, confirmând recepția fără erori a pachetului de date. Dispozitivul utilizează următoarele pachete de strângere de mână pentru a răspunde gazdei:

ACK - confirmarea (pozitivă) a încheierii cu succes a unei tranzacții de ieșire sau de control;
NAK - confirmare negativă, este un semn că dispozitivul nu este pregătit pentru a efectua această tranzacție (nu există date de transmis gazdei, nu există spațiu în buffer pentru recepție, operațiunea de control nu a fost finalizată). Acesta este un răspuns normal despre care nimeni nu va ști, cu excepția controlorului gazdă, care este forțat să repete tranzacția mai târziu. În tranzacțiile de intrare, dispozitivul oferă un răspuns NAK în loc de un pachet de date dacă nu sunt gata;
STALL este un mesaj de eroare grav care înseamnă că, fără o intervenție software specială, lucrul cu acest punct final devine imposibil. Acest răspuns este comunicat atât driverului USBD, care anulează tranzacțiile ulterioare cu acest punct, cât și driverului client, de la care este de așteptat ca intervenția software să deblocheze punctul. În tranzacțiile de control (Control), răspunsul STALL înseamnă că cererea nu poate fi executată; Deblocarea punctului nu este necesară.

Controlul fluxului de ieșire care se bazează exclusiv pe capacitatea de a răspunde cu un NAK dacă dispozitivul nu este pregătit este o utilizare foarte ineficientă a lățimii de bandă a magistralei: un pachet mare de date este irosit pe magistrală pentru a se asigura că dispozitivul nu este pregătit. În USB 2.0, această problemă este evitată în tranzacțiile Bulk-OUT și Control prin utilizarea protocolului Ping. Gazda poate interoga disponibilitatea dispozitivului pentru a primi o dimensiune maximă a pachetului, trimițându-i un jeton de probă PING. Dispozitivul poate răspunde la acest token cu un ACK (dacă este gata) sau NAK (dacă nu poate primi dimensiunea maximă a pachetului). Un răspuns negativ va forța gazda să încerce din nou mai târziu, un răspuns pozitiv îi va permite să efectueze o tranzacție de ieșire. La o tranzacție de retragere după un răspuns pozitiv la test, răspunsurile dispozitivului sunt mai variate:

  • ACK înseamnă recepție cu succes și disponibilitate pentru a accepta următorul pachet de dimensiune completă;
  • NYET înseamnă recepție cu succes, dar nu gata pentru următorul pachet;
  • NAK este un răspuns neașteptat (contrazice succesul testului), dar este posibil dacă dispozitivul devine brusc indisponibil temporar.

Dispozitivul de mare viteză din descriptorii punctelor finale raportează intensitatea posibilă a trimiterilor NAK: câmpul bInterval pentru punctele finale Bulk și Control indică numărul de microcadre per NAK (0 înseamnă că dispozitivul nu va răspunde niciodată cu un NAK la o tranzacție de ieșire).

Transferurile de matrice, întreruperi și control asigură livrarea fiabilă a datelor. După ce a primit cu succes pachetul, receptorul de date trimite o confirmare - un pachet de confirmare ACK. Dacă receptorul de date detectează o eroare, pachetul este ignorat și nu i se trimite niciun răspuns. Sursa de date consideră că următorul pachet a fost transmis cu succes atunci când primește un ACK de la receptor. Dacă confirmarea nu ajunge, atunci în următoarea tranzacție sursa repetă trimiterea aceluiași pachet. Cu toate acestea, pachetul de confirmare poate fi pierdut din cauza interferenței; astfel încât în ​​acest caz trimiterea repetată a pachetului de către receptor nu este percepută ca următoarea porțiune de date, pachetele de date sunt numerotate. Numerotarea este modulo 2 (număr de 1 bit): pachetele sunt împărțite în par (cu identificatorul DATA0) și impare (DATA1). Pentru fiecare punct final (cu excepția izocronului), gazda și dispozitivul au biți de comutare, stările lor inițiale sunt consecvente într-un fel sau altul. Tranzacțiile IN și OUT transmit și așteaptă pachete de date cu identificatorii DATA0 sau DATA1, corespunzător stării curente a acestor biți. Receptorul de date comută bitul în cazul recepției fără erori a datelor cu identificatorul așteptat, sursa de date comută la primirea confirmării. Dacă receptorul primește un pachet fără erori cu un ID neașteptat, trimite un ACK, dar ignoră datele din pachet deoarece pachetul este o retransmitere a datelor care au fost deja primite.

Tranzacțiile pentru diferite tipuri de transferuri au diferențe de protocol datorită garanției sau negaranției debitului, timpului de răspuns, fiabilității livrării și sincronizării intrărilor și ieșirii. În funcție de aceste caracteristici, tranzacțiile folosesc unul sau altul dintre mecanismele de protocol descrise mai sus. Rețineți că detectarea erorilor de transmisie funcționează în toate tranzacțiile, astfel încât datele primite în eroare sunt întotdeauna ignorate. Mecanismele de protocol utilizate în tranzacția curentă sunt „cunoscute” atât de controlerul gazdă (pe baza descriptorului punctului final primit anterior), cât și de dispozitivul USB în care este implementat acest punct final.

Tranzacțiile izocrone oferă cursuri de schimb garantate, dar nu asigură livrare fiabilă. Din acest motiv, nu există confirmări în protocol, deoarece reluarea pachetelor va duce la eșecul planurilor de livrare a datelor. Nu există un control al fluxului bazat pe confirmare — dispozitivul trebuie să mențină rata de trafic declarată în descriptorul de punct final izocron.

Tranzacțiile de ieșire izocrone constau din două pachete trimise de controlerul gazdă, un token OUT și un pachet de date DATA. Într-o tranzacție de intrare, gazda trimite un token IN, la care dispozitivul răspunde cu un pachet de date, eventual cu o lungime a câmpului de date de zero (dacă nu există date pregătite). Orice alt răspuns de la dispozitiv (precum „tăcerea”) este privit de gazdă ca o eroare care duce la oprirea acestui canal.

Cu schimbul izocron, există controlul fiabilității (eliminarea pachetelor cu erori) și al integrității datelor (detectarea faptului că lipsește un pachet). Controlul integrității se bazează pe determinismul strict al cursului de schimb - în conformitate cu descriptorul său, punctul se așteaptă la o tranzacție cu o perioadă de 2bInterval-1 microcadre. Pentru un punct final izocron obișnuit, este posibilă o singură tranzacție per microcadru, iar o eroare la primirea unui pachet are ca rezultat faptul că nu se primesc date primite în microcadrul în care era așteptat. Astfel, numerotarea pachetelor (comutator Toggle Bit) nu este necesară. Dispozitivele de viteză maximă și controlerele gazdă ar trebui să trimită numai pachete de tip DATA01. Pentru punctele finale izocrone de bandă largă (USB 2.0), în fiecare microcadru pot fi transmise până la trei pachete de date. Oricare dintre aceste pachete ar putea fi pierdute, iar numerotarea pachetelor în cadrul microcadrului este necesară pentru a detecta această situație. Pentru această numerotare au fost introduse două noi tipuri de pachete de date: DATA2 și MDATA. Varietatea tipurilor de pachete, pe lângă numerotare, vă permite, de asemenea, să vă informați partenerul de comunicare despre planurile dumneavoastră pentru un anumit microcadru. În tranzacțiile IN, dispozitivul indică prin identificatorul de pachet câte pachete mai intenționează să emită în același microcadru, ceea ce permite gazdei să evite încercările de introducere inutile. Deci, dacă un pachet este transmis într-un microcadru, atunci acesta va fi DATA0; dacă două, secvența va fi DATA1, DATA0; trei - DATA2, DATA1, DATA0. Tranzacțiile OUT folosesc un pachet MDATA (Mai multe date) pentru a scoate pachetul care nu este ultimul într-un microcadru, iar ultimul identificator de pachet indică câte pachete au fost transmise înaintea acestuia. Deci, cu o tranzacție de ieșire se folosește pachetul DATA0, cu două - secvența MDATA, DATA1, cu trei - MDATA, MDATA, DATA2. Toate tranzacțiile, cu excepția ultimei dintr-un microcadru, trebuie să utilizeze dimensiunea maximă a pachetului. Rețineți că alte tranzacții pot fi intercalate între tranzacțiile în bandă largă într-un microcadru.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva