Jste zde

USB OTG v 32bit. mikrokontrolérech a mikroprocesorech ColdFire - 2. díl

Zatímco první díl seriálu se zabýval konkrétními ukázkami 32bitových MCU ColdFire společnosti Freescale, které jsou vybaveny USB OTG rozhraním, tento díl se pak zaměřuje hlavně na hardwarovou realizaci připojení USB OTG, tedy to, co je mezi vývody MCU a konektorem a proč to tam je. Nejdříve obecně, a pak na příkladu MCU MCF532x. Další díly pak naťuknou vnitřní funkci USB modulu integrovaného v MCU a jeho softwarové ovládání.

Hardwarová realizace USB OTG v MCU Freescale

USB OTG se u výše zmíněných MCU realizuje jako samostatná periferie tvořená USB OTG řadičem, který řídí celou komunikaci a USB PHY rozhraním (transceiverem), které fyzicky "převádí" datový tok na elektrické signály přenášené pro vodičích USB kabelu. Mimo to provádí napájení USB sběrnice.

USB sběrnice je totiž tvořena 4 vodiči:

  • Dvojicí datových vodičů D+ a D- (někdy označeno jako DPlus a DMinus)
  • Napájecí vodič VBUS
  • Zem (GND)

U USB však nestačí pouze propojit datové vodiče D+ a D- na vývody MCU, ale je nutné na ně "pověsit" zvyšující (pull-up) rezistory připojené na napětí 3.3 V nebo snižující (pull-down) rezistory připojené na 0V, které určují režim funkce USB rozhraní (Host/Master nebo Device/Slave) a komunikační rychlost. V případě USB OTG, tak musí být tyto rezistory připojeny do MCU a řízeny, zatímco u trvalých rozhraní Host nebo Device bývají připojeny napevno na zdroj. Ty mohou být dle Universal Serial Bus Rev. 2.0 Specification následující:

  • pomalý přenos LS (Low Speed) = přenosová rychlost 1.5 Mb/s
  • rychlý přenos FS (Fast Speed) = přenosová rychlost 12 Mb/s
  • vysokorychlostní přenos HS (High Speed) = přenosová rychlost 480 Mb/s
 

Popis vodičů USB kabelu, jeho požadované parametry a jeho připojení na straně USB Host (vlevo) a USB Device (vpravo)

Zatímco LS a FS přenos bývá standardně implementován do integrovaného USB modulu na čipu MCU, pro HS komunikaci je nutné použít externí ULPI USB transceiver, který se připojuje přes k tomu určené speciální rozhraní (sběrnici) UTMI+ (USB 2.0 Transceiver Macrocell Interface). Komunikační rychlost určuje zařízení v režimu USB Device připojení pull-down rezistoru na D+ (FS/HS komunikace) nebo na D- datový vodič (LS komunikace). Rozlišení mezi FS a HS se pak provádí vygenerování chirp signálu během resetu pro označení HS přenosu.

Pullup a pulldown rezistory se definuje funkční režim USB rozhraní (režim Host/Device a rychlost přenosu LS/FS/HS)

Mimo řízení signálů na datových vodičích je nutné u USB a zvláště u USB OTG i docela složité řízení napájení sběrnice. To má provádět vždy zařízení v režimu USB Host, ale u USB OTG to není úplně tak pravda. U něho totiž může kabel napájet i zařízení s USB OTG momentálně pracující jako Device, ale jen díky softwarovému přepnutí režimu protokolem MNP. Napájení musí být stabilizováno, monitorováno, chráněno proti nadproudu a odpojitelné, pokud se detekuje nadproud nebo Host zařízení je v nízkopříkonovém sleep módu. V případě rozhraní USB OTG pak navíc je nutné napájení sběrnice připojovat jen pokud zařízení je provedením konektoru či zástrčky propojovacího kabelu pasováno do režimu Host. Řízení napájení však je obvykle nutné provádět kompletně externě nebo s použitím obecných víceúčelových GPIO vstupů a naprogramovaného programu, tj. není to řízeno USB registry MCU (alespoň tak tomu je u 32bitových MCU Freescale ColdFire) - viz příklad na následujícím obrázku, kde všechny signály USB_VBUS_CHG, USB_VBUS_DSCHG, a USB_VBUS_ON jsou řešeny softwarově a fyzicky jsou tvořeny GPIO vývody.

Napájení u USB OTG rozhraní vyžaduje stabilizaci, spínání a monitorování jeho stavu. Bohužel to však obvykle není součástí USB modulu MCU a je nutné to řešit buď speciálními k tomu určenými externími obvody nebo jako zde univerzálními GPIO vývody a programem s pomocí stavového USB registru.

Typické blokové schéma na USB OTG modulu / řadiče na chipu MCU

Implementace specifikace USB OTG (On-The-Go), tedy duálního řadiče (DM controller) obvykle dnes poskytuje FS a LS rychlost komunikace dle specifikace USB 2.0 a schopnost funkce jak v režimu Host, tak v režimu Device. V jedné chvíli však může být aktivní pouze jeden z těchto režimů (tedy buď Host nebo Device), vyjma provedení MCU s více nezávislými USB moduly či řadiči. Přepínání mezi nimi se provádí pomocí protokolu MNP (master negotiation protocol), který je součástí specifikace USB OTG.

USB OTG moduly v 32bitových MCU ColdFire společnosti Freescale podporují až 16 obousměrných koncových bodů, mají FIFO vysílací a přijímací buffery (Tx FIFO a Rx FIFO), DMA řadič pro přímý přístup do paměti MCU při vysílání a příjem velkých bloků dat bez nutnosti zásahu ColdFire jádra, USB řadič a logiku pro realizaci OTG protokolu (Serial Interface Engine) a předzpracování USB paketů před jejich zpracováním Coldfire jádrem nebo uložením do paměti (ColdFire Core Interface). USB řadič je pak na straně vývodů připojen k obvodu USB XCVR vytvářejícím fyzické rozhraní (USB transceiver) a k obvodu časování a taktování tvořeného digitální fázovou smyčkou DPLL. V ColdFire jádře pak komunikaci na softwarové úrovni zajišťuje USB Stack komunikující s hardwarem prostřednictvím ukazatelů na buffer a EHCI registrů specifikovaných USB specifikací. O tom však blíže v 3. a 4. díle tohoto seriálu.

Typické blokové schéma USB OTG modulu v 32bit. MCU s jádrem ColdFire

Konkrétní ukázky připojení USB OTG rozhraní MCU ColdFire™ MCF532x

Z pohledu hardwarového připojení a řešení USB OTG z celé nabídky Freescalu je asi nejvíce zajímavý MCU ColdFire™ MCF532x, který obsahuje dva na chipu integrované oddělené USB moduly:

  • dedicated USB host modul
  • dual-role modul

Dual-role modul pak může pracovat a chovat se jak jako USB Host, tak i jako USB Device nebo USB OTG (On-The-Go). A to jak z pohledu komunikace, tak i z pohledu fyzického připojení. Oba moduly pak mají USB transceiver se schopností provozu v plném FS i nízkorychlostním LS režimu (full-speed a low-speed). Navíc dual-role modul může s použitím doplňkové UTMI+ rozhraní (sběrnice) připojit ULPI transceiver s jehož pomocí lze získat i schopnost vysokorychlostní HS (High-Speed) 480 Mbps komunikace. Poskytovaná flexibilita znamená, že MCU MCF532x je z pohledu USB komunikace skutečně univerzální a není žádná aplikace, kde by jej nebylo možné použít.

Blokové schéma USB OTG modulu MCU ColdFire™ MCF532x

MCU MCF5253 má v sobě implementovaný USB OTG modul. Ten může být připojen k jednomu nebo dvěma externím portům (konektorům). Souhrně se modulu a externím portům říká USB rozhraní, jehož blokové schéma je na vedlejším obrázku.

USB modul (serial interface engine) splňuje specifikaci USB 2.0. Registry a datové struktury jsou založeny na EHCI specifikaci (Enhanced Host Controller Interface Specification for Universal Serial Bus from Intel Corporation). Modul může pracovat v režimu Host, Device nebo jako OTG (On-The-Go), tj. přepínatelný režim Host/Device. Modul je tvořen USB transceiverem (USB PHY) připojeným k USB OTG řadiči, DMA řadičem, který zprostředkovává přímý přístup do paměti a tím snižuje zatížení procesoru a zvyšuje průchodnost. Na čipu intergovaný transceiver se shoduje se specifikací UTMI+ a podporuje HS, FS i LS rychlost přenosu dat v Host i v Device režimu. Navíc obsahuje hardwarově integrované prostředky pro realizaci funkce OTG. Fyzické rozhraní má vestavěné vlastní časování (PHY Clock) pro generování taktování USB komunikace, které jsou tvořené integrovaným 24 MHz oscilátorem a smyčkou fázového závěsu PLL. Taktování samotného řadiče je pak odvozeno od frekvence hodin samotného procesoru (ColdFire jádra). Primární funkce PHY rozhraní je izolovat zbytek USB modulu od tranceiveru a přetransformovat všechny signály na taktování modulu. To umožňuje modulu běžet synchronně s procesorem (jádrem) MCU a jeho dalšími periferiemi.

Hardwarové připojení MCU jako USB Host

Pro tento požadavek je nutné použít integrovaný dual-mode USB model. Následující obrázek pak ukazuje typické připojení vývodů MCU MCF532x. Podobné připojení pak platí i pro USB OTG režim pracující jen v režimu Host.

Pro vytvoření fyzického USB rozhraní (konektoru) se doporučuje použít 33 Ohmové terminálové rezistory, které by měly být umístěny co nejblíže vývodům MCU. Ty totiž pomáhají maximalizovat hysterezi (rozdíl) napěťových úrovní log.0 a log. 1 (úrovně LOW a HIGH). Zároveň provoz v režimu USB Host vyžaduje připojení pulldown rezistorů na oba datové komunikační vodiče, tj. D+ a D-. Jinak z pohledu fyzického vzhledu konektoru, resp. zástrčky, se pro režim Host používá provedení typ-A. Zde však je možné zvolit buď provedení standardní velikosti A nebo provedení mini-A. Pro převod z jednoho na druhý existují redukce.

Příklad realizace USB Host rozhraní z USB OTG modulu MCU MCF532x

Z jiného soudku je pak realizace napájení USB kabelu. MCF532x totiž neobsahuje řízený napájecí výstup pro přivedení 5 V na VBUS vodič konektoru. Proto je nutné použít některý externí integrovaný obvod nebo řídící logiku. Nejde totiž jen o přivedení napětí, ale obvod pro napájení USB musí mít i schopnost detekovat nadproud dle požadavků USB standardu a možnost napájení odpojit. Použít tak lze jak speciálně pro účely USB navržený obvod MAX1931 společnosti MAXIM nebo i třeba víceúčelový napájecí čip, jakým například je integrovaný obvod MIC2026 společnosti Micrel. Pro tyto účely MCF532x poskytuje dva signály:

  • USBHOST_VBUS_EN - výstupní signál, která je aktivní, když je vyžadováno napájení USB sběrnice = povolovací signál pro napájeni IO
  • USBHOST_VBUS_OC - vstupní signál od napájecího IO, který MCU informuje, zda bylo naměřeno příliš velké zatížení sběrnice (detekován nadproud)

Výstup USBHOST_VBUS_EN je řízen bitem PORTSC[PP], který když má hodnotu log.1 je vyžadováno napájení USB sběrnice a tedy i na USBHOST_VBUS_EN je log. 1. Naopak pokud se na vstupu USBHOST_VBUS_OC objeví aktivní signál (polarita je programovatelná bitem BCR[VBUS_OC_POL]), nahodí se bit PORTSC[OCA], který pak automaticky způsobí shození bitu PORTSC[PP] a tím nakonec i vypnutí napájení sběrnice. PCE bit (port change interrupt) v registru USBINTR pak o tomto stavu informuje běžící program.

Hardwarové připojení MCU jako USB Device

USB dualita mikrokrokontroléru MCF532x jej samozřejmě umožňuje používat plně v režimu USB Device, tj. v režimu, kdy lze zařízení z pohledu datové komunikace připojit jen k zařízení chovající se jako USB Host. Přímo lze realizovat FS nebo LS rychlost komunikace, zatímco při požadavku vysokorychlostního režimu HS je nutné použít externí USB transceiver připojený k MCU přes rozhraní ULPI. V rychlosti FS USB Device režimu pak stačí na čipu umístěný transceiver doplnit externími 33 ohmovými sériovými terminálovými rezistory, které by opět měly být fyzicky umístěny co nejblíže vývodům součástky, aby se maximalizovala hystereze (rozdíl) napěťových úrovní log.0 a log. 1 (úrovně LOW a HIGH) a pullup rezistor připojený na jeden datový vodič (D+ nebo D-) pro indikaci jeho komunikační rychlosti. Pro plnou rychlost FS (Full-Speed) se 1.5 kohmový rezistor připojuje na datový vodič D+, pro rychlost LS na vodič D-. Jinak samotné MCU MCF532x poskytuje uvolňovací signál pro pullup rezistor, když je USB modul inicializován. USBOTG_PU_EN signál je řízen BVLD bitem řídícího stavového registru UOCSR. Ten když je "vynulován", je signál USBOTG_PU_EN ve stavu log. 0 (LOW). Pro buzení externího pullup rezistoru se však nesmí využívat pouze zmíněného signálu, ale také USB specifikace vyžaduje, když je VBUS napájení sběrnice vypnuté, aby tento signál byl neaktivní. Protože však vstupy MCU MCF532x neumožňují detekovat 5 V logický signál, musí se použít snižující nebo proud limitující rezistor k zabránění poškození vstupů. Když je GPIB nebo IRQ detekován ve stavu HIGH provede se inicializace USB modulu a UOCSR[BVLD] bit se nastaví na úroveň HIGH.

Jinak k fyzickému připojení USB Device zařízení je určen konektor typu B, který již na první pohled, mechanicky i elektricky "světu" označuje, že se připojuje zařízení USB Device (na opačné straně propojovacího kabelu musí být konektor typu A = USB Host). Dle velikosti výsledného zařízení lze pak využít provedení standardní (standard-B) nebo miniaturní (mini-B), které je součástí specifikace USB 2.0.

Příklad realizace USB Device rozhraní z USB OTG modulu MCU MCF532x

Hardwarové připojení MCU jako USB OTG

Následující obrázek pak ukazuje typickou hardwarovou realizaci plné přepínatelné duální FS/LS komunikace USB OTG. Z pohledu dovybavení externími součástkami je podobně jako u režimu USB Host nutné připojit terminálové 33 ohmové rezistory. Pro OTG provoz je nutné přepínat na datové vodiče pullup nebp pulldown rezistory v závislosti na právě provozovaném módu, tedy zda rozhraní zrovna pracuje jako Host nebo jako Device. To neumí samotný USB blok na čipu MCU, ale je nutné k použít externí obvod, například MAX3353E, který úplně eliminuje potřebu klasických diskrétních pullup/pulldown rezistorů připojených a řízených přes GPIO vývody.

Obvod MAX3353E je nábojová pumpa pro USB OTG s integrovanými přepínanými pullup/pulldown rezistory a je řízen z MCU přes sériové rozhraní I2C (vývody SCL a SDA). Mimo schopnosti programově řídit připnutí či odepnutí pullup/pulldown rezistorů zároveň umí monitorovat a řídit přítomnost napětí VBUS, včetně jeho pulsování pro potřeby realizace OTG SRP protokolu. Dále může volitelně poskytovat hlášení o stavech komunikace do MCU přes výstup ID_OUT. Ten může být volitelně připojen na GPIO vývod a nebo vstup pro externí přerušení MCU, jehož software tak může sledovat stav ID signálu na USB konektoru. Stav ID vývodu také lze přečíst přes I2C z registru obvodu MAX3353E. Jako konektor u USB OTG je předepsán typ mini-AB, do kterého lze "zastrčit" jako zástrčku mini-A, tak mini-B. To je v souladu s dualitou OTG, která se podle stavu ID vodiče/signálu určí typ zasunuté zástrčky se přepne do režimu napájecího zařízení sběrnice nebo naopak začne být napájen.

Příklad kompletní realizace hardwarové části USB OTG rozhraní pro LS a FS přenos pomocí USB OTG modulu MCU MCF532x

Jak již bylo zmíněno výše, USB modul umožňuje připojit externí ULPI USB PHY (transceiver), který poskytuje HS komunikaci. Ukázka možného připojení je na obrázku níže. ULPI transceiver již obsahuje integrované terminálové rezistory i programovací pullup a pulldown rezistory. Zároveň může poskytovat i napájení USB kabelu, pokud pracuje v režimu Host. Interní nábojová pumpa chipu však má omezené proudové zatížení. Pokud tedy je potřeba poskytovat sběrnici větší proud, je nutné použít externí zdroj řízený z transceiveru. To je obvykle nutné v případech, kdy MCU bude pracovat pouze v čistém režimu Host (ne jako OTG) a má napájet "žíznivější" USB zařízení v režimu Device.

Příklad řešení hardwarové části USB OTG rozhraní pro HS přenos s použitím ULPI rozhraní MCU a externím transceiverem

Závěr 2.dílu

Jak lze z výše uvedeného vidět, hardwarová realizace není pouze o tom, připojit kontakty USB konektoru na vývodu MCU. Je nutné vzít některé věci v úvahu a pokud analyzujete nebo si jen tak prohlížíte nějakou desku s USB je dobré vědět, proč tam ty odpory či další integráče jsou. Další díly se pak budou více zabývat tím, jak to pracuje uvnitř MCU a jak funguje USB Stack poskytovaná Freescalem.

Antonín Vojáček

DOWNLOAD & Odkazy

Hodnocení článku: 

Komentáře

Zdravim,

malicka, nepodstatna, usmevna, ale predsa len chybicka sa vludila.
Na prvom obrazku, kde je nakreslene twistovanie vodicov prislucha oznaceniu vodica D- na lavej strane oznacenie vodica D+ na pravej strane.
Ale myslim, ze vsetkym je jasne, ze sa jedna o ilustracny obrazok. :-)

Martin