3.21. Nozioni di base su SPI#
SPI (Serial Peripheral Interface) è un bus seriale sincrono progettato per collegamenti a corto raggio e ad alta velocità tra un controller e una o più periferiche sulla stessa scheda. È l’interfaccia standard per schede SD, display, memorie flash, ADC e DAC e un’ampia gamma di sensori.
Mentre UART non aveva un clock condiviso e ricostruiva la temporizzazione dalla stessa linea dati, SPI fa scorrere un filo di clock accanto ai fili dati. Il controller pilota il clock alla frequenza che preferisce e ogni altro dispositivo sul bus campiona i dati in sincronia con quel clock. Non c’è nessuna stima del baud rate né overhead di framing: solo fronti di clock e bit.
3.21.1. I quattro fili#
Un bus SPI full-duplex ha quattro fili:
SCK (serial clock). Pilotato dal controller. Ogni bit viene fatto entrare o uscire su un fronte di questo segnale.
MOSI (controller out, peripheral in). La linea di uscita del controller; la periferica vi campiona i bit.
MISO (controller in, peripheral out). La linea di uscita della periferica; il controller vi campiona i bit.
CS (chip select), talvolta chiamata SS (peripheral select). Una linea separata per ogni periferica. Il controller porta CS a livello basso per avviare una transazione e di nuovo a livello alto per terminarla; qualsiasi periferica con il proprio CS disasserito ignora completamente il bus e smette di pilotare la propria uscita MISO.
Un byte SPI: CS va basso per selezionare la periferica, SCK genera otto bit e MOSI e MISO trasferiscono un byte ciascuno in direzioni opposte.#
Ogni fronte di clock sposta un bit in ciascuna direzione nello stesso istante. Un singolo impulso di SCK invia simultaneamente un bit su MOSI e ne riceve uno su MISO: SPI è full-duplex a livello fisico. Il software non è obbligato a usare entrambe le direzioni: le transazioni di sola scrittura e di sola lettura sono comuni, con la linea inutilizzata ignorata o tenuta a livello alto.
3.21.2. Polarità e fase del clock#
Due bit di configurazione decidono esattamente quale fronte di clock sposta i dati:
Polarità del clock (
polarity, talvoltaCPOL) – lo stato di riposo di SCK.0significa che il clock riposa a livello basso e pulsa alto;1significa che il clock riposa a livello alto e pulsa basso.Fase del clock (
phase, talvoltaCPHA) – quale fronte campiona i dati.0campiona sul primo fronte di ogni impulso di clock (fronte iniziale);1campiona sul secondo fronte (fronte finale).
Insieme questi danno quattro modalità, convenzionalmente chiamate Mode 0 fino a Mode 3. Mode 0 (polarity=0, phase=0) è la più comune e un valore predefinito sicuro per dispositivi sconosciuti.
La regola fondamentale è che entrambe le estremità devono concordare sulla modalità. Modalità non corrispondenti producono dati spazzatura anche se le linee di clock e dati sono cablate correttamente; se un dispositivo restituisce dati senza senso alla prima transazione, la modalità è la prima cosa da controllare.
3.21.3. Più periferiche#
Diverse periferiche possono condividere le stesse linee SCK, MOSI e MISO purché ciascuna abbia la propria linea CS pilotata dal controller:
Tutte le periferiche vedono lo stesso clock e gli stessi dati, ma ciascuna osserva il proprio CS. Con CS disasserito (alto), una periferica ignora completamente SCK e MOSI e lascia MISO in uno stato ad alta impedenza in modo da non contendere la linea con gli altri dispositivi.
Il controller assicura esattamente un CS alla volta, esegue la transazione e disasserisce CS per rilasciare il bus.
Un microcontrollore con un singolo blocco SPI hardware può comunicare con tante periferiche quanti sono i pin GPIO liberi da dedicare alle linee CS: sul bus stesso non c’è alcun indirizzamento.
3.21.4. Punti di forza e di debolezza#
I punti di forza e di debolezza di SPI derivano entrambi dal suo design:
Veloce. Decine di megahertz sono raggiungibili su tracce corte con una semplice traslazione di livello. I lettori di schede SD e i display SPI lo sfruttano.
Semplice a livello fisico. Nessun indirizzamento, nessun acknowledgement, nessuna condizione speciale di start/stop: solo bit sui fili sincronizzati a un clock.
Esoso di pin. Tre linee condivise più un CS per periferica. Una scheda con cinque dispositivi SPI usa otto pin (tre + cinque).
Corto raggio. SPI presuppone fronti puliti e veloci, il che significa tracce corte sulla stessa scheda. Per collegamenti più lunghi, I2C o uno dei bus con framing è più adatto.