USB debug con l’oscilloscopio digitale

USB debugging

L’USB, Universal Serial Bus, è diventato un’interfaccia dominante per i moderni personal computer, sostituendo molti dei bus esterni seriali e paralleli usati in precedenza. Sin dalla sua introduzione nel 1995, USB è cresciuto oltre il suo originale utilizzo ed è diventato l’interfaccia standard più comune per i dispositivi elettronici. La specifica USB 2.0, rilasciata nel 2000, copre la maggior parte dei dispositivi utilizzati oggi. È stata sostituita alla versione 1.1, con l’aggiunta di un’interfaccia ad alta velocità. L’USB si è espansa oltre la comunicazione system-to-system. Nel 2008 è stata rilasciata la specifica 3.0, chiamata Superspeed USB, dieci volte più veloce della versione 2.0 e retro compatibile con essa. USB 3.0, che non ha ancora avuto la diffusione sperata, è una specifica addizionale che viene usata insieme alla specifica USB 2.0 e non la sostituisce. Essa infatti deve implementare i comandi del framework USB 2.0 e i descriptor. L’USB-IF (USB Implementers Forum) gestisce e promuove lo standard USB.

USB: come funziona

La configurazione USB consiste in un host controller con un numero di dispositivi compreso tra 1 e 127. L’host è il solo master e controlla tutto il traffico del bus. L’host inizializza tutte le comunicazioni di un dispositivo e i dispositivi stessi non sono in grado di interrompere l’host. Esistono quattro velocità USB (come mostrato in figura).

La velocità del bus USB 2.0 è limitata dal dispositivo più lento connesso all’host controller. Con Superspeed USB, vengono invece usati due host controller: uno per i dispositivi SuperSpeed e uno per quelli USB 2.0. Anche in questo caso, come in un sistema USB 2.0, la velocità del bus con i dispositivi USB 2.0 è limitata dal dispositivo più lento.

Endpoint dei dispositivi

Gli endpoint di un dispositivo rappresentano i dati sorgente e i sink nel dispositivo. Ogni dispositivo può avere fino a 16 endpoint di dati (figura).

Endpoint 0 è obbligatorio e viene utilizzato dall’host per comunicare con il dispositivo. Un pipe è la connessione più logica tra l’applicazione software nell’host e l’endpoint del dispositivo.

Enumerazione

L’enumerazione è il processo di configurazione che si verifica in stato power-on o quando un dispositivo è hot plug. L’host individua la presenza di un dispositivo sul bus USB. Poi, l’host interroga il dispositivo con il token Setup utilizzando l’indirizzo 0 e l’endpoint 0. Successivamente l’host assegna un indirizzo unico al dispositivo nel raggio di 1 a 127. Inoltre, l’host identifica la velocità del dispositivo e il tipo di trasferimento dati. Durante l’enumerazione viene determinata una classe di dispositivi, che definisce la funzionalità dello stesso dispositivo come la stampante, il video, l’audio, ecc.

Configurazione elettrica

L’host utilizza un connettore upstream A e i dispositivi un connettore downstream B, come mostrato in figura.

Ogni connettore ha tre versioni: standard, mini e micro. Il cavo USB 2.0 ha quattro fili, due dei quali vengono utilizzati per fornire energia dall’host, cioè da 100 mA a 500 mA con un’intelligente gestione dell’energia. Per esempio, l’alimentazione verso un dispositivo può essere monitorata dall’host o dall’hub e bloccata se si verifica una condizione di sovraccarico. Per le comunicazioni bidirezionali viene usata una coppia di fili differenziale Data+ (D+ filo verde) e Data- (D- filo bianco), usufruendo di una segnalazione differenziale half-duplex controllata dall’host. I livelli del segnale sono elencati nella tabella.

Il bus è DC-coupled, l’host abbassa D+ e D- quando nessun dispositivo è connesso; questo viene chiamato stato SE0 (single ended zero). La tensione del bus USB viene portata a negativo o a positivo quando un dispositivo è connesso sul bus e la polarità indica la velocità del dispositivo. Nello stato idle J, un dispositivo a bassa velocità alza D-, con il risultato che si crea un differenziale di tensione negativo. Un dispositivo full-speed, invece, alza D+ e da vita ad un differenziale di tensione positivo. Lo stato K è l’opposto dello stato J. La trasmissione dati utilizza una codifica NRZI (non return to zero inverted) con un riempimento di bit per assicurare un numero minimo di transizioni. Il bit meno significativo viene trasmesso per primo e il più significativo per ultimo.

