Serial Peripheral Interface
![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/SPI_single_slave.svg/300px-SPI_single_slave.svg.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/SPI_8-bit_circular_transfer.svg/300px-SPI_8-bit_circular_transfer.svg.png)
Il Serial Peripheral Interface o SPI (pronuncia: ɛs pi aɪ o spaɪ) è un sistema di comunicazione tra un microcontrollore e altri circuiti integrati o tra più microcontrollori.
È un bus standard di comunicazione ideato dalla Motorola e sviluppato, in una sua variante, anche dalla National Semiconductor con il nome di bus MicrowireTM.
La trasmissione avviene tra un dispositivo detto master e uno o più slave (letteralmente dall'inglese padrone e schiavo). Il master controlla il bus, emette il segnale di clock, decide quando iniziare e terminare la comunicazione [1].
Il bus SPI si definisce:
- di tipo seriale
- sincrono per la presenza di un clock che coordina la trasmissione e ricezione dei singoli bit e determina la velocità di trasmissione
- full-duplex in quanto il "colloquio" può avvenire contemporaneamente in trasmissione e ricezione.
Per quanto riguarda la velocità di scambio dei dati (in pratica la frequenza del clock) non vi è un limite minimo (in quanto i dispositivi sono statici: possono mantenere se alimentati uno stato logico per un tempo indefinito) ma vi è un limite massimo che va determinato dai datasheet dei singoli dispositivi connessi e dal loro numero in quanto ogni dispositivo collegato al bus introduce sulle linee di comunicazione una capacità parassita).
Il sistema di comunicazione di solito serve per lo scambio di dati tra dispositivi montati "sulla stessa scheda elettronica" (o comunque tra schede elettroniche vicine tra di loro) in quanto non prevede particolari accorgimenti hardware per trasferire informazioni tra dispositivi lontani connessi con cavi soggetti a disturbi.
Il sistema è comunemente definito a quattro fili. Con questo si intende che le linee di connessione che portano i segnali sono in genere quattro. Va però tenuto conto che vi deve comunque essere una connessione di riferimento (0 Vdc comunemente indicata con GND, nome che a rigore è improprio) e che fisicamente quindi i fili sarebbero cinque. Discorso analogo si può fare su altri bus seriali definiti a due fili (I²C) o ad un filo in quanto si considerano solo le linee di segnale e si sottintende la connessione di riferimento.
I segnali
Esso si basa su 4 segnali (si riportano i nomi dei segnali che possono variare a seconda del costruttore. Consultare il datasheet del componente che si intende utilizzare in caso di dubbi):
- SCLK - SCK: Serial Clock (emesso dal master)
- SDI – MISO – SIMO – DI - SI: Serial Data Input, Master Input Slave Output (ingresso per il master ed uscita per lo slave)
- SDO – MOSI – SOMI – DO – SO: Serial Data Output, Master Output Slave Input (uscita dal master)
- CS – SS – nCS – nSS – STE: Chip Select, Slave Select, emesso dal master per scegliere con quale dispositivo slave vuole comunicare (dalla figura, il segnale con la sbarretta sui caratteri SS, si comprende che per comunicare con il dispositivo slave deve venire messo a livello logico basso)
Di questi il Chip Select (CS o SS) non è indispensabile in tutte le applicazioni.
È facile confondersi nei nomi, spesso ambigui, sui segnali di trasferimento dei dati (ingressi e uscite). In ogni caso la consultazione dei datasheet dei dispositivi scelti dovrebbe chiarire ogni dubbio. Le denominazioni MOSI (Master Output Slave Input), MISO (Master Input Slave Output) sembrano essere quelle che comportano meno equivoci. Il segnale SCLK è il clock seriale che scandisce gli istanti di emissione e di lettura dei bit sulle linee di dati. È un segnale emesso dal master ed è quindi quest'ultimo a richiedere di volta in volta la trasmissione di una "parola" [2]. Il segnale SDI/MISO è la linea attraverso cui il dispositivo (master o slave) riceve il dato seriale emesso dalla controparte. Sullo stesso fronte di commutazione del clock, il dispositivo emette, con la stessa cadenza, il suo output ponendo il dato sulla linea SDO/MOSI (linea di output di dato).
Dispositivi slaves controllati singolarmente
![](http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/SPI_three_slaves.svg/300px-SPI_three_slaves.svg.png)
Vantaggi: comunicazione più rapida tra master e singoli slaves.
Svantaggi: necessità di avere un pin SS per ogni dispositivo slave.
La linea CS è dedicata all'abilitazione del dispositivo slave da parte del master che così facendo abilita l'uno o l'altro dispositivo slave che si affaccia al bus ad intrattenere una trasmissione. La linea CS, normalmente attiva bassa, in caso di disabilitazione (livello logico alto) lascia il dispositivo slave con uscita in alta impedenza e quindi isolato completamente dal bus indifferentemente dall'esistenza del segnale di clock.
Il numero di dispositivi slaves che si possono connettere al bus è limitato esclusivamente da numero di possibili linee di chip select gestibili dal dispositivo master. La frequenza di clock, e di conseguenza la velocità del bus, può raggiungere, con questo standard, livelli anche elevati nell'ordine delle decine di MHz ed anche oltre.
Dispositivi slaves connessi in catena (daisy chain)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/9/97/SPI_three_slaves_daisy_chained.svg/300px-SPI_three_slaves_daisy_chained.svg.png)
Vantaggi: uso di un unico pin per selezionare i dispositivi.
Svantaggi: minore velocità di aggiornamento dei singoli slaves.
In questo caso la linea CS potrebbe essere abolita (ogni linea SS degli slaves potrebbe essere collegata a livello logico basso lasciandoli sempre abilitati) in quanto non vi sarebbe mai conflitto (cosa che invece accadrebbe nella connessione di dispositivi slaves controllati singolarmente dove una eventuale abilitazione di più slaves creerebbe un conflitto sulla linea MISO creando problemi nella comunicazione (oltre ad un uso dei dispositivi con uscite in conflitto che non giova alla loro affidabilità nel tempo).
Come avviene la comunicazione
La trasmissione dei dati sul bus SPI si basa sul funzionamento dei registri a scorrimento (shift register). Ogni dispositivo sia master che slave è dotato di un registro a scorrimento interno i cui bit vengono emessi e, contemporaneamente, immessi, rispettivamente, tramite l'uscita SDO/MOSI e l'ingresso SDI/MISO. Il registro può avere dimensione arbitraria (ma uguale per i dispositivi master e slaves) anche se usualmente ha la dimensione di 8 bit. Il registro a scorrimento è un'interfaccia completa mediante la quale vengono impartiti comandi e trasmessi dati che arrivano in modo seriale ma che internamente sono prelevati, a fine trasmissione, in modo parallelo. Ad ogni impulso di clock i dispositivi che stanno comunicando sulle linee del bus emettono un bit dal loro registro interno rimpiazzandolo con un bit emesso dall'altro interlocutore. La sincronizzazione è fatta sui fronti di clock di salita o di discesa regolata da 2 parametri impostabili: CPOL e CPHA. CPOL regola la polarità del clock ovvero discrimina lo stato normale di riposo cui si porta la linea di clock quando non è attiva. Quando CPOL è impostato a 0 il clock, nel suo stato di riposo, si porta a livello logico basso, viceversa si porta a livello logico alto, durante il tempo di inattività, se CPOL è impostato ad 1. CPHA regola il fronte di clock in cui il ricevente campiona il segnale in ingresso. Se CPOL=0 allora con CPHA possiamo scegliere di campionare il dato sul fronte di discesa del segnale di clock, impostando CPHA=0, oppure sul fronte di salita, impostando CPHA ad 1. L'inverso accade se CPOL è settato ad 1.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/SPI_timing_diagram.svg/300px-SPI_timing_diagram.svg.png)
Queste opzioni, in genere, sono impostabili sul dispositivo master e permettono di adattarlo a tutte le possibili varianti di dispositivi slaves che normalmente, invece, vengono progettati per avere uno dei 4 modi di comunicazione possibili (tutte le combinazioni di CPOL e CPHA). Le modalità di funzionamento più spesso utilizzate dai dispositivi in commercio sono quelle con CPHA=CPOL=0 e con CPHA=CPOL=1. Il dato di output è emesso sempre in corrispondenza della prima transizione del clock. La comunicazione viene intrapresa sempre su iniziativa del dispositivo master che abilita lo slave tramite CS e successivamente impone il clock sulla linea dedicata. Con questa procedura ha inizio lo scambio dei bit tra i due registri. Alla fine di ogni parola trasmessa il contenuto del registro dello slave sarà passato al master e viceversa. Con opportune parole identificative si possono inviare comandi al dispositivo ricevente che potrà effettuare l'elaborazione assegnata ponendo quindi nel suo shift-register il dato richiesto che al prossimo ciclo di trasmissione verrà trasmesso al richiedente.
Molti microcontrollori dispongono di un hardware dedicato per la gestione dell'SPI programmabile nei dettagli. Questo non è strettamente necessario per poter comunicare con un dispositivo slave SPI (come ad esempio una memoria eeprom): in ogni caso si potrà implementare nel firmware delle funzioni dedicate al colloquio (che forse risulteranno più lente e occuperanno più spazio nel firmware di quelle disponibili con un blocco hardware dedicato) ma che comunque permetteranno di comunicare in modo efficiente con la periferica SPI, in quanto non vi è, nella temporizzazione dei dati, un limite di tempo massimo da rispettare (si tratta infatti di dispositivi statici, che possono cioè sospendere a tempo indeterminato la comunicazione senza per questo avere perdita di dati; in altre parole hanno dei limiti per quanto riguarda la velocità massima di trasmissione ma che possono funzionare anche in modo lento quanto si vuole).
Note
- ^ Il master deve essere unico ma la qualifica di master può essere scambiata tra diversi dispositivi connessi al bus (purché siano in grado di farlo e cioè non siano nati come semplici slaves)
- ^ Può essere selezionabile per comunicare con un byte (8 bit) o più (16 bit). Di solito il primo bit trasmesso è il più significativo.
Voci correlate
- Trasmissione seriale - Vari tipi di comunicazione seriale
Altri bus seriali
- I²C - Bus con tre fili: due di segnale (linea di Clock e linea Dati bidirezionale) ed un comune di riferimento. Comunemente chiamato seriale a due fili.
- S/PDIF, AES/EBU - Standard usato in ambito audio.
- EIA RS-485 - Standard industriale seriale a due fili di tipo half-duplex.
- EIA RS-422 - Standard industriale seriale a quattro fili, full-duplex.
- Controller Area Network - Standard chiamato CAN bus. Nato per l'ambiente automotive (mezzi mobili) è usato anche in ambiente industriale per la sua immunità ai disturbi.
- USB - Standard per l'interfacciamento di periferiche ai computer.
- EIA RS-232 - Standard in passato usato sui computer. Spesso realizzato in maniera semplificata usando solo a tre fili: con due linee di segnale (Trasmissione e Ricezione) e un comune di riferimento.
- MIDI - Standard in uso nel campo degli strumenti musicali elettronici.