Salta al contenuto
Note per Studenti Bus I2C, SPI e CAN

Bus I2C, SPI e CAN

In questa pagina 4
**: 4 fili (MOSI, MISO, SCK, CS), **full duplex**, master e slave selezionati da CS, 4 modi (CPOL, CPHA). **CAN**: bus differenziale (120 Ω) **asincrono**, messaggi **etichettati** da un identificatore (11 o 29 bit), **arbitraggio** automatico (vince l'ID più basso), bit stuffing dopo 5 bit uguali, CRC a 15 bit, contatori di errori (127, 255). -->

Oltre alla trasmissione punto-punto (Comunicazione seriale - UART, RS232, RS422 e RS485La trasmissione serialeche trasmette i bit uno dopo l'altro su una sola linea invia un bit alla volta su pochi fili. Asincrona (UART): senza clock comune, ogni dato è inquadrato da 1 bit di start, 5-8 bit di dati, parità opzionale e 1-2 bit di stop; per 8 bit di dati servono 10 bit sulla linea (efficienza 80%); tempo di bit $BT=1/bps$; il ricevitore campiona a $1{,}5,BT,2{,}5,BT,\dots$ dal fronte di start e tollera uno scostamento di frequenza di circa $\pm5{,}3%$ (o $4{,}6%$ con campionamento a 16×). Sincrona: il trasmettitore invia anche il clock (e il frame sync), efficienza 100%. Livelli fisici: RS232 ($\pm12$ V, 1 = $-12$ V), RS422/RS485 (differenziale, doppino, 10 Mbit/s su $<15$ m; RS485 multi-trasmettitore), loop di corrente 0-20 mA.Comunicazione seriale - UART, RS232, RS422 e RS485 →), i µC offrono periferiche per bus a cui si collegano molti dispositivi: espansioni di I/O, sensori (temperatura, pressione), convertitori D/A, memorie, altri nodi di una rete industriale.

Il bus I2C

Lo standard I2C (Inter-Integrated Circuit, Philips, metà anni '80) è oggi uno standard industriale. È una trasmissione seriale sincrona che permette il collegamento di molti dispositivi a un solo master con soltanto due linee: SDA (dati) e SCL (clock), entrambe collegate all'alimentazione con resistenze di pull-up (i dispositivi tirano la linea a livello basso; a riposo è alta). Molti µC hanno una periferica I2CInter-Integrated Circuit: bus seriale sincrono a due fili.

Velocità. Modo normale: da 0 a 100 kbit/s; modo fast: fino a 400 kbit/s. Se sul bus ci sono dispositivi che non supportano il fast, si resta a 100 kbit/s.

Trasferimento. Il master genera il clock per tutte le unità. I dati si trasferiscono 9 bit per volta: i primi 8 bit (MSB per primo) sono scritti dall'unità che sta trasmettendo, il nono dall'unità destinataria: se riconosce il dato, porta SDASerial DAta: linea dei dati del bus I2C a livello basso durante il 9° tempo di bit (ACK); altrimenti la linea resta alta (NACK). Il bit cambia sul fronte di discesa del clock e resta stabile fino al successivo.

Messaggio. Ogni messaggio comincia con una condizione di start generata dal master (SDA scende mentre SCL è alto) e finisce con una stop (SDA sale mentre SCLSerial CLock: linea del clock del bus I2C è alto): le due condizioni si distinguono da un normale bit perché SDA cambia durante la fase alta del clock. Il primo byte è un indirizzo a 7 bit che individua univocamente la periferica; l'ottavo bit è R/W: basso = il master scrive verso la periferica, alto = il master legge dalla periferica. La periferica indirizzata risponde con ACKacknowledgement: conferma di ricezione data dal destinatario; le altre restano inerti. Seguono i byte di dati (nelle periferiche complesse prima uno o più byte di controllo). In lettura il master può fermare la trasmissione della periferica semplicemente non dando l'ACK.

Indirizzi. Le periferiche permettono di definire l'indirizzo fissando il livello logico di alcuni piedini: di solito solo i 3 bit più bassi dei 7 sono configurabili (raramente servono più di 8 periferiche uguali). Ogni dispositivo ha quindi un indirizzo univoco sul bus.

Durata di un messaggio. Ogni byte occupa 9 tempi di bit: per nn byte (compreso l'indirizzo) la durata è ≈9 nfbus\approx\frac{9\,n}{f_{bus}} più startcondizione che apre un messaggio: SDA scende mentre SCL è alto e stopcondizione che chiude un messaggio: SDA sale mentre SCL è alto. Esempio (tema d'esame febbraio 2023): un µC invia a un DAC a 12 bit un buffer di 128 valori; ogni valore a 12 bit occupa 2 byte: 128⋅2=256128\cdot2=256 byte di dati più 1 di indirizzo =257=257 byte. A 400 kbit/s: 257⋅9400 000=5,78\frac{257\cdot9}{400\,000}=5{,}78 ms. Per un sensore di temperatura (indirizzo + 2 byte di dato = 3 byte): 3⋅9400 000=67,5 μ\frac{3\cdot9}{400\,000}=67{,}5\ \mus; il massimo ritardo tra il superamento di una soglia e l'intervento è l'intervallo di misura (20 ms a 50 Hz) più il tempo di trasmissione e di elaborazione. Per un DAC a 12 bit con FSR=5FSR=5 V: LSB=5/4096=1,22LSB=5/4096=1{,}22 mV; per una sinusoide a fondo scala campionata in 128 punti il massimo salto tra campioni consecutivi è circa 2π128⋅2047,5≈100\frac{2\pi}{128}\cdot2047{,}5\approx100 LSB.

Vero/falso tipici. I2C è sincrono (non asincrono); richiede un master (un solo master); la velocità massima è 400 kbit/s (non "sempre minore di 200 kbit/s"); le linee non sono terminate da 120 Ω (servono i pull-upresistenza collegata all'alimentazione che porta la linea a livello alto quando nessuno la abbassa; i 120 Ω sono di CAN e RS485); ogni dispositivo ha indirizzo univoco; non consente comunicazioni full-duplex (un solo filo di dati).

Il bus SPI

Un master (il µC) e più slavedispositivo che risponde ai comandi del master. Linee: SCK (clock), MOSI (master out, slave in), MISO (master in, slave out) e una linea di selezione (CS) per ogni slave. Il master avvia la comunicazione attivando la linea CS dello slave, poi invia i bit sulla linea MOSI mentre campiona MISO: è una comunicazione full duplex. Ci sono 4 modi, definiti da CPOLClock POLarity: livello logico del clock quando è inattivo (livello inattivo del clock) e CPHAClock PHAse: fronte del clock su cui si campiona il dato (su quale fronte MOSI cambia e MISO viene campionato). Il protocollo è molto stringato (nessun indirizzo, nessun ACK). Si usa per memorie flash/SD, convertitori e sensori ad alta velocità.

Il bus CAN

Il CAN (Controller Area Network) è uno standard di comunicazione seriale asincrona pensato per l'ambiente industriale (anche real-time), sviluppato da Bosch (1986) su richiesta della Mercedes: alta velocità, costi bassi, molti meccanismi di rivelazione e correzione degli errori. Ancora molto usato nell'automazione (accanto a versioni industriali di Ethernet).

Fisico. Compatibile con RS485: doppino intrecciato con impedenza controllata di 120 Ω. La velocità dipende dalla lunghezza: 1 Mbit/s fino a circa 40 m, 500 kbit/s, 250, 125 kbit/s a lunghezze crescenti, 10 kbit/s fino a 6000 m.

Messaggi senza indirizzi. I messaggi non hanno indirizzo del mittente né del destinatario: sono etichettati dal contenuto con un identificatore (11 bit nel CAN 2.0A, 29 nell'esteso), unico in tutta la rete. Ogni nodo riceve i messaggi che gli servono. Si possono aggiungere nodi riceventi senza modificare hardware o software; non c'è un gestore del bus (multicastun messaggio ricevuto da tutti i nodi interessati, senza indirizzo del destinatario).

Arbitraggio. Quando più nodi vogliono trasmettere, il bus è assegnato automaticamente in base alla priorità implicita nell'identificatorecodice che etichetta il contenuto di un messaggio CAN e ne fissa la priorità: logica wired-ANDcollegamento in cui la linea è bassa se almeno un nodo la tiene bassa, un bit "dominante" (0) prevale sul "recessivo" (1). Vince l'identificatore numericamente più basso; gli altri smettono di trasmettere. Esempio: nodo 1 con ID 1436, nodo 2 con 1335, nodo 3 con 1337: vince il nodo 2.

Quattro tipi di messaggi: Data Frame, Remote Frame (richiesta di dati), Error Frame, Overload Frame. Formato standard (CAN 2.0A): start of frame (1 bit dominante), campo di arbitraggioassegnazione automatica del bus al messaggio di priorità più alta (ID a 11 bit + RTR: basso = data frame, alto = remote frame), campo di controllo (6 bit: 2 riservati + 4 bit DLC con il numero di byte, 0-8), dati (0-8 byte), CRC a 15 bit + delimitatore, ACK a 2 bit (i ricevitori che hanno ricevuto correttamente portano a 0 il primo bit; il secondo è delimitatore), EOF (7 bit recessivi), più 3 bit di intervallo. Un messaggio con 8 byte di dati occupa 1+11+1+6+64+15+1+2+7=1081+11+1+6+64+15+1+2+7=108 bit più 3 di intervallo =111=111 bit (a 500 kbit/s: 222 μ222\ \mus, più i bit di stuffing). Un nodo che non può ricevere altri dati invia un overload frame (un bit basso dopo l'EOF).

Rivelazione degli errori. Ogni nodo rileva errori violando le regole:

  • bit stuffinginserimento di un bit opposto dopo cinque bit uguali, per rivelare errori e mantenere il sincronismo: un trasmettitore non può trasmettere più di 5 bit uguali di seguito; dopo 5 uguali ne inserisce uno opposto; un ricevitore che vede più di 5 uguali sa che c'è errore;
  • bit error: il trasmettitore legge ciò che sta trasmettendo (tranne in arbitraggio e ACK): se è diverso, errore;
  • checksum error (CRCCyclic Redundancy Check: codice a ridondanza ciclica per rivelare errori diverso), frame error (campi violati), acknowledgement error (nessuno ha confermato). Un nodo che rileva un errore invia subito un error frame (6 bit uguali: violazione dello stuffing, quindi anche gli altri nodi lo rilevano); il messaggio è ignorato da tutti e il trasmettitore lo rinvia. Ogni nodo conta gli errori in trasmissione e in ricezione: sotto 127 funziona correttamente (i contatori scendono di 1 a ogni messaggio riuscito); sopra 127 "ha problemi"; oltre 255 si stacca dal bus, così un nodo guasto non blocca gli altri.

Errori comuni

  • Dire che I2C è full duplexcon trasmissione e ricezione contemporanee o asincrono; dimenticare che l'ACK è il nono bit (9 bit per byte, non 8).
  • Scordare il byte di indirizzo nel conteggio dei byte di un messaggio.
  • Pensare che in CAN i messaggi abbiano indirizzo del destinatario: hanno solo un identificatore di contenuto.
  • Confondere l'arbitraggio CAN (vince l'ID più basso, senza perdita di dati) con una collisione.

Versione ripasso

Esercizi su questo argomento

Teoria collegata