3.18. Nozioni di base su UART

Una UART (Universal Asynchronous Receiver-Transmitter) è il modo più antico e semplice per spostare byte tra due microcontrollori, oppure tra un microcontrollore e un PC host. Due fili trasportano i dati – uno per ciascuna direzione – e una massa condivisa riporta il segnale. Nessuno dei due lati utilizza un clock condiviso; concordano in anticipo un baud rate e ricostruiscono la temporizzazione dei bit a partire dalla linea dati stessa.

3.18.1. Il frame

Ogni carattere sulla linea è racchiuso in un frame: un bit di start, i bit di dati, un bit di parità opzionale e uno o due bit di stop.

La forma d'onda di un frame UART. Il segnale rimane inattivo a livello alto a sinistra, scende a livello basso per un tempo di bit (il bit di start), poi trasporta in sequenza otto bit di dati, quindi torna a livello alto per un tempo di bit (il bit di stop) prima di tornare allo stato di inattività.

Un frame UART: un bit di start, otto bit di dati e un bit di stop, ciascuno largo un periodo di bit (1 / baudrate secondi).

La linea rimane inattiva a livello alto. Il ricevitore attende un fronte di discesa, che segna l’inizio di un nuovo frame. Quindi campiona la linea dati una volta per periodo di bit – tipicamente al centro di ciascun bit – e riassembla i bit in un carattere. Il bit di stop riporta la linea allo stato di inattività, in modo che il bit di start successivo possa essere rilevato.

3.18.2. Il baud rate

Il periodo di bit – e la velocità del collegamento – è determinato dal baud rate, il numero di bit al secondo. 9600, 19200, 38400, 57600, 115200, 230400, 460800 e 921600 sono i valori standard; 115200 è il valore predefinito più comune. Entrambe le estremità devono concordare sul baud rate con uno scarto di pochi punti percentuali, altrimenti il ricevitore campiona i bit nei punti sbagliati e i dati risultano corrotti.

I baud rate più elevati spostano più dati al secondo, ma sono più sensibili alla lunghezza del cavo, alla capacità e alla precisione dei clock a ciascuna estremità. Per collegamenti brevi tra due schede sullo stesso banco di lavoro, da 115200 a 921600 funziona senza problemi.

3.18.3. Cablaggio

Un collegamento UART utilizza tre fili:

Due schede etichettate A e B, collegate da tre fili. Il pin TX della scheda A si collega al pin RX della scheda B; il pin TX della scheda B si collega al pin RX della scheda A; e i pin di massa di entrambe le schede sono collegati tra loro.

Cablaggio UART: il TX di una scheda va all’RX dell’altra, ed entrambe le masse sono collegate.

  • TX → RX, in entrambe le direzioni. Il pin di trasmissione di ciascuna scheda è il pin di ricezione dell’altra. Un errore comune dei principianti è cablare TX → TX – due uscite che si contendono la linea, senza alcun dato su nessuno dei due ricevitori.

  • Massa condivisa. I livelli del segnale sono riferiti alla massa, quindi le due schede devono avere una massa comune, altrimenti il ricevitore vede una tensione errata sulla linea.

3.18.4. Livelli di tensione e livelli fisici

I livelli del segnale sui pin UART della camera sono CMOS a 3,3 V: massa per uno zero logico, 3,3 V per un uno logico. Qualsiasi dispositivo che parli UART CMOS a 3,3 V – un altro microcontrollore, un adattatore USB-seriale impostato a 3,3 V, un modulo GPS a 3,3 V – può essere collegato direttamente.

Nota

I dispositivi UART CMOS a 5 V (microcontrollori più datati, alcuni moduli GPS, alcune vecchie schede di breakout per sensori) parlano lo stesso framing UART a livelli logici di 5 V. Collegarli direttamente alla camera non è sicuro: un TX a 5 V che pilota l’RX della camera supera la tensione massima assoluta di ingresso sulle cam che non sono tolleranti ai 5 V, e il TX a 3,3 V della camera potrebbe non raggiungere la soglia di livello alto del dispositivo a 5 V per un uno logico pulito.

La conversione tra le due tensioni richiede un driver di linea attivo – un IC traslatore di livello bidirezionale dedicato, con propri transistor di pilotaggio su entrambi i lati di ciascuna linea. I traslatori passivi a MOSFET e pull-up di Adattamento di livello non sono sufficienti in questo caso: i loro fronti di salita si basano sulla carica della linea attraverso un resistore, il che va bene alle velocità di commutazione ma è di gran lunga troppo lento per UART. A 115200 baud ogni bit dura circa 8 µs, e lo slew RC del traslatore passivo confonde un bit con il successivo.

Un driver di linea attivo produce fronti puliti in entrambe le direzioni alle massime velocità UART. Scegli un componente dimensionato per il baud rate al quale opererà il collegamento, collega il TX e l’RX della camera al lato a 3,3 V del traslatore e collega il TX e l’RX del dispositivo a 5 V al lato a 5 V del traslatore.

Tre livelli fisici più datati utilizzano lo stesso framing ma tensioni diverse, e richiedono un convertitore di livello tra essi e un microcontrollore a 3,3 V:

  • RS-232. Utilizzato dalle porte seriali sui PC desktop e da alcune apparecchiature industriali. La linea oscilla tra circa ±5 V e ±15 V, con lo stato di inattività sul rail negativo. Polarità invertita e tensione elevata rispetto al CMOS; un chip della famiglia MAX232 / MAX3232 (o simile) gestisce la conversione.

  • RS-422. Uno standard di segnalazione differenziale per collegamenti punto-punto (un driver, fino a dieci ricevitori). Il driver trasmette su una coppia di fili bilanciata; il ricevitore vede la differenza tra essi e ignora il rumore di modo comune lungo il percorso. I collegamenti full-duplex utilizzano due coppie – una per ciascuna direzione. RS-422 raggiunge da decine di metri fino a un chilometro a seconda del baud rate, e un chip transceiver RS-422 si interpone tra il TX / RX della camera e la coppia bilanciata.

  • RS-485. Il cugino multi-drop di RS-422 – la stessa segnalazione differenziale, ma progettata per collegare fino a 32 driver e ricevitori su un unico bus. La maggior parte dei collegamenti è half-duplex su una singola coppia, con il driver e il ricevitore di ciascun nodo che condividono gli stessi fili e con il software che arbitra chi può trasmettere. Utilizzato nei bus dell’automazione industriale (Modbus, DMX512, Profibus), dove i cavi percorrono lunghe distanze e il rumore è elevato; un chip transceiver RS-485 si interpone tra il TX / RX della camera e la coppia differenziale.

Entrambi inviano comunque frame UART a livello di bit sottostante. La configurazione machine.UART della camera (baud rate, bit, parità, bit di stop) è la stessa indipendentemente da quale livello fisico trasporti il segnale sull’altro lato del transceiver.