- Cos'è SPI?
- Lavoro di SPI
- Pin SPI in Arduino UNO
- Utilizzo di SPI in Arduino
- Componenti necessari per la comunicazione SPI di Arduino
- Schema del circuito di comunicazione SPI di Arduino
- Come programmare Arduino per la comunicazione SPI:
- Spiegazione della programmazione principale di Arduino SPI
- Spiegazione della programmazione dello slave SPI di Arduino
- Come funziona SPI su Arduino? - Proviamolo!
Un microcontrollore utilizza molti protocolli diversi per comunicare con vari sensori e moduli. Esistono molti tipi diversi di protocolli di comunicazione per la comunicazione wireless e cablata e la tecnica di comunicazione più comunemente utilizzata è la comunicazione seriale. La comunicazione seriale è il processo di invio di dati un bit alla volta, in sequenza, su un canale di comunicazione o un bus. Esistono molti tipi di comunicazione seriale come UART, CAN, USB, I2C e SPI.
In questo tutorial, apprendiamo il protocollo SPI e come usarlo in Arduino. Useremo il protocollo SPI per la comunicazione tra due Arduino. Qui un Arduino fungerà da Master e un altro fungerà da Slave, due LED e due pulsanti saranno collegati ad entrambi l'Arduino. Per dimostrare la comunicazione SPI, controlleremo il LED lato master tramite il pulsante sul lato slave e viceversa utilizzando il protocollo di comunicazione seriale SPI.
Cos'è SPI?
SPI (Serial Peripheral Interface) è un protocollo di comunicazione seriale. L'interfaccia SPI è stata trovata da Motorola nel 1970. SPI ha una connessione full-duplex, il che significa che i dati vengono inviati e ricevuti simultaneamente. Cioè un master può inviare dati a uno slave e uno slave può inviare dati al master contemporaneamente. SPI è una comunicazione seriale sincrona, significa che l'orologio è necessario per scopi di comunicazione.
La comunicazione SPI è stata precedentemente spiegata in altri microcontrollori:
- Comunicazione SPI con microcontrollore PIC PIC16F877A
- Interfacciamento LCD TFT touch screen da 3,5 pollici con Raspberry Pi
- Programmazione del microcontrollore AVR con pin SPI
- Interfacciamento LCD grafico del Nokia 5110 con Arduino
Lavoro di SPI
Uno SPI ha una comunicazione master / slave utilizzando quattro linee. Uno SPI può avere un solo master e può avere più slave. Un master è solitamente un microcontrollore e gli slave possono essere un microcontrollore, sensori, ADC, DAC, LCD ecc.
Di seguito è riportata la rappresentazione dello schema a blocchi di SPI Master con Single Slave.
SPI ha le seguenti quattro linee MISO, MOSI, SS e CLK
- MISO (Master in Slave Out) - La linea Slave per l'invio dei dati al master.
- MOSI (Master Out Slave In) - La linea Master per l'invio di dati alle periferiche.
- SCK (Serial Clock) - Gli impulsi di clock che sincronizzano la trasmissione dei dati generati dal master.
- SS (Slave Select): il master può utilizzare questo pin per abilitare e disabilitare dispositivi specifici.
Master SPI con più schiavi
Per avviare la comunicazione tra master e slave, è necessario impostare il pin Slave Select (SS) del dispositivo richiesto su LOW, in modo che possa comunicare con il master. Quando è alto, ignora il master. Ciò consente di avere più dispositivi SPI che condividono le stesse linee di master MISO, MOSI e CLK. Come puoi vedere nell'immagine sopra ci sono quattro slave in cui SCLK, MISO, MOSI sono collegati in comune al master e gli SS di ogni slave sono collegati separatamente ai singoli pin SS (SS1, SS2, SS3) del master. Impostando il pin SS richiesto su BASSO un master può comunicare con quello slave.
Pin SPI in Arduino UNO
L'immagine sotto mostra i pin SPI presenti Arduino UNO (nel riquadro rosso).
Linea SPI |
Pin in Arduino |
MOSI |
11 o ICSP-4 |
MISO |
12 o ICSP-1 |
SCK |
13 o ICSP-3 |
SS |
10 |
Utilizzo di SPI in Arduino
Prima di iniziare la programmazione per la comunicazione SPI tra due Arduino. Dobbiamo conoscere la libreria Arduino SPI utilizzata nell'IDE di Arduino.
La Biblioteca
1. SPI.begin ()
USO: per inizializzare il bus SPI impostando SCK, MOSI e SS sulle uscite, portando SCK e MOSI bassi e SS alti.
2. SPI.setClockDivider (divisore)
UTILIZZO: Per impostare il divisore dell'orologio SPI relativo all'orologio di sistema. I divisori disponibili sono 2, 4, 8, 16, 32, 64 o 128.
Divisori:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (gestore)
UTILIZZO: Questa funzione viene chiamata quando un dispositivo slave riceve dati dal master.
4. SPI.transfer (val)
UTILIZZO: Questa funzione viene utilizzata per inviare e ricevere simultaneamente i dati tra master e slave.
Quindi ora iniziamo con la dimostrazione pratica del protocollo SPI in Arduino. In questo tutorial useremo due arduino uno come master e l'altro come slave. Entrambi gli Arduino sono collegati separatamente con un LED e un pulsante. Il LED master può essere controllato utilizzando il pulsante di Arduino slave e il LED di Arduino slave può essere controllato dal pulsante di Arduino master utilizzando il protocollo di comunicazione SPI presente in arduino.
Componenti necessari per la comunicazione SPI di Arduino
- Arduino UNO (2)
- LED (2)
- Pulsante (2)
- Resistenza 10k (2)
- Resistenza 2.2k (2)
- Breadboard
- Collegamento dei cavi
Schema del circuito di comunicazione SPI di Arduino
Lo schema del circuito seguente mostra come utilizzare SPI su Arduino UNO, ma è possibile seguire la stessa procedura per Arduino Mega SPI Communication o Arduino nano SPI communication. Quasi tutto rimarrà lo stesso tranne il numero del pin. Devi controllare il pinout di Arduino nano o mega per trovare i pin Arduino nano SPI e i pin Arduino Mega, una volta che hai fatto tutto il resto sarà lo stesso.
Ho costruito il circuito sopra mostrato su una breadboard, puoi vedere la configurazione del circuito che ho usato per i test di seguito.
Come programmare Arduino per la comunicazione SPI:
Questo tutorial ha due programmi uno per master Arduino e l'altro per slave Arduino. I programmi completi per entrambe le parti sono forniti alla fine di questo progetto.
Spiegazione della programmazione principale di Arduino SPI
1. Prima di tutto dobbiamo includere la libreria SPI per l'utilizzo delle funzioni di comunicazione SPI.
#includere
2. In void setup ()
- Iniziamo la comunicazione seriale alla velocità di trasmissione 115200.
Serial.begin (115200);
- Collegare il LED al pin 7 e il pulsante Push al pin 2 e impostare i pin OUTPUT e INPUT rispettivamente.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Successivamente iniziamo la comunicazione SPI
SPI.begin ();
- Successivamente impostiamo il Clockdivider per la comunicazione SPI. Qui abbiamo impostato il divisore 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Quindi impostare il pin SS su ALTO poiché non abbiamo avviato alcun trasferimento su slave arduino.
digitalWrite (SS, HIGH);
3. In void loop ():
- Leggiamo lo stato del pin del pulsante collegato al pin2 (Master Arduino) per l'invio di quei valori allo slave Arduino.
buttonvalue = digitalRead (ipbutton);
- Imposta logica per l'impostazione del valore x (da inviare allo slave) a seconda dell'input dal pin 2
if (buttonvalue == HIGH) { x = 1; } altro { x = 0; }
- Prima di inviare il valore è necessario ridurre il valore di selezione dello slave per iniziare il trasferimento allo slave dal master.
digitalWrite (SS, LOW);
- Ecco il passaggio importante, nella seguente dichiarazione inviamo il valore del pulsante memorizzato nella variabile Mastersend all'arduino slave e riceviamo anche il valore dallo slave che verrà memorizzato nella variabile Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Dopodiché, a seconda del valore di Mastereceive , accenderemo o spegneremo il LED Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Imposta il pin 7 HIGH Serial.println ("Master LED ON"); } altro { digitalWrite (LED, LOW); // Imposta il pin 7 BASSO Serial.println ("Master LED OFF"); }
Nota: usiamo serial.println () per visualizzare il risultato in Serial Motor di Arduino IDE. Controlla il video alla fine.
Spiegazione della programmazione dello slave SPI di Arduino
1. Prima di tutto dobbiamo includere la libreria SPI per l'utilizzo delle funzioni di comunicazione SPI.
#includere
2. In void setup ()
- Iniziamo la comunicazione seriale alla velocità di trasmissione 115200.
Serial.begin (115200);
- Collegare il LED al pin 7 e il pulsante Push al pin2 e impostare rispettivamente i pin OUTPUT e INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Il passo importante qui è le seguenti dichiarazioni
pinMode (MISO, OUTPUT);
La dichiarazione di cui sopra imposta MISO come OUTPUT (deve inviare dati a Master IN). Quindi i dati vengono inviati tramite MISO di Slave Arduino.
- Ora attiva SPI in modalità Slave utilizzando SPI Control Register
SPCR - = _BV (SPE);
- Quindi attivare l'interruzione per la comunicazione SPI. Se un dato viene ricevuto dal master, viene chiamata la routine di interrupt e il valore ricevuto viene preso da SPDR (registro dati SPI)
SPI.attachInterrupt ();
- Il valore del master viene preso da SPDR e memorizzato nella variabile Slavereceived . Ciò avviene nella seguente funzione di routine di interrupt.
ISR (SPI_STC_vect) { Slavereceived = SPDR; ricevuto = vero; }
3. Successivamente in void loop () impostiamo il LED Arduino Slave per accendersi o spegnersi a seconda del valore Slavereceived.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Imposta il pin 7 come HIGH LED ON Serial.println ("Slave LED ON"); } altro { digitalWrite (LEDpin, LOW); // Imposta il pin 7 come LOW LED OFF Serial.println ("Slave LED OFF"); }
- Successivamente leggiamo lo stato del pulsante Slave Arduino e memorizziamo il valore in Slavesend per inviare il valore al Master Arduino dando valore al registro SPDR.
buttonvalue = digitalRead (buttonpin); if (buttonvalue == HIGH) {x = 1; } altro {x = 0; } Slavesend = x; SPDR = Slavesend;
Nota: usiamo serial.println () per visualizzare il risultato in Serial Motor di Arduino IDE. Controlla il video alla fine.
Come funziona SPI su Arduino? - Proviamolo!
Di seguito è riportata l'immagine della configurazione finale per la comunicazione SPI tra due schede Arduino.
Quando si preme il pulsante sul lato master, il LED bianco sul lato slave si accende.
E quando il pulsante sul lato Slave viene premuto, il LED rosso sul lato Master si accende.
Puoi guardare il video qui sotto per vedere la dimostrazione della comunicazione SPI di Arduino. Se hai domande per favore lasciale nella sezione commenti, usa i nostri forum.