sabato 15 febbraio 2014

Introduzione ad ASF (ottava parte) – SPI

Al livello più basso nei microcontrollori XMega per utilizzare il supporto hardware ad SPI abbiamo a disposizione per ogni porta SPI i seguenti registri: Control (CTRL), Interrupt Control (INTCTRL), STATUS e DATA, tutti adeguatamente documentati nel datasheet del microcontrollore.

Possiamo accedere ad esempio ai registri della porta SPI C tramite SPIC_CTRL, SPIC_INTCTRL, SPIC_STATUS ed SPIC_DATA o tramite la comoda struttura SPIC (il suffisso C indica la porta SPI) che espone i registri come membri della struttura (es. SPIC.CTRL). Mantenendo un puntatore alla struttura la sintassi diventa (&SPIC)->CTRL.

Come operazione preliminare configuriamo i pin che utilizzeremo tramite SPI (dove nel codice i vari *_PIN sono pin creati ad esempio con l’istruzione IOPORT_CREATE_PIN come visto negli articoli precedenti).

config pin

Nella modalità Master è necessario mantenere il pin SS ad un livello logico alto per evitare che il modulo pensi che un altro master voglia prendere il controllo del bus (bus contention).

Se lavorassimo a basso livello come prima cosa dovremmo configurare il registro CTRL del modulo SPI.

ASF per la sua configurazione ci mette a disposizione diverse funzioni: spi_master_init, spi_master_setup_device ed spi_enable.

config code

spi_master_init abilita il clock al modulo SPI e imposta la modalità SPI a Master Mode

spi_master_setup_device imposta la modalità SPI scelta (convenzioni di comunicazione come ad esempio MODE_0 elencate nel datasheet) e la velocità di clock della comunicazione (nell’esempio 1 MHz).

Nota Bene: Da notare che nell’XMega utilizzato la struttura spi_device_conf passata per riferimento non viene di fatto utilizzata, così come l’ultimo parametro select_id che viene semplicemente impostato a zero, probabilmente per compatibilità con versioni precedenti della libreria la funzione ha mantenuto questi parametri.

spi_enable abilita il modulo SPI, è il passaggio finale della configurazione.

Attenzione: Inizialmente avere tre metodi diversi per configurare un solo registro (CTRL), con tanto di parametri inutilizzati, può rendere difficile comprendere l’utilizzo del modulo SPI di ASF.

Una volta configurato il modulo è possibile inviare dei dati al dispositivo slave con le funzioni: spi_select_device, spi_write_packet e spi_deselect_device

write

Dove spi_device_conf è la struttura creata in precedenza, che ha come unico scopo il mantenimento del pin di abilitazione del dispositivo slave.

spi_select_device porta a low tale pin per abilitare l’effettiva ricezione da parte del dispositivo slave

spi_write_packet invia una sequenza di bytes (nell’esempio 3 bytes: 1, 2 e 3) occupandosi di attendere il completamento della trasmissione di ogni byte prima di procedere all’invio del successivo (a differenza di spi_write_single che invia un singolo byte ma non attende il completamento dell’invio). Sostanzialmente l’invio di un byte corrisponde alla scrittura del registro DATA del modulo SPI e l’attesa nel controllo del registro STATUS.

spi_deselect_device porta ad high il pin di abilitazione del dispositivo slave per la sua disabilitazione.

Oltre alla sola istruzione spi_write_packet possono essere inserite anche ulteriori letture o scritture prima di deselezionare il dispositivo. Nel datasheet del dispositivo slave è in genere possibile trovare i dettagli richiesti per l’utilizzo delle sue funzionalità.

Analogamente la lettura di dati dal dispositivo slave avviene tramite la funzione spi_read_packet

read

Dove nell’esempio vengono letti 3 byte dal dispositivo slave, come abbiamo visto scrivendo in effetti dei dati fittizi sul dispositivo slave e attendendo la completa scrittura del byte prima della presentazione del byte successivo. La lettura di un byte comporta la lettura del registro DATA del modulo SPI.

Oltre alla documentazione anche per questo articolo è stato analizzato il codice sorgente del modulo ASF per trarre maggiori informazioni sul funzionamento del modulo di cui sono state riportate le più rilevanti per sopperire alle mancanze della documentazione.

Spero che in questi due articoli si siano chiariti alcuni dubbi, senza la pretesa però di spiegare tutto nei minimi dettagli.

Nessun commento:

Posta un commento