Interfacce seriali: meglio SPI o I2C?

Interfacce SPI I2C

Dimmi che interfaccia usi e ti dirò chi sei… Esistono molti modi di interfacciarsi con un microcontrollore, ma è difficile dire quale sia il migliore. Questa è l’occasione per fare un po’ di luce su due tecniche di interfacciamento seriale: SPI e I2C.

Interfacce seriali sincrone

Le interfacce seriali sincrone sono caratterizzate dalla presenza di un segnale di sincronizzazione (clock) che determina la cadenza con cui i dati transitano attraverso il bus. Tipicamente il segnale di sincronizzazione viene generato da una unità Master e viene utilizzato dagli Slave per la trasmissione e ricezione dati. Il vantaggio di un sistema di questo tipo risiede nel fatto che tutte le unità interessate nello scambio di informazioni possono comunicare indipendentemente dal loro oscillatore locale. Questo consente di interfacciare periferiche operanti a frequenze anche molto differenti. Due tipici esempi di interfacce seriali sincrone sono appunto  SPI (Serial  Peripheral  Interface) sviluppata da Motorola e I2C (Inter Integrated Circuits) sviluppata da Philips. Lo scopo di questa trattazione è confrontare queste due soluzioni evidenziandone pregi e difetti.

Comunicazione SPI

La comunicazione SPI (evoluzione della meno recente Microwire) prevede una periferica Master che comunica con diverse periferiche Slave e richiede un bus il cui numero di conduttori dipende dal numero di periferiche connesse. In particolare il bus è composto da 3+n fili (dove n è il numero di periferiche Slave). Il Master ha infatti una connessione dedicata per  ciascuna periferica  Slave (Slave Select) come mostrato in figura 1.

Figura 1. Comunicazione SPI tra Master (microcontrollore) e 3 periferiche Slave

Figura 1. Comunicazione SPI tra Master (microcontrollore)
e 3 periferiche Slave

I segnali tipici di una comunicazione SPI sono i seguenti: SCLK: Serial shift CLocK.  È il segnale di sincronismo generato dal Master. Tale segnale raggiunge tutte le periferiche Slave. MOSI: Master Out Slave In. Questa è la linea dati in uscita dal Master. Raggiunge in  parallelo tutti  gli salve e costituisce un ingresso per ciascuno di essi. MISO: Master In Slave Out. È la linea dati in uscita da ciascuno Slave e raggiunge l’unità Master.
/SS: Slave Select. È la linea di selezione di ogni singola periferica Slave.  Esiste una linea /SS in uscita dal Master per ciascuna periferica Slave. Tali linee sono attive basse (quindi  un livello logico basso su /SSn attiva la periferica n).
La distinzione tra le linee dati da e verso le periferiche permette di ottenere una comunicazione full-duplex. Un dispositivo SPI possiede  due bit di configurazione detti CPOL (ClockPOLarity) e CPHA (Clock PHAse). Il primo determina lo stato idle del segnale di sincronismo: CPOL=0 significa che il segnale di clock è considerato idle quando è a livello logico basso. CPHA determina invece su quale fronte del segnale di clock vengono letti i dati: con CPHA=0 i dati in uscita dal Master vengono letti in corrispondenza del fronte di discesa e i dati in uscita dagli Slave vengono letti in corrispondenza del fronte di salita del segnale di clock. Disponendo di due bit di configurazione sono possibili quattro diverse modalità  e due periferiche SPI  connesse tra loro devono necessariamente utilizzare la stessa configurazione.
Tuttavia due delle quattro possibilità consentono a periferiche SPI di comunicare con le meno recenti periferiche Microwire garantendone la compatibilità.  Nelle figure 2 e 3 sono mostrate due temporizzazioni tipiche di una comunicazione SPI per il trasferimento di un byte.

Figura 2. Timing di una comunicazione SPI con CPHA=0

Figura 2. Timing di una comunicazione SPI con CPHA=0

Figura 3. Timing di una comunicazione SPI con CPHA=1

Figura 3. Timing di una comunicazione SPI con CPHA=1

La figura 2 è riferita ad una comunicazione con CPHA=0 mentre la figura  3  è  riferita  ad  una  comunicazione con CPHA=1. In ciascun diagramma sono riportati i due casi CPOL=0 e CPOL=1. Le modalità di comunicazione SPI, determinate dalle impostazioni dei due bit di configurazione, sono riassunte nella tabella di figura 4.

SPI MODE CPOL CPHA CLK EDGE (CAMBIO DATO) CLK EDGE (ACQUISIZIONE DATO)
0 0 0 Discesa Salita
1 0 1 Salita Discesa
2 1 0 Salita Discesa
3 1 1 Discesa Salita
Figura 4.  Modalità di comunicazione SPI e relativa configurazione di CPOL e CPHA

Comunicazione I2C

Una comunicazione I2C si avvale di un bus seriale a due fili ed è sempre di tipo half-duplex. La struttura di un bus I2C è riportata in figura 5.

Figura 5. Architettura di un sistema di comunicazione I2C

Figura 5. Architettura di un sistema di comunicazione I2C

I due segnali sono SCL (SerialCLock) e SDA (SerialDAta), sono entrambi bidirezionali e necessitano di una connessione verso il positivo di alimentazione mediante resistori di pull-up. Le linee SCL ed SDA sono infatti di tipo open collector per consentire l’implementazione della funzione AND cablato (wired AND) direttamente sul bus. A differenza di  una comunicazione SPI, I2C è una architettura multiMaster in cui la periferica che inizia la trasmissione e genera quindi il segnale di sincronismo è designata come Master, mentre la periferica oggetto  della transazione indirizzata dal Master è considerata come  Slave. Una periferica designata come Master per una certa trasmissione, potrà quindi essere anche uno Slave per una trasmissione successiva. La periferica Slave può in ogni momento rallentare o addirittura interrompere la comunicazione del Master, mantenendo a livello basso la linea SCL (operazione nota come clock stretching e possibile grazie al meccanismo dell’AND cablato in cui uno zero logico su una linea condivisa prevale sempre sul livello logico alto). Questa tecnica permette la corretta comunicazione dati tra una periferica Master veloce ed  una  periferica Slave relativamente lenta.  Il meccanismo dell’AND cablato consente anche di gestire l’arbitraggio: se due periferiche Master iniziano contemporaneamente  una trasmissione dati, verrà data priorità a quella che trasmette per prima uno zero logico. I dati possono essere trasferiti a velocità massime di 100Kbps in modalità Standard, 400Kbps in modalità Fast e 3.4Mbps in modalità High-Speed. Nella modalità Standard gli Slave sono indirizzati con una modalità di indirizzamento a 7 bit, mentre nelle modalità Fast e High-Speed l’indirizzamento può essere a 7 o a 10 bit. Fisicamente il carico capacitivo sul bus non deve eccedere i 400pF per non compromettere la velocità di comunicazione. In figura 6 è riportato il diagramma temporale di una tipica comunicazione I2C. Le periferiche sono level-sensitive per cui il dato deve essere stabile per tutto l’intervallo di tempo in cui la linea SCL permane a livello alto. Solo quando la linea SCL è a livello basso è possibile commutare il bit sulla linea SDA a meno di due eccezioni:

  • START: la periferica Master inizia una nuova comunicazione con una transizione da 1 a 0 mentre la linea SCL è a livello alto;
  • STOP: la transizione da 0 a 1 da parte del Master mentre la linea SCL è alta segna il termine di una comunicazione.

Nella figura 7 sono riportate le due tecniche di indirizzamento a 7bit e 10bit. Nel caso di indirizzamento a 7 bit, a seguito della condizione di start (indicata con S in figura 7) viene trasmesso un byte i cui primi 7 bit sono l’indirizzo dello Slave mentre l’ottavo bit indica se lo Slave indirizzato dovrà ricevere o trasmettere dati. Dopo l’invio del byte, solo una periferica Slave risponderà con un acknowledgment  (ACK) a seguito del quale inizierà la trasmissione dati vera e propria. Nel caso di indirizzamento a 10bit,  a seguito della condizione di start viene inviato un byte i cui i primi 7 bit sono costituiti dalla sequenza 11110xx dove xx sono i due bit più significativi dell’indirizzo della periferica target. L’ottavo bit determina ancora la direzione del flusso dati. L’invio di tale sequenza comporterà l’acknowledgement da parte di più periferiche (ACK1 in figura 7). Una volta ricevuti gli ACK si inviano i restanti 8 bit dell’indirizzo in modo che solo una periferica risponda con l’ACK (l’ACK2 in figura 7).

Figura 6. Temporizzazione di una comunicazione I2C

Figura 6. Temporizzazione di una comunicazione I2C

Figura 7. Modalità di indirizzamento a 7 bit e a 10 bit

Figura 7. Modalità di indirizzamento a 7 bit e a 10 bit

Meglio SPI o I2C?

Riassumendo quanto  già visto in  precedenza, SPI non necessita di un meccanismo di indirizzamento e lo scenario tipico vede un dispositivo Master (tipicamente un microcontrollore) ed uno o più dispositivi Slave periferici. I2C consente invece una architettura  multimaster  a due fili e ciascuna periferica (Slave) viene identificata con un indirizzo a 7 o 10 bit. Difficile dire quale delle due è la migliore in quanto la scelta di una soluzione dipende dalla velocità di  trasmissione richiesta, dal numero di periferiche nonché dalla lunghezza del bus. Risulta pertanto più costruttivo operare una comparazione tra i due sistemi in modo che l’utente abbia tutti gli strumenti per valutare quale delle due soluzioni è quella ottimale per la propria applicazione. La comparazione è riportata nella tabella a fondo pagina.

SPI I2C
CONNESSIONE DELLE PERIFERICHE
Le periferiche vengono connesse usando un minimo di tre fili e per questo motivo l’interfaccia SPI viene anche indicata come 3-wire interface. Le periferiche interconnesse condividono anche le stesse linee di alimentazione e, nel caso di più slave, è necessario disporre anche di un segnale /SS di abilitazione della singola periferica. Per la connessione di un master ed N slave sono quindi necessari 3+N fili oltre alle due linee di alimentazione. Le periferiche vengono connesse tra loro mediante due fili. Il protocollo prevede l’indirizzamento delle periferiche mediante un identificativo  a 7bit o 10bit  (nel primo caso sono indirizzabili 27=128 periferiche mentre nel secondo caso 210=1024 periferiche). In nessuno dei due casi è richiesto un chip select.
VELOCITÀ DI COMUNICAZIONE
La comunicazione  dati  in  SPI  può  raggiungere anche i 10Mbps. Il grande vantaggio della comunicazione SPI in termini di velocità è la modalità full-duplex che consente lo scambio dati nelle due direzioni simultaneamente. La comunicazione è half-duplex e può raggiungere velocità massime diverse in base alla modalità di trasmissione. In particolare:

Standard mode:       max 100Kbps
Fast mode:                 max 400Kbps
High-Speed mode:   max 3.4Mbps

ARCHITETTURA DI CONNESSIONE
Architettura master-slave. In una comunicazione SPI è consentita la presenza di un solo master ed uno o più slave. Tuttavia è possibile implementare una architettura multimaster gestendo opportunamente  via software le periferiche utilizzando il segnale /SS (Slave Select). Architettura multimaster. Il protocollo prevede un sistema di arbitraggio basato su AND cablato che consente la gestione di conflitti generati dalla trasmissione dati contemporanea da parte di più periferiche. Per le caratteristiche dell’AND cablato, viene data priorità alla periferica che trasmette per prima uno zero logico.
IMMUNITÀ AL RUMORE
La lettura/scrittura dati viene effettuata sul fronte di salita o di discesa del segnale di clock a seconda della modalità di comunicazione scelta. Questo aumenta fortemente l’immunità al rumore in quanto il dato viene campionato solamente per un breve periodo di tempo. La comunicazione è level sensitive il che significa che il dato deve essere stabile per il tempo in cui il segnale di clock è attivo (livello alto). Minore è la velocità di comunicazione maggiore è tale intervallo di tempo tanto che un livello di rumore particolarmente elevato può compromettere il singolo bit provocando la transazione di una informazione errata.

Conclusioni

Se l’applicazione prevede l’interconnessione di molti  dispositivi tra cui possono esservi più microcontrollori  funzionanti come Master, I2C diviene in questo caso una scelta obbligata. Lo stesso vale se si intende minimizzare le interconnessioni per semplificare lo sbroglio o per risparmiare porte di I/O sul microcontrollore. Se l’obiettivo  è alta velocità di trasmissione, basso costo ed alta immunità  al rumore, allora la scelta non può che ricadere su una interfaccia SPI, rinunciando però ad una architettura multimaster e sacrificando qualche I/O  in più sul vostro microcontrollore.

Leggi anche:

I2C: risoluzione delle problematiche comuni

L’SPI come canale di comunicazione: mettiamolo alla prova su Archiduino

I2C: un viaggio alla (ri)scoperta del protocollo, tra basi e funzioni avanzate

Cosa rende felice un ingegnere?

3 Commenti

  1. MaurizioPollini 6 novembre 2015
  2. f.amantea 10 novembre 2015
  3. Emanuele Bonanni Emanuele 11 novembre 2015

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!