SPI con Bash - Obsoleto

Rapsberry Pi: SPI con Bash 

Attenzione

Questa pagina l'ho scritta molto tempo fa e contiene materiale obsoleto

L'uso è sconsigliato e non posso più fornire alcun supporto

Il contenuto di questa pagina è da rivedere in quanto con le versioni attuali di Raspbian la frequenza di clock SPI all'accensione è 125 MHz, quindi inadatta per l'uso con i circuiti indicati. Non esistono metodi standard per impostare la frequenza del clock.

Trasmissione

In Raspbian non esiste al momento uno strumento di supporto utilizzabile direttamente da Bash. L'unica possibilità sembra essere quella di inviare una sequenza di byte verso il file /dev/spidev0.x per trasmettere i dati con le impostazioni di default. L'immagine seguente è stata ottenuta con il comando:

vv@vvrpi ~ $ echo -en '\xF0\x55' > /dev/spidev0.0

Scrittura di due byte

Le osservazioni:

Il ritardo introdotto tra l'attivazione di CE e l'effettivo inizio della comunicazione (latenza) potrebbe avere un impatto negativo:

Il jotter

Un esempio: MCP4822

MCP4822 è un doppio convertitore digitale analogico a 12 bit, capace di generare tensioni tra 0 e 2.048 V. Per i dettagli potete consultare il foglio tecnico.

Lo schema di collegamento è piuttosto semplice: è sufficiente collegare i pin dell'interfaccia SPI e alimentare il circuito. L'unica avvertenza è collegare il pin LDAC a massa per rendere immediato l'aggiornamento dell'uscita. Per semplicità non sono stati disegnati i condensatori di disaccoppiamento tra massa e alimentazione, certamente utili, ma non strettamente indispensabili per le finalità qui illustrate.

Collegare  in DAC a Raspberry Pi

Attenzione! Anche se questo circuito integrato può funzionare senza problemi a 5 V, il Raspberry Pi verrebbe irrimediabilmente danneggiato usando tale tensione di alimentazione (non sono state ovviamente fatte verifiche...).

Scorrendo il foglio tecnico si legge che per impostare una tensione di uscita è necessario scrivere 16 bit, cioè due byte. In breve e senza entrare nei dettagli occorre mandare la seguente sequenza di bit:

A/B  x  1  1  D11  D10  D9  D8  D7  D6 D5  D4  D3  D2 D1 D0

Due esempi:

Il codice è di conseguenza:

vv@vvrpi ~ $ echo -en '\x3F\xFF' > /dev/spidev0.1
vv@vvrpi ~ $ echo -en '\xB8\x00' > /dev/spidev0.1

Ovviamente per verificare il funzionamento occorre misurare con un multimetro le tensioni tra le uscita OUTA massa oppure tra OUTB e massa; il comando funzionerebbe esattamente allo stesso modo anche senza alcun convertitore collegato...

Un altro esempio: AD8402

Si tratta di un potenziometro digitale doppio. Lo schema:

AD8402 connesso a Raspberry Pi

Dal punto di vista funzionale il circuito si comporta come una coppia di potenziometri meccanici da 10 kΩ connessi tra massa e alimentazione attraverso due resistenze da 1 kΩ:

Doppio potenziometro

Ovviamente in questo caso non occorre ruotare alcun albero, ma trasmettere una stringa di bit, formata da 10 bit, come descritto nel foglio tecnico:

La difficoltà (apparente) risiede nel fatto che possono essere trasmessi solo gruppi di 8 bit. Per questo utilizzeremo due byte: i sei bit in eccesso dovranno essere i primi ad essere trasmessi; essi saranno ignorati in quanto verranno mandati in uscita al registro a scorrimento del potenziometro e si "perderanno nel nulla".

Due esempi (supponendo di porre i bit irrilevanti a 0):

Il codice è di conseguenza:

vv@vvrpi ~ $ echo -en '\x01\x80' > /dev/spidev0.0
vv@vvrpi ~ $ echo -en '\x00\x00' > /dev/spidev0.0

Non viene qui proposto alcun esempio di lettura dal bus SPI in quanto con Bash non è possibile andare oltre la generazione dei segnali. O, forse, non sono semplicemente stato in grado di farlo... Per fortuna esiste il C.

Prima di creazione di questa pagina: luglio 2013
Ultima modifica: 31 marzo 2018


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima