Slave SPI (MSSP)

SPI slave

In questa pagina viene mostrato come utilizzare un PIC18 come slave SPI sfruttando il modulo MSSP Master Synchronous Serial Port.

In questa pagina non verrà spiegato cosa è e come si usa il bus SPI. Se serve, qui trovate qualche informazione.

Il modulo MSSP

La struttura interna del modulo MSSP configurato come Slave SPI è piuttosto semplice:

SPI-slave.MSSP

L'hardware

L'hardware utilizzato negli esempi, piuttosto semplice, è costituito da due PIC18 collegati tra di loro, uno funzionante come Master (a sinistra nello schema), l'altro come Slave (a  destra)

Master e Slave - Schema elettrico

I tre segnali MOSI (SDO del Master), Clock e Slave Select (RBO) sono pilotati dal Master; MISO (SDO dello Slave) è  pilotato dallo Slave, ma solo quando è attivo lo Slave Select.; altrimenti è configurato ad alta impedenza (3 state) ed eventualmente pilotato da altre periferiche SPI. Si noti che SDI e SCO sono "incrociati" tra Master e Slave. Da tenere inoltre presente che l'alimentazione (o perlomeno la massa) devono essere comuni tra i due circuiti.

Nella fotografia di apertura, in primo piano è visibile lo Slave. Sullo sfondo il Master ed un secondo Slave. Il collegamento è "a 4 fili": SS, Clock, MISO e MOSI, rispettivamente i fili viola, verde, blu e giallo. Da tenere presente che l'alimentazione (o perlomeno la massa) deve essere comune ai due circuiti: nella fotografia ovviamente sono i due fili rosso e nero (nello schema non sono disegnati).

Il programma eseguito dal PIC Master nei primi due esempi è lo stesso non fa altro che incrementare il valore di un byte e trasmetterlo; inoltre verifica se il byte ricevuto è di una unità minore di quello trasmesso e, in caso negativo, accende un LED per segnalare un errore nel protocollo. Il codice è oggetto del terzo esercizio della pagina PIC18 come master SPI.

Se si dispone di due PICKIT/ICD e di due PC non ci sono problemi particolari nel realizzare il circuito; è comunque possibile prima programmare il Master, renderlo autonomo e collegare quindi l'ICD al PIC18 che eseguirà il codice delle Slave.  In alternativa è possibile utilizzare come Master SPI un qualunque altro dispositivo programmabile, per esempio un Rapsberry Pi.

SPI slave da programma

Il primo programma di esempio utilizza SPI  in configurazione Slave senza far uso di interrupt. Questo programma non fa altro che ricevere un singolo byte e ritrasmetterlo al Master, ovviamente durante lo scambio di dati successivo. Il codice è suddiviso in due parti:

Due osservazioni:

Diagramma temporale SPI

Il diagramma temporale non presenta sorprese; dall'alto:

Da notare che il segnale MISO, quando lo Slave Select non è attivo, si trova ad un valore intermedio tra 0 e 1 logico (tri-state)

SPI slave con interrupt

Si è già accennato alla presenza nel programma appena descritto di un codice "bloccante", cioè di un loop di attesa del termine di una operazione di una periferica, nel caso specifico la ricezione di un byte da parte del modulo MSSP:

while (!SSPSTATbits.BF);

Il problema è critico in quanto, semplicemente, questa operazione potrebbe non avvenire mai. Una soluzione parziale è l'inserimento di un contatore di "time-out". Una soluzione migliore è l'uso delle interrupt, generate alla ricezione di un nuovo byte.

Il codice è simile al precedente e si comporta allo stesso modo:

Il diagramma temporale mostrato è relativo allo scambio di due byte; dall'alto:

Osservazioni

  1. L'esempio mostrato ha un clock piuttosto elevato, ma, essendo gestito in hardware, non si presentano problemi particolari.
  2. Nel codice dello Slave non è presente alcun riferimento alla frequenza di clock, gestita interamente dal Master
  3. Circa il 50% del tempo CPU è usato per la trasmissione SPI. Nel caso di trasmissione interrupt-driven, quella mostrata può essere considerata la massima velocità operativa (1 byte ogni 9 µs, poco meno di 900 k/s in full-duplex)

Un altro esempio

Questo esempio utilizza le interruzioni per scambiare con un dispositivo Master un frame di lunghezza predefinita, 10 byte. Il corrispondente programma Master è disponibile in questa pagina, oggetto del primo esercizio.

Il codice utilizza due array della stessa lunghezza "utile" (e della stessa lunghezza prevista per il Master). Nell'esempio l'array atteso proveniente dal Master è "MASTER 5 #" dove 5 è un numero progressivo di una cifra. Il frame trasmesso dallo Slave contiene la stringa "ACK 4 ####", dove 4 è il numero progressivo inviato dal Master con il frame precedente.

Nel codice di esempio è stata usata la tecnica, ampiamente utilizzata, di:

Osservazioni

Il diagramma temporale:

Diagramma temporale con scambio di un frame di 10 byte

Codice sorgente


Data di creazione di questa pagina: luglio 2015
Ultima modifica: 27 dicembre 2015


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima