Sul blog di Elettronica Open Source puoi leggere non solo tutti gli articoli Premium riservati agli abbonati Platinum 2.0 e inseriti nella rivista Firmware 2.0 (insieme ad articoli tecnici, progetti, approfondimenti sulle tecnologie emergenti, news, tutorial a puntate, e molto altro) ma anche gli articoli della Rubrica Firmware Reload. In questa Rubrica del blog abbiamo raccolto gli articoli tecnici della vecchia rivista cartacea Firmware, che contengono argomenti e temi evergreen per Professionisti, Makers, Hobbisti e Appassionati di elettronica. Scopo di questo articolo è quello di fornire una presentazione delle principali caratteristiche e dei vantaggi offerti dalla tecnologia USB On-The-Go (OTG) introdotta come supplemento allo standard USB 2.0 ed ora ampiamente disponibile nei dispositivi e nelle periferiche di tipo commerciale.
Introduzione
L’interfaccia USB ha conosciuto negli ultimi anni un’enorme diffusione, al punto tale da aver sopravanzato le tradizionali interfacce di tipo seriale e parallelo. Ciò ha interessato non soltanto il settore delle periferiche e degli accessori destinati ai personal computer, ma ha anche influenzato il mondo dei sistemi embedded, grazie anche alla crescente disponibilità di funzionalità USB sulla maggior parte dei microcontrollori di fascia medio-alta. Vediamo brevemente quali sono stati gli standard USB che si sono succeduti nel tempo, evidenziandone i principali elementi caratteristici.
USB 1.1
Lo standard USB originale fornisce un’interfaccia di tipo Master/Slave con topologia a stella, in grado di supportare fino a 127 dispositivi e fino a 6 hub. Un personal computer svolge solitamente il ruolo di Master (detto anche Host), mentre le periferiche ad esso collegate si comportano come Slave (detti anche Device). Questo standard aveva lo scopo di ridurre al minimo la complessità degli Slave, relegando la maggior parte delle funzionalità nel Master. Per quanto concerne le velocità di trasferimento, sono previsti due valori di transfer-rate: Low Speed (fino a 1,5 Mbps) e Full Speed (fino a 12,0 Mbps), mentre la lunghezza massima prevista per i cavi è pari a 5 metri. Ogni dispositivo collegato al bus, inoltre, può assorbire una potenza massima non superiore a 500 mA. Molti microcontrollori supportano oggi la funzionalità USB: la modalità Device è in genere sempre offerta, mentre non tutti (anche se la tendenza è in decisa crescita) sono in grado di funzionare come Host. La modalità Host è richiesta quando il dispositivo deve assumere il ruolo di Master e prendere pertanto il controllo delle transazioni sul bus; ciò avviene, ad esempio, quando il sistema deve essere in grado di gestire il trasferimento dati da/verso una chiavetta di memoria USB. Come si vedrà più avanti nel corso di questo articolo, la modalità Host è molto più onerosa di quella Device, in quanto occorre gestire funzionalità maggiormente complesse quali l’enumeration e l’allocazione della banda disponibile.
USB 2.0
La successiva versione di standard, USB 2.0, è in pratica un’estensione della precedente, con alcune variazioni significative tra cui l’introduzione di un nuovo valore di transfer-rate (High Speed) in grado di supportare trasferimenti dati a 480 Mbps. Come supplemento allo standard USB 2.0, nel 2001 è stato introdotto il concetto di funzionalità OTG (On-The-Go). Lo standard USB 1.1 prevedeva in sostanza la presenza di un controllore Host (generalmente un comune PC) in grado di assumere in modo continuativo il ruolo di Master. Questa assunzione, tuttavia, si dimostra eccessivamente restrittiva in numerose applicazioni in cui, viceversa, è preferibile disporre di un’elevata flessibilità. Si pensi al caso di una stampante a colori per uso fotografico: se collegata ad un PC, essa si può comportare come Device lasciando il ruolo di Host al PC stesso; se invece, in assenza del PC, viene collegata direttamente alla fotocamera, essa può assumere il ruolo di Host consentendo il funzionamento anche in assenza di un PC. OTG è nata proprio come funzionalità in grado di gestire, dinamicamente, il cambio di ruolo da Device a Host e viceversa: essa si basa su un meccanismo di auto negoziazione (simile a quanto avviene nei controllori Ethernet per l’assegnamento della velocità) attraverso il quale i dispositivi sono in grado di decidere quale ruolo assumere. La modalità OTG, dal punto di vista software, richiede la presenza sia dello stack USB Host che dello stack USB Device. In Figura 1 è mostrata un’immagine di un microcontrollore appartenente alla famiglia PIC di Microchip, in grado di supportare anche la funzionalità USB OTG.
USB 3.0
Questa recentissima versione di standard (le cui specifiche sono state rese disponibili alla fine del 2008) definisce un’interfaccia compatibile all’indietro con la precedente versione 2.0, ed in grado di supportare trasferimenti dati con transfer-rate pari o superiori a 4.8 Gbps (modalità Super Speed). Periferiche e dispositivi conformi a questo nuovo standard USB sono già disponibili a partire, anche se, per l’utilizzo destinato all’ambito dei personal computer, occorrerà anche attendere la disponibilità dei driver per i più comuni tipi di sistemi operativi.
I CONCETTI BASILARI DELL’USB
La versione base dell’USB prevede l’utilizzo di cavi con quattro fili: due per l’alimentazione (positivo e ground), e due linee dati di tipo differenziale (D+ e D-) su coppia di fili incrociati, con codifica di tipo NRZI. La scelta della modalità differenziale, rispetto a quella assoluta, presenta il vantaggio di offrire un maggiore livello di immunità al rumore. La codifica NRZI, invece, è stata scelta perché non richiede la trasmissione di un segnale di clock e pertanto, lato ricevitore, non richiede un circuito PLL (Phase Locked Loop). I connettori USB, inoltre, sono progettati meccanicamente in modo tale che, durante il collegamento tra i dispositivi, vengano applicati per primi i segnali di alimentazione e di ground e solo successivamente quelli dati. Quando il dispositivo Host parte, comincia ad interrogare i vari dispositivi collegati al bus, assegnando a ciascuno di essi un indirizzo univoco (l’indirizzo 0 è riservato all’Host), rilevandone la velocità di trasferimento ed il tipo di trasferimento dati richiesto, oltre ad altri tipi di informazioni come il produttore, il suo product ID, ecc. Questa procedura viene ripetuta ogni volta che un dispositivo viene collegato al bus USB, e prende il nome di “enumeration”. Quest’ultimo aspetto conferisce al bus USB l’importante proprietà di essere “plug-and-play”. Senza entrare nel merito della struttura dei messaggi adottati nella comunicazione su bus USB, vediamo quali sono le modalità principali di trasferimento dati.
Control: è la modalità usata dall’Host per inviare comandi o richieste parametri ai dispositivi connessi al bus. E’ utilizzata per i trasferimenti dati ad alta priorità ed include meccanismi di protezione e correzione degli errori. Questa modalità deve essere supportata da tutti i tipi di dispositivi USB.
Interrupt: è un messaggio di interrogazione inviato dall’Host verso uno specifico Device al fine di ottenere determinate informazioni. Può anche essere utilizzato da un dispositivo Device per inviare piccole quantità di dati verso l’Host (ad esempio una periferica mouse). Si tratta di una modalità di trasferimento a bassa velocità per informazioni prevalentemente di tipo periodico.
Bulk: usata dai Device per trasmettere o ricevere grandi quantità di dati (ad esempio una stampante). Prevede un meccanismo di acknowledge e, poiché utilizza l’ampiezza di banda lasciata disponibile dagli altri dispositivi, non viene utilizzata per trasferimenti di tipo critico, ma piuttosto per messaggi a bassa priorità.
Isocrona: è una modalità utilizzata per il trasferimento dati ad alta velocità (ad esempio riproduzione di brani audio), e destinata quindi agli utilizzi in applicazioni in tempo reale. Per accelerare al massimo il trasferimento, non viene supportato alcun meccanismo di protezione dagli errori. Il dispositivo Host assegna la banda disponibile ai vari dispositivi che richiedono trasferimenti con le modalità isocrona ed interrupt, fino al raggiungimento del 90% della banda disponibile: i dispositivi che successivamente richiedessero queste modalità di trasferimento, si vedrebbero negato l’accesso al bus. Questa politica garantisce che almeno il 10% della banda disponibile venga riservato per i trasferimenti con le modalità bulk e control, con priorità maggiore per quest’ultima.
USB CLASS
Un ultimo concetto fondamentale per comprendere la funzionalità USB è quello di “classe”: al fine di semplificare il più possibile le problematiche derivanti dalla connessione dei dispositivi sul bus USB, sono stati introdotti dei protocolli standard detti appunto classi (“USB Class”). Il software che implementa l’USB Host dovrebbe supportare la maggior parte, se non tutte, delle classi USB, in modo tale da poter gestire un qualunque dispositivo USB ad esso collegato. Microsoft, ad esempio, ha supportato le classi USB a partire dalla versione di sistema operativo Windows XP. Se, ad esempio, un sistema embedded deve potersi collegare ad un PC (l’Host), è opportuno che questo avvenga adottando una specifica classe USB: in questo modo, il software su PC non richiederà alcun driver addizionale per supportare la connessione (il driver è già integrato nel sistema operativo). Un elenco delle principali classi USB è il seguente:
- Human Interface Device (HID)
- Mass Storage Device (MSD)
- Device Firmware Upgrade (DFU)
- Communication Device Class (CDC)
- Audio Class HUB Class
APPLICAZIONI DI USB OTG
L’OTG ha recentemente assunto una notevole importanza grazie alla diffusione massiccia dei dispositivi portatili (“portable” in inglese), includendo in questa categoria apparecchiature quali: cellulari di ultima generazione, palmari, lettori multimediali, navigatori satellitari, fotocamere e videocamere. Per tutti questi tipi di dispositivi, data l’intrinseca natura di “portatilità”, diventa fondamentale poter comunicare direttamente senza necessariamente interporre come tramite un personal computer. USB OTG è nata proprio per soddisfare questa esigenza, attraverso la disponibilità della funzione Host (anche se limitata) oltre a quella Device, conferendo al dispositivo un ruolo duale; basso assorbimento di potenza per preservare la durata delle batterie; un piccolo connettore USB adatto a supportare questa funzionalità. Questo connettore viene anche denominato “mini-AB” (o anche “micro-AB”) ed il suo comportamento è il seguente: quando il componente OTG viene collegato tramite un cavo di tipo “mini-A”, esso funzionerà come Host, mentre quando è collegato tramite un cavo di tipo “mini- B” funzionerà come Device. Questo aspetto è considerato da taluni come una possibile fonte di “confusione” per gli utenti finali: ad esempio, per il trasferimento dati tra un PDA ed un lettore MP3 sarà necessario adottare un certo tipo di cavo, mentre per collegare entrambi al personal computer, sarà necessario usare un altro tipo di cavo. In Figura 2 è mostrata un’immagine con vari tipi di cavi USB, con adattatori di tipo A, B, mini-A, e mini-B.
In aggiunta a questi quattro tipi, esiste poi un connettore di tipo mini-AB femmina in grado di accettare sia il tipo mini-A che il tipo mini-B. Tutte le apparecchiature commerciali in grado di supportare OTG devono essere dotate di questo connettore. Lo standard USB specifica inoltre la colorazione che deve assumere la plastica all’interno di ogni tipo di connettore, come indicato nella Tabella 1.
In Figura 3 è mostrata un’immagine del connettore Mini-AB femmina (“receptacle” in inglese) installato su un dispositivo di tipo portatile.
HNP E SRP
USB OTG introduce inoltre due nuovi protocolli, denominati HNP e SRP. Nella terminologia OTG, si definisce anzitutto come A-Device il dispositivo che, inizialmente, riveste il ruolo di Host, mentre B-Device quello che inizialmente è device. Il termine “inizialmente” è molto importante, in quanto i ruoli possono essere scambiati dinamicamente a seconda delle richieste. Il ruolo iniziale viene determinato dall’orientamento del cavo: i connettori mini-AB, mini-A, e mini-B, infatti, aggiungono un quinto filo (ID) che funge da identificativo per i collegamenti di tipo OTG. Nel connettore di tipo mini-A, il pin ID è collegato a ground, mentre nel connettore mini-B è lasciato flottante. Se un dispositivo OTG riceve un connettore con l’ID collegato a ground, si comporterà come A-Device (Host), mentre nel caso opposto si comporterà come B-Device (peripheral). HNP (acronimo di Host Negotiation Protocol) è proprio il protocollo che sovraintende automaticamente il cambio dinamico di ruolo, senza la necessità di invertire l’orientamento del cavo di collegamento. SRP (acronimo di Session Request Protocol) è invece il protocollo attraverso il quale un B-Device può richiedere ad un A-Device di fornire alimentazione al bus ed iniziare una sessione di comunicazione. Essendo l’OTG orientato ai dispositivi portatili, alimentati quindi a batteria, è fondamentale avere una gestione efficiente della potenza disponibile. Per questo motivo, il bus viene alimentato solo quando ciò è strettamente necessario. Occorre inoltre fare la seguente osservazione: un USB Host di tipo tradizionale (non OTG) deve essere in grado di fornire una corrente fino a 500mA alle periferiche collegate al bus. Nel caso di USB OTG, invece, un dispositivo dual-role può funzionare fornendo una corrente di soli 8 mA, e questo valore corrisponde anche al valore massimo di corrente che un dispositivo OTG (sia di tipo dual-role che non) può assorbire dal bus.
MICROCONTROLLORI CON USB OTG MICROCHIP PIC32
Microchip Technology Inc. ha integrato la funzionalità USB 2.0 On-the-Go nella propria famiglia di microcontrollori PIC32 lo scorso anno. Il PIC32 è in grado di operare ad una frequenza massima di clock pari a 80 MHz supportando tutte le tre modalità di funzionamento USB (Host, Device, e OTG). I microcontrollori sono inoltre dotati del livello fisico (PHY) USB, consentendo un ulteriore risparmio in termini di costi complessivi. Microchip mette a disposizione dell’utente il software relativo agli stack USB, liberamente scaricabile dal proprio sito.
STM32 CONNECTIVITY LINE
Questa famiglia di microcontrollori di STMicroelectronics comprende i modelli STM32F105 e STM32F107, entrambi basati sul core a 32-bit ARM Cortex-M3. Questi microcontrollori dispongono di un’interfaccia USB OTG Full-Speed, un controllore Ethernet con supporto per il protocollo IEEE1588 PTP (Precision Time Protocol), due controllori CAN 2.0B, interfaccia audio class I2S. Tutte queste caratteristiche rendono questi controllori adatti ad applicazioni multimediali in cui, per esempio, il controllore può leggere un brano audio da un supporto di memoria, decodificarlo, e riprodurlo su interfaccia audio. Per svolgere tutti questi compiti diventa fondamentale la presenza della funzione OTG. In Figura 4 è mostrato un esemplare di microcontrollore basato sul core ARM Cortex-M3.
In casa Atmel troviamo due microcontrollori della nota serie AVR dotati di funzionalità USB OTG: l’AT90USB647 e l’AT90USB1287. Le principali caratteristiche di questi due microcontrollori si possono così riassumere:
- Performance equivalenti a 16 MIPS
- Fino a 128 kB di memoria flash
- Fino ad 8 kB di memoria SRAM
- Fino a 4 kB di memoria EEPROM
- Interfaccia integrata JTAG per eseguire il debugging
- Convertitore analogico-digitale ad 8 canali con risoluzione di 10 bit
- Alimentazione compresa tra 2.7 e 5.5 V
Atmel fornisce inoltre un completo sistema di sviluppo per la linea AVR, dotato di tutte le librerie necessarie per sviluppare un’applicazione in ambito USB. In particolare, sono supportate le principali classi USB tra cui: MSD, HID, DFU, CDC, Audio Class. Questi microprocessori di NXP sono basati sul core ARM7TDMI-S e supportano varie interfacce di comunicazione, tra cui l’USB OTG, per la quale assicurano la piena compatibilità con lo standard 2.0. In Figura 5 compare un’immagine di questo microcontrollore.
FREESCALE FLEXIS JM
Freescale Semiconductor dispone di un’ampia gamma di microcontrollori, da 8 a 32 bit, in grado di supportare a vari livelli la funzionalità USB. Tra questi, citiamo i modelli JM128 e JM64 appartenenti alla famiglia Flexis JM. Sono entrambi basati sulla CPU 32-bit ColdFire ed in grado di supportare USB 2.0 Full-Speed OTG. Una caratteristica rimarchevole della famiglia Flexis JM è quella di appartenere al “Controller Continuum” di Freescale, cioè una famiglia di MCU da 8 a 32 bit in grado di assicurare sia un’elevata compatibilità hardware (periferiche comuni) che software (il sistema di sviluppo CodeWarrior aiuta lo sviluppatore a compiere in pochi passi una “migrazione” da una MCU all’altra della stessa famiglia). In Figura 6 è riportato lo schema a blocchi di alto livello relativo al microcontrollore MCF51JM128, in cui ne sono evidenziate le principali funzionalità, mentre in Figura 7 è mostrata l’evaluation board di Freescale relativa allo stesso controllore.