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.