Questo articolo richiamerà i principi di funzionamento del bus SPI, descriverà come progettare un driver scritto in C e quindi portabile facilmente su un qualsiasi microcontrollore, mostrerà le forme d'onda ottenute con il driver su un PIC32 e cercherà di definire i limiti di questa implementazione.
Sul mercato esiste una grande varietà di periferiche che si interfacciano a microcontrollori attraverso il bus di comunicazione SPI (Serial Peripheral Interface), periferiche che spaziano da memorie EEPROM seriali, a convertitori A/D, a controller CAN e molte altre tipologie.
Spesso i microcontrollori integrano al loro interno un controller dedicato SPI che consente di comunicare in modo semplice ed efficiente attraverso il bus SPI; esistono però molti microcontrollori che ne sono sprovvisti, ma hanno comunque disponibili alcuni pin configurabili come input o output, i cosiddetti GPIO (General Purpose Input/Output).
Attraverso questi GPIO è possibile progettare un apposito driver software che permetta anche ai microcontrollori senza un controller SPI integrato di interfacciarsi al bus di comunicazione SPI.
A proposito del bus SPI
Innanzitutto, qualche cenno sul bus SPI.
La trasmissione è una comunicazione seriale asincrona, in cui un dispositivo detto master controlla il bus ed, emettendo il segnale di clock, decide quando iniziare e terminare la comunicazione. I segnali dell'interfaccia SPI sono:
-
SCLK (SCK) : Serial Clock, clock seriale pilotato dal master
SDI (MISO) : Serial Data Input (Master Input Slave Output), pilotato dallo slave
SDO (MOSI) : Serial Data Output (Master Output Slave Input), pilotata dal master
CS : Chip Select, pilotato dal master per selezionare lo slave con cui comunicare (può essere omesso)
Il master, quando decide di trasferire un dato allo slave, eventualmente attiva il segnale CS, poi trasmette serialmente in SDO i primi 8 bit contenenti un comando (di solito un indirizzo e qualche bit di controllo) ed infine 8 o 16 bit di dato. In questa transazione il segnale SDI non è implicato. Analogamente, per trasferire un dato dallo slave al master, una volta attivato il CS, il master trasmette gli 8 bit di comando su SDO, poi riceve gli 8 o 16 bit di dato su SDI.
Realizzazione del driver SPI master
Il driver software implementa il lato master dell'interfaccia, ed è composto da 4 file:
-
SPI_intrf.c contiene le funzioni portabili di lettura e scrittura fra master e slave
SPI_intrf.h API (Application Program Interface) del file SPI_intrf.c
hw_intrf.c contiene le funzioni 'hardware-dependant'
hw_intrf.c API del file hw_intrf.c usata da SPI_intrf.c
L'API di SPI_intrf comprende le seguenti funzioni:
UINT16 SPI_write(UINT8 addr, UINT16 value)
trasferisce il valore value a 16 bit dal master allo slave, precedendo i dati dagli 8 bit contenuti in addr.
UINT16 SPI_read(UINT8 addr)
ritorna il valore a 16 bit trasferito dallo slave al master, dopo che addr è stato trasmesso allo slave.
UINT16 SPI_init()
inizializza il driver.
Funzionamento del driver
La figura mostra i segnali SPI, catturati con un osciloscopio, per una transazione da master a slave.
Nella parte superiore si possono riconoscere una serie di scritture da master a slave, ognuna separata dall'altra da CS=1. In questo caso infatti CS è attivo basso. Nella parte inferiore si osserva il particolare del clock, in relazione con i dati. Si può vedere la frequenza di funzionamento di circa 2.4MHz. Si può anche riconoscere il valore di addr trasmesso che è pari a 0x70 (MSB trasmesso per primo)
Limiti del driver
Il driver, come già detto, è facilmente portabile su diversi microcontrollori, a patto che questi abbiano alcuni GPIO (4, oppure 3 se il CS non viene usato) disponibili e sia possibile programmarli come output (SCLK, SDO, CS) e come input (SDI).
La velocità del clock è, in questo esempio, definita dalla velocità di esecuzione delle istruzioni da parte del processore. In particolare, il clock risulta essere di 2.4MHz, che un valore piuttosto alto ma compatibile con la periferica prevista.
Nel caso la periferica richieda valori più bassi, occorrerà inserire un qualche delay, generato con un timer del microcontrollore o in altro modo, fra le istruzioni che pilotano SCLK.
Viceversa, il driver software ha lo svantaggio che, con processori più lenti, la frequenza di SCLK può diventare molto bassa, e quindi anche la velocità di trasferimento si può abbassare notevolmente.
Nella sezione Download trovi il SPI-source
Umberto Calari, EOStech Srl
Repost: 2 Ott 2009
Ciao,
mi chiedevo se posso utilizzare il tuoi driver per interfacciare il PIC18F8723 con un giroscopio, l’L3G4200D della ST
saluti