Nicola Amoroso

Transcript

Nicola Amoroso
Corso introduttivo sui
microcontrollori
A. S. 2013 – 2014
Il Bus SPI (Serial Peripheral Interface)
Vedi anche: l’interfaccia SPI di Mauro Laurenti [http://www.Laurtec.it]
Nicola Amoroso
[email protected]
na_SPI
1
Il Bus SPI
Il Serial Peripheral Interface o SPI è un sistema di comunicazione tra un
microcontrollore e opportune periferiche o tra più microcontrollori.
È un bus standard di comunicazione introdotto dalla Motorola (ora FreeScale) e
sviluppato, in una sua variante, anche dalla National Semiconductor (acquisito da
Texas Instruments) con il nome di bus MicrowireTM
La trasmissione avviene tra un dispositivo detto master e uno o più slave. Il
master controlla il bus, emette il segnale di clock, decide quando iniziare e
terminare la comunicazione.
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
Da Wikipedia, l'enciclopedia libera
na_SPI
2
Il Bus SPI
Il bus SPI è un bus di comunicazione seriale a quattro fili master/slave.
I quattro segnali sono clock (SCLK), output master/input slave (MOSI), input
master/output slave (MISO) e select slave (SS).
Ogni volta che due dispositivi comunicano, uno si identifica come master e
l’altro come slave. Il master guida il clock seriale. I dati vengono
simultaneamente trasmessi e ricevuti, rendendolo un protocollo full-duplex.
Piuttosto che avere indirizzi unici per
ogni dispositivo sul bus, SPI usa la linea
SS per specificare quale dato viene
trasferito verso o dal dispositivo.
Quindi, ogni dispositivo sul bus necessita il
suo proprio segnale SS dal master. Se ci
sono tre dispositivi slave, allora esistono tre
guide SS provenienti dal master, una per
ogni slave, come evidenziato in figura.
na_SPI
3
Il Bus SPI
Ogni volta che due dispositivi comunicano, uno si identifica come master e
l’altro come slave.
Il master gestisce il clock seriale. I dati vengono simultaneamente trasmessi e
ricevuti, rendendo la comunicazione full-duplex.
MOSI : Master Output Slave In
MISO : Master Input Slave Output
SCLK : Serial Clock (generato dal
Master)
SS : Slave Select (Selezione dello
Slave)
Oltre a questa nomenclatura, più o meno standard, possono esistere altre denominazioni.
Per esempio i microcontrollori PIC18 della Microchip, fanno uso di una nomenclatura leggermente differente
ma comunque intuitiva.
Per esempio la linea MOSI viene anche nominata: SDO (Serial Data Out), DO (Data Out), DOUT e SO
(Serial Out)
La linea MISO viene anche nominata: SDI (Serial Data In), DI (Data In), DIN e SI (Serial In)
La linea di Clock viene anche nominata: CLK, SCK (Serial Clock), SCK.
La linea di Enable viene anche nominata: CS (Chip Select), CE (Chip Enable)
na_SPI
4
Il Bus SPI
La comunicazione SPI prevede la presenza di un SS (Slave Select), per cui
anche se la comunicazione avviene tra un solo Master e un solo Slave, il
Master può selezionare lo Slave con cui avviare la comunicazione, sia per
scrivere che leggere dati.
Nel caso di collegamento con più slave, si ha ancora un unico Master, che ha il
compito di selezionare lo Slave con il quale avviare la comunicazione; infatti un
solo Slave alla volta deve essere attivo.
Questo collegamento è possibile solo se la periferica
Slave supporta l’opzione di avere la linea MISO di
tipo three states o floating (alta impedenza).
In particolare lo stato di alta impedenza deve
essere impostato ogni qual volta lo Slave risulti
disattivo.
Questo è richiesto poiché tutti i MISO sono collegati
in parallelo, e non è cosa buona avere uscite in
parallelo che abbiano livelli logici differenti (si
potrebbero avere dei cortocircuiti che porterebbero
alla rottura dei dispositivi stessi).
na_SPI
5
Il Bus SPI
Il meccanismo hardware utilizzato
è molto semplice.
Il componente base è uno shift register (per
lo più a 8 bit) presente sia nel master che
nello slave.
Mentre il master riversa bit sulla linea MOSI lo slave può a sua volta inviare dati al master
utilizzando la linea MISO (trasmissione full duplex)
La semplicità dell'hardware non ha indotto a sviluppare specifiche ufficiali
Il protocollo di comunicazione è libero
In alcuni casi, quando la comunicazione dallo slave al master non è richiesta, il segnale MISO può essere
escluso totalmente.
La dimensione del registro a scorrimento non è specificata, ma spesso la sua dimensione è di 8 bit.
In microcontrollori a 16 o 32 bit, per la dimensione stessa dei registri interni , si può spesso avere l’opzione di
selezionare la dimensione del registro, usando le dimensioni comuni 8, 16, 32 bit.
na_SPI
6
Il Bus SPI
la trasmissione di un byte
Prima di avviare una comunicazione, il
Master attiva la linea SS relativa
Slave
con cui
vuole effettuare
allo
la
comunicazione e successivamente il
clock alla frequenza con cui avverrà la
trasmissione.
Dopo l’attivazione dello Slave, i bit interni al registro a scorrimento del Master vengono traslati all’esterno
(linea MOSI) a partire dal bit più significativo MSB (Most Significant Bit).
Il bit traslato entra nel registro dello Slave, il quale a sua volta inizia a svuotare il proprio registro inviando il
bit più significativo attraverso la linea MISO. La comunicazione termina quando l’ottavo bit viene trasmesso.
Da quanto detto si capisce che se il Master volesse leggere dallo Slave deve comunque inviargli un dato
fittizio. Allo stesso modo, se il Master volesse solo impostare lo Slave o inviare solo Dati, riceverà
comunque dei dati fittizi, a meno di ignorare e non collegare la linea MISO.
na_SPI
7
Il Bus SPI
La trasmissione di un byte
Rispetto a quanto appena detto ci sono naturalmente delle eccezioni, in particolare la linea SS potrebbe
non essere usata qualora nel sistema si abbia un solo Slave.
In alcune periferiche, quali per esempio gli ADC (Analog to Digital Converter), la linea SS è quasi sempre
obbligatoria, visto che oltre a rappresentare la linea Slave Select, svolge spesso la mansione di avvio
conversione (Start Conversion).
In situazioni come queste potrebbe essere necessario ritardare il Clock prima di poter effettivamente
leggere il risultato della conversione.
E’ bene tenere presente che diversi microcontrollori hanno l’opzione di trasmettere il byte in uscita non a
partire dal bit più significativo ma da quello meno significativo (comunicazione 3 Wire half-duplex [3 Wire
communication in cui la linea SS è presente ma le linee MOSI e MISO sono unite in una unica linea per
formare una comunicazione half-duplex]).
Come ogni opzione utilizzata si deve avere la premura di controllare che lo Slave sia compatibile con tale
opzione.
Il modulo SPI è spesso supportato da interrupt in modo da poter armonizzare l’utilizzo dello
stesso con il resto delle attività della CPU
na_SPI
8
Il Bus SPI
Connessione daisy-chained (connessione a catena)
Abbiamo precedentemente visto la possibilità di connessione di un Master con più Slave
mediante il collegamento di selezione SS (una linea di selezione per ogni slave); esiste
comunque un altro modo con cui si possono collegare tra loro più Slave, il daisychained (connessione a catena).
La catena di Slave è ottenuta collegando l’uscita MISO
del primo Slave all’ingresso MOSI del Secondo Slave e
cosi via. L’ultimo Slave avrà il MISO collegato al Master.
La catena di Slave viene attivata da una sola linea SS,
quindi si ha la possibilità di risparmiare diversi pin
altrimenti necessari per ogni singolo Slave.
Per comunicare con un dispositivo è necessario inviare
sempre tre byte (uno per periferica) anche se il
dispositivo con cui si vuole colloquiare è il primo (in
lettura è obbligatorio, mentre in sola scrittura si potrebbe
evitare).
Questa configurazione, seppur interessante non permette di collegare un numero elevato di periferiche.
A seconda della frequenza del segnale di clock e dalla tipologia delle periferiche utilizzate potrebbe essere
necessario dover rispettare dei tempi minimi e massimi di lettura o scrittura.
na_SPI
9
Il Bus SPI
La modalità di 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 MOSI e l'ingresso 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.
Da Wikipedia, l'enciclopedia libera
na_SPI
10
Il Bus SPI
La modalità di comunicazione
A seconda del valore che
assumono i due parametri
CPOL e CPHA restano definiti
4 modi di funzionamento
CPOL regola la polarità del clock ovvero determina lo stato normale di riposo cui si porta la linea di
clock quando non è attivo
CPOL =0, il clock, nel suo stato di riposo, si porta a livello logico basso;
CPOL = 1, il clock si porta a livello logico alto durante il tempo di inattività
CPHA regola il fronte di clock in cui il ricevente campiona il segnale in ingresso.
Se CPOL=0, impostando CPHA=0 si può campionare il dato sul fronte di discesa del segnale di clock,
impostando CPHA=1 si può campionare il dato sul fronte di salita del segnale di clock
Se CPOL=1, impostando CPHA=0 si può campionare il dato sul fronte di salita del segnale di clock,
impostando CPHA=1 si può campionare il dato sul fronte di discesa del segnale di clock.
Alcuni microcontrollori, come per esempio i PIC18, richiedono CPHA invertito.
Se secondo lo standard Freescale si richiede la modalità CPOL=0 e CPHA=0, per questi microcontrollori potrebbe
essere CPOL=0 e CPHA=1.
na_SPI
11
Il Bus SPI
La modalità di comunicazione
CPOL, come detto, definisce la modalità dei fronti (salita/discesa) del segnale di clock sul quale
avvengono determinate operazioni. Consideriamo il caso CPOL=0, CPHA=1 (mode 1)
1
2
4
3
1- Il Master attiva lo Slave Select
6………
5
2- Il Master attiva il Clock
3- Sul fronte di salita del
clock il bit MSB dei registri a scorrimento interni, viene posto sulla linea MOSI (dal Master) e sulla linea MISO
(dallo Slave)
4- Sul fronte di discesa il Master e lo Slave campionano (sampling) il bit e lo traslano nel registro
interno
5- Sul nuovo fronte di salita il nuovo bit viene posto sulle linee MOSI e MISO
6- Identica
procedura fino all’ultimo bit ….
na_SPI
12
Il Bus SPI
Modalità di comunicazione
Nel caso in cui CPOL=1 e CPHA=1 (mode 3), in corrispondenza dei fronti di discesa i bit vengono
messi sulle linee di uscita MOSI (il master) e MISO (lo slave) mentre il campionamento avviene in
corrispondenza del fronte di salita del segnale di clock.
Nel funzionamento in mode 1 (CPOL=0, CPHA=1) e in quello in mode 3 (CPOL =1, CPHA=1) la
linea SS rimane attiva per tutta la trasmissione. Se ulteriori byte devono essere inviati, la linea SS può
rimanere ininterrottamente attiva; questo significa che moduli con interfaccia SPI con registri a 8 bit,
possono leggere e scrivere periferiche che hanno registri a scorrimento a 16 bit (come anche 3
o più byte).
na_SPI
13
Il Bus SPI
Modalità di comunicazione
Consideriamo il caso CPOL=0, CPHA=0 (mode 0)
1
3
4
2
6………
5
1- Il Master attiva lo Slave Select
2- Sul fronte di discesa del
segnale SS il bit MSB dei registri a
scorrimento interni, viene posto sulla linea MOSI (dal Master) e sulla linea MISO (dallo Slave)
3- Il Master
attiva il Clock
4- Sul fronte di salita il Master e lo Slave campionano (sampling) il bit e lo traslano nel
registro interno
5- Sul nuovo fronte di discesa il nuovo bit viene posto sulle linee MOSI e MISO
6- Identica procedura fino all’ultimo bit ….
na_SPI
14
Il Bus SPI
Modalità di comunicazione
Nel caso in cui CPOL=1 e CPHA=0 (mode 2), Sul fronte di discesa del segnale SS il bit MSB dei
registri a scorrimento interni, viene posto sulla linea MOSI (dal Master) e sulla linea MISO (dallo
Slave), gli altri bit in corrispondenza dei fronti di salita del segnale di clock vengono messi sulle
linee di uscita MOSI (il master) e MISO (lo slave); il campionamento avviene invece, in
corrispondenza del fronte di discesa del segnale di clock.
Per funzionamento in mode 0 e mode 2 è necessario che ad ogni invio di byte la linea SS venga
disattivata e riattivata. Infatti il bit MSB viene posto rispettivamente sulle linee MOSI e MISO sul
fronte di discesa della linea stessa. In queste modalità si capisce che non si può fare a meno della
linea SS e che master con registri interni a 8 bit possono colloquiare solo con Slave che hanno il
registro interno di ugual dimensione.
na_SPI
15
Il Bus SPI
La comunicazione SPI nei PIC
Nei dispositivi PIC è presente un modulo hardware, chiamato SSP o MSSP, che permette di
implementare il protocollo SPI e I2C. La sigla SSP (Synchronous Serial Port) ovvero porta seriale
sincrona vale sia per a comunicazione SPI che per quella I2C. La lettera M presente nell'acronimo
MSSP sta per MASTER e si riferisce all'I2C e non riguarda le prestazioni del protocollo SPI, per cui
per l'SPI si possono usare entrambi i moduli SSP o MSSP.
Nei microcontrollori PIC della Microchip, per la rappresentazione dei segnali di comunicazione, spesso si usa
una nomenclatura leggermente differente ma comunque intuitiva.
Per esempio la linea MOSI viene anche nominata: SDO (Serial Data Out), DO (Data Out), DOUT e SO
(Serial Out)
La linea MISO viene anche nominata: SDI (Serial Data In), DI (Data In), DIN e SI (Serial In)
La linea di Clock viene anche nominata: CLK, SCK (Serial Clock), SCK.
La linea di Enable viene anche nominata: CS (Chip Select), CE (Chip Enable)
na_SPI
16
Il Bus SPI
La comunicazione SPI nei PIC
In una tipica connessione SPI realizzata mediante micro che dispongono del modulo SSP I dati di uscita dal
MASTER sono presenti sulla linea SDO mentre i dati in ingresso al MASTER sono presenti sulla linea SDI. Il
segnale di clock, generato dal MASTER, è presente sulla linea SCK. La linea SS permette al MASTER di
selezionare un determinato dispositivo SLAVE.
Se più dispositivi SLAVE sono connessi al bus:
solo il dispositivo SLAVE con il segnale SS
basso è coinvolto nella comunicazione mentre i
rimanenti SLAVE con il segnale SS alto non
sono interessati allo scambio di dati.
il modulo SSP nella configurazione SPI utilizza alcuni registri interni dedicati e un blocco di controllo. Questo
blocchetto, denominato CONTROL ha funzioni diverse a seconda della natura del dispositivo: nel caso del
dispositivo MASTER genera e trasmette il clock sulla linea SCK e attiva il segnale SS in base al codice: SS
è messo basso (attivo basso) durante il trasferimento ed è riportato al livello alto alla fine della stessa. Nel
caso di un dispositivo SLAVE il blocco CONTROL riceve i segnali SCK e SS inviati dal MASTER e li usa per
processare i dati SPI presenti sulla linea SDI
na_SPI
17
Il Bus SPI
La comunicazione SPI nei PIC
Quando si usa la SPI nei PIC, bisogna settare correttamente alcuni registri. Poiché ci sono modi differenti
di settare l'SPI e un certo numero di dispositivi differenti, i valori per regolare questi registri
possono variare e devono essere valutati di caso in caso. Conviene comunque sempre consultare il
datasheet del dispositivo per avere maggiori dettagli.
Il modulo MSSP ha 4 registri associati per la comunicazione SPI:
• MSSP Control Register 1 (SSPCON1)
• MSSP Status Register (SSPSTAT)
• Serial Receive/Transmit Buffer Register (SSPBUF)
• MSSP Shift Register (SSPSR) Not directly accessible
SSPCON1 e SSPSTAT sono i registri di controllo e di stato; configurando opportunamente alcuni bit di
questi registri, si definiscono le modalità operative nella comunicazione SPI.
Come visto in precedenza, considerando le indicazioni Motorola (FreeScale), lo scambio dei dati tra il master
e lo slave può avvenire secondo Quattro diverse modalità. La sincronizzazione è fatta sui fronti di clock di
salita o di discesa regolata da 2 parametri impostabili: CPOL e CPHA
na_SPI
18
Il Bus SPI
La comunicazione SPI nei PIC
A seconda del valore che
assumono i due parametri
CPOL e CPHA restano definiti
4 modi di funzionamento
CPOL regola la polarità del clock ovvero determina lo stato normale di riposo cui si porta la linea di clock
quando non è attivo, CPHA regola il fronte di clock in cui il ricevente campiona il segnale in ingresso.
Nei Pic i quatto differenti modi operativi, nella comunicazione SPI, vengono impostati mediante due
particolari bit dei registri SSPCON1 e SSPSTAT indicati in precedenza e precisamente:
1. CKP (Clock Polarity, equivalente a CPOL)
2. CKE (Clock edge, equivalente a CPHA)
Come si può notare, CKP è identico a
CPOL, mentre CKE è complementare
rispetto a CPHA per i quattro differenti
modi operativi
na_SPI
19
Il Bus SPI
La comunicazione SPI, considerazioni
La comunicazione SPI non ha una frequenza operativa prefissata o standard, ed in particolare lavorando
sui fronti del clock non è nemmeno necessario che abbia valori particolari (per esempio non c’è un valore
minimo formale sotto il quale non si può andare). Questa peculiarità discende dal fatto che il clock è fornito
dal Master e lo Slave si adegua a quest’ultimo. Applicazioni con interfaccia SPI fanno uso di comunicazioni
a frequenze che partono da poche decine di KHz fino ad arrivare a decine di MHz (80MHz-100MHz). Il
limite massimo viene a dipendere dalle periferiche di cui si sta facendo uso. Per esempio molti
microcontrollori supportano frequenze massime fino a 10MHz.
L’interfaccia SPI, oltre a non specificare la frequenza operativa non impone alcun vincolo sulle tensioni che
caratterizzano i livelli logici. Ciononostante si capisce che due dispositivi al fine di comunicare tra loro
debbano lavorare con gli stessi livelli logici, altrimenti non si potrebbero capire. Qualora due dispositivi
lavorino a tensioni diverse, per esempio uno a 3.6V e uno a 5V, è necessario far uso di traslatori di livello.
Valori tipici di tensione sono: 1.8V, 3.3V, 3.6V e 5V.
Device e applicazioni tipiche che fanno uso dell'interfaccia SPI sono: Real Time Clock Calendar, Memorie
RAM, Memorie EEPROM, Amplificatori a Guadagno variabile, Controllori video, convertitori analogico
digitali (ADC), convertitori Digitali Analogico (DAC).
na_SPI
20
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Vediamo ora un semplice esempio di comunicazione SPI tra un microcontrollore Pic18F4620 e un device
della MicroChip, il sensore digitale di temperatura TC72.
Il Pic18F4620 include un modulo hardware per la comunicazione seriale, il MASTER SYNCHRONOUS
SERIAL PORT (MSSP) MODULE.
Il modulo MSSP gestisce la comunicazione seriale con opportune periferiche o altri microcontrollori in due
possibili modalità operative: 1. Serial Peripheral Interface (SPI)
2. Inter-Integrated Circuit (I2C - Full
Master mode e Slave mode (with general address call)).
Ogni modalità operativa può essere selezionata mediante il setup di opportuni bit in alcuni registri speciali
del microcontrollore (cfr. Data Sheet pic18f4620).
Per il setup della modalità di comunicazione, per il nostro esempio, sfrutteremo la semplicità applicativa del
Pic Wizard in dotazione al CCS Pic-C compiler.
Dal Data Sheet del TC72, nella sezione relativa alla modalità di comunicazione seriale si evidenzia che il
device opera come slave, è compatibile con le specifiche del bus SPI e il modo operativo può essere il
mode 1 oppure il mode 3.
na_SPI
21
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Come visto in precedenza, ricordiamo che i possibili modi operativi nella comunicazione SPI, per i
microcontrollori MicroChip, sono leggermente diversi rispetto a quanto introdotto originariamente da
Freescale (Motorola).
Nei Pic i quatto differenti modi operativi, nella comunicazione SPI, vengono
A seconda del valore che
assumono i due parametri
CPOL e CPHA restano
definiti 4 modi di
funzionamento
(FreeScale/Motorola)
impostati mediante due particolari bit dei registri SSPCON1 e SSPSTAT e
precisamente:
1. CKP (Clock Polarity, equivalente a CPOL)
2. CKE (Clock edge, equivalente a
CPHA)
Come si può notare, CKP è identico a CPOL, mentre CKE è complementare rispetto a CPHA per i
quattro differenti modi operativi
na_SPI
22
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Lo schema elettrico e di simulazione – Proteus Isis/VSM
na_SPI
23
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Di seguito il codice sorgente per l’esempio considerato; il codice è opportunamente commentato e di facile
comprensibilità. Naturalmente è indispensabile consultare il data-sheet del TC72 per seguire quanto
riportato.
CCS Pic wizard setup -> Impostazioni device
na_SPI
24
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Di seguito il codice sorgente per l’esempio considerato; il codice è opportunamente commentato e di facile
comprensibilità. Naturalmente è indispensabile consultare il data-sheet del TC72 per seguire quanto
riportato.
CCS Pic wizard setup -> Impostazioni modalità di comunicazione
Main source file [na_TC72hw.c] – Impostazioni modulo
MSSP per comunicazione SPI del pic18F4620
na_SPI
25
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Na_TC72hw.c – Main source file
na_SPI
26
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Na_TC72.c – Library file
TC72 Library file – Set modalità operativa del device
na_SPI
27
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Na_TC72.c – Library file
TC72 Library file – Lettura valori di temperatura
na_SPI
28
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Na_TC72.c – Library file
TC72 Library file – Composizione stringa valori letti
na_SPI
29
Il Bus SPI
Esempio comunicazione SPI, na_TC72
Na_TC72.c – Library file
TC72 Library file – Rappresentazione su display della stringa
na_SPI
30