Collegare dispositivi SPI

Da raspibo.
Jump to navigation Jump to search

SPI e' un bus seriale a (almeno) tre fili: clock, MISO (master input, slave output), MOSI (master output, slave input). "Almeno" perche' se volete collegare piu' unita' al bus occorre un filo di "abilitazione" per ogni unita'.

Raspberry PI ha il supporto sul pettine di contatti per funzionare come master con due unita' SPI collegate.

I fili da usare sono:

  • Pin 19/GPIO 10/SPI_MOSI
  • Pin 21/GPIO 9/SPI_MISO
  • Pin 23/GPIO 11/SPI_CLK
  • Pin 24/GPIO 8/SPI enable 0
  • Pin 26/GPIO 7/SPI enable 1

Usando questi fili si puo' usare il driver del kernel altrimenti e' possibile usare altri fili e gestire l'intero protocollo SPI via software (il cosiddetto bit banging).

Qui verrà descritto il funzionamento con il driver del kernel. Un esempio che usa bit banging si puo' trovare in questa spiegazione di Adafruit

Per poter usare il supporto del kernel per SPI occorre caricare il relativo modulo:

# modprobe spi_bcm2708

Compariranno (udev-magicamente) i due device /dev/spidev0.0 e /dev/spidev0.1, che corrispondono rispettivamente alle unita' che avrete collegato usando il pin 24 o il pin 26 per enable.

Per provare il funzionamento di SPI potete caricare dalla documentazione ufficiale del kernel linux il file spidev_test.c. Compilatelo:

gcc -o spidev_test spidev_test.c

e eseguitelo (come root).

# ./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 

Vengono visualizzati i dati ricevuti, nessuno in questo momento perche' MISO e' scollegato. Provate ora a collegare MISO con MOSI (il pin 19 col pin 21, in altre parole GPIO 10 con GPIO 9). In questo modo SPI legge i dati che spedisce. Infatti se si esegue nuovamente il programma:

# ./spidev_test ./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF 
40 00 00 00 00 95 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
DE AD BE EF BA AD 
F0 0D 

viene letto il vettore di byte spedito. (l'autore deve esseree vegetariano come me: dead beef baad f00d!).