# Serial Peripheral Interface

Il Serial Peripheral Interface o SPI (pronuncia: esse pi i o spi), in informatica, indica un sistema di comunicazione seriale tra un microcontrollore e altri circuiti integrati o tra più microcontrollori.

## Descrizione

È un bus standard di comunicazione ideato dalla Motorola e sviluppato, in una sua variante, anche dalla National Semiconductor con il nome di bus Microwire$^{TM}$. 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.
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 e possono mantenere se alimentati uno stato logico per un tempo indefinito. Comunque c'è 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. In ogni caso c'è una connessione di riferimento (0 Vdc comunemente e impropriamente indicata con GND) e quindi i fili fisicamente sono cinque. Discorso analogo si può fare su altri bus seriali definiti a due fili (I²C) o a un filo in quanto si considerano solo le linee di segnale e si sottintende la connessione di riferimento.

## Tipi

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.

## 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 – SOMI – DI - SO: Serial Data Input, Master Input Slave Output (ingresso per il master e uscita per lo slave)
* SDO – MOSI – SIMO – DO – SI: 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 SS negato, 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". 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).

### Nei dispositivi slave controllati singolarmente

Vantaggi: comunicazione più rapida tra master e singoli slave. 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 può abilitare un qualsiasi dispositivo slave connesso a trasmettere. 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 slave che si possono connettere al bus è limitato esclusivamente dal 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 e anche oltre.

### Nei dispositivi slave connessi a catena (daisy chain)

Vantaggi: uso di un unico pin per selezionare i dispositivi. Svantaggi: minore velocità di aggiornamento dei singoli slave, il guasto di un elemento può causare un'interruzione del segnale negli altri dispositivi. In questo caso la linea SS serve per indicare agli slave quando campionare il dato presente nel registro: il master inietta i bit sulla linea MOSI, partendo dal bit più significativo da inviare all'ultimo slave. Così facendo, una volta trasmessi tutti i bit destinati a tutti gli slave in questa sequenza, può segnalare agli slave che i dati in loro possesso nel registro di comunicazione sono effettivamente quelli destinati a loro. Se lo Slave Select fosse collegato, per esempio, fisso a massa, gli slave non potrebbero sapere se il dato presente nel loro registro di comunicazione è completo e da campionare, o magari destinato a uno slave successivo, oppure non allineato alla dimensione del registro stesso. In questa configurazione è impossibile avere conflitto sulla linea MOSI del master, al contrario di ciò che accadrebbe nella connessione di dispositivi slave controllati singolarmente dove l'eventuale abilitazione di più slave creerebbe un conflitto sulla linea MISO creando problemi nella comunicazione. Inoltre l'uso dei dispositivi con uscite in conflitto non giova alla loro affidabilità nel tempo.

## La comunicazione

La trasmissione dei dati sul bus SPI si basa sul funzionamento dei registri a scorrimento (shift register). Ogni dispositivo, master o 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 slave, e usualmente ha la dimensione di 8 bit. Il registro a scorrimento è un'interfaccia completa mediante cui vengono impartiti comandi e trasmessi dati che arrivano in modo seriale e che internamente sono prelevati, a fine trasmissione, in modo parallelo.
A 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 il clock si porta a livello logico alto durante il tempo di inattività se CPOL è impostato a 1. CPHA regola la fase del clock, ovvero 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 salita del segnale di clock, impostando CPHA=0, oppure sul fronte di discesa, impostando CPHA a 1. L'inverso accade se CPOL è settato a 1.
Generalmente queste opzioni sono impostabili sul dispositivo master e permettono di adattarlo a tutte le possibili varianti di dispositivi slave che normalmente 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 poiché nella temporizzazione dei dati non c'è un limite di tempo massimo da rispettare. Infatti si tratta di dispositivi statici, che possono cioè sospendere a tempo indeterminato la comunicazione senza per questo avere perdita di dati: solo la loro velocità massima di trasmissione è limitata e possono funzionare anche a velocità molto bassa rispetto alla massima.