Pacchetti

I pacchetti sono gli elementi fondamentali delle comunicazioni USB. I pacchetti iniziano con un campo di sincronizzazione seguito dall’identificatore di pacchetto. Il campo end-of-packet termina il pacchetto. Iniziando dallo stato idle J, un pacchetto comincia con un campo di sincronizzazione a 8-bit (SYNC) per USB low-speed e full-speed.

Nella figura SYNC è rappresentato da tre coppie KJ seguite da una KK. Il campo SYNC per USB ad alta velocità è rappresentato da 15 coppie KJ seguite da due KK e gli hub possono ridurre la ripetizione del campo SYNC a cinque coppie KJ seguite da due KK. L’identificatore di pacchetto (PID) è il byte del secondo pacchetto, costituito da un PID a 4 bit e il suo PID a 4 bit complementare per il controllo degli errori. Un errore nella codifica PID avviene quando i primi 4 bit del PID non corrispondono ai loro complementari. Il valore dei 4 bit dl PID identifica 17 tipi di pacchetti, come mostrato nella tabella.

I pacchetti di notifica PRE e ERR hanno lo stesso codice PID. EOP (end of packet) è lungo 3 bit. Inizia con due bit di SE0 e finisce con un bit di stato J.

Pacchetti handshake

I pacchetti di handshake, come i pacchetti di dati accettati e non accettati, sono composti da byte SYNC, byte PID ed EOP, come si vede in figura

Pacchetti token

L’host invia pacchetti token che sono costituiti da SYNC e PID, seguiti da due byte composti da un indirizzo a 11 bit e da un controllo della ridondanza ciclica (CRC) a 5 bit. 

L’indirizzo a 11 bit dei token SETUP, OUT e IN e sottodiviso in un indirizzo del dispositivo a 7 bit e in un endpoint identifier a 4 bit. L’indirizzo zero è speciale ed è per un dispositivo cui non è stato assegnato un indirizzo all’inizio del processo di enumerazione. Più avanti l’host assegna un indirizzo diverso da zero. Tutti i dispositivi hanno un endpoint zero, che si usa per il controllo e lo status del dispositivo. Altri endpoint servono per i dati e/o per i sink. L’host invia un token OUT ad un dispositivo, seguito da un pacchetto di dati; quando invia un token IN si aspetta di ricevere un pacchetto di dati o un pacchetto handshake, come il NAK, dal dispositivo.

Pacchetti di dati

I pacchetti di dati contengono un byte PID, byte di dati e un CRC a 16 bit, come mostrato in figura.

I pacchetti DATA0 e DATA1 hanno una sequenza numerica a 1 bit che viene usata nelle richieste handshake di ripetizione automatica stop and wait. I pacchetti DATA0 DATA1 si alternano nella trasmissione priva di errori. I pacchetti di dati vengono rinviati con la stessa sequenza numerica quando si verifica un errore di trasmissione. Una transizione di dati senza errori avviene quando l’host invia un pacchetto DATA0 al dispositivo, il dispositivo invia un pacchetto ACK handshake e poi l’host invia un pacchetto DATA1. Se l’host non riceve un pacchetto ACK handshake o riceve un NAK dal dispositivo, rinvia il pacchetto DATA0. Se il dispositivo invia un pacchetto ACK e riceve un pacchetto dati con la stessa sequenza numerica, il dispositivo viene a conoscenza del pacchetto dati ma ignora i dati perché li considera un duplicato.

Start of frame

Il pacchetto Start of frame (SOF), mostrato in figura, viene utilizzato per sincronizzare i flussi di dati isocroni.

Debug dell’USB 2.0 con l’oscilloscopio digitale

Il modulo di applicazione DPO4USB attiva il triggering seriale USB e il supporto di analisi sull’oscilloscopio della serie MSO/DPO4000B. L’applicazione SR-USB attiva il serial triggering USB e l’analisi sugli oscilloscopi delle serie MSO/DSA/DPO7000C, DPO7000c e MSO/DPO5000. Per gli USB low-speed o full-speed, il trigger, la decodifica e la ricerca, viene offerto il supporto in tutti i modelli di oscilloscopio.

Per gli USB high-speed è invece richiesto un oscilloscopio a 1GHz per utilizzare il trigger, la decodifica e la ricerca fornite dalle applicazioni DPO4USB e da SR-USB. Per fare un esempio, la prestazione sulla latenza dei dati di un dispositivo di memorizzazione full-speed viene controllata osservando se il dispositivo di memorizzazione risponde con NAK alla richiesta token IN del computer per i dati che provengono dal dispositivo. Viene allora utilizzato un Differential Probe TDP1000 per sondare un cavo di estensione USB tra il computer e il dispositivo USB. Prima di connettere la sonda al cavo, è opportuno utilizzare il tasto TDP1000 del menu sulla sonda per portare su AutoZero il range di 4.25 V della sonda.

Per definire un bus USB, bisogna andare sul menu del bus e selezionare USB dalla lista degli standard supportati, quindi seguire i tasti setup dalla sinistra alla destra per definire i parametri del bus: velocità, canali sorgente, tipo di sonda e soglie. In questo esempio sono state utilizzate soglie full-speed preconfigurate a 1.4 V e -1.4 V. Per prima cosa, è possibile controllare il processo di enumerazione innescando il token SETUP.

Dopo l’enumerazione, si possono controllare i pacchetti SOF e verificarne la velocità controllando se lo stato idle J è positivo oppure misurando l’ampiezza di bit del campo SYNC SOF. Di seguito, si può configurare l’oscilloscopio per innescare un token NAK e poi mettere l’oscilloscopio nella modalità di acquisizione Single. Se il dispositivo di memorizzazione è pronto per trasferire i dati, allora l’oscilloscopio non si innescherà, ma, se il dispositivo non è pronto, invierà un NAK in risposta al token IN dell’host del computer e così l’oscilloscopio attiverà il NAK. L’acquisizione NAK è mostrata in figura.

Si possono anche copiare le impostazioni di innesco dell’oscilloscopio in modo che siano i criteri di ricerca per Wave Inspector. Wave Inspector cercherà attraverso l’intera acquisizione alla ricerca della presenza di un NAK. In questo caso, Wave Inspector ha trovato 11 NAK; il primo è in posizione di innesco e gli altri dieci vengono di seguito. Tutti i NAK sono in risposta all’host del computer che rinvia il token. Ogni NAK si può vedere facilmente utilizzando i tasti Next e Previous sul pannello di controllo di Wave Inspector. La capacità di innesco USB delle serie MSO/DPO5000 e MSO/DPO4000B include i seguenti tipi:

- SYNC

- Reset

- Suspend

- Resume

- EOP

- Pacchetto token

- Pacchetto dati SETUP, IN, OUT e SOF

- Ogni valore da dato, DATA0, DATA1, DATA2 o DATAM (solo alta velocità)

- Ogni valore handshake, o ACK, NAK, STALL, NYET (solo alta velocità).

- PRE (solo full-speed) o ERR, SPLIT o PING (solo alta velocità).

Con l’oscilloscopio della serie MSO/DPO4000B, con il modulo d’applicazione DPO4USB, con gli oscilloscopi delle serie MSO/DSA/DPO70000C, DPO7000C e MSO/DPO5000 e con l’applicazione SR-USB, è possibile ottenere e analizzare i segnali, il protocollo e i dati USB 2.0 e poi correlarli ad altri segnali digitali e analogici per offrire una completa visibilità del progetto.

Gli oscilloscopi digitali Tektronix sono disponibili da Farnell


L’articolo è tratto da Debugging Serial Buses in Embedded System Designs di Gina Bonini Technical Marketing Manager @Tektronix.

Oscilloscopio digitale Tektronix MSO2024

L’oscilloscopio Tektronix (4 canali, display TFT color, 200Mhz di banda e campionamento a 1Gsps) è disponibile subito qui nello store.

 

Leave a Reply