- SPI in STM32F103C8
- Pin SPI in Arduino
- Componenti richiesti
- Schema del circuito e connessioni per il tutorial SPI STM32
- Programmazione SPI STM32
- Spiegazione della programmazione SPI STM32 master
- Spiegazione della programmazione SPI di Arduino slave
Nei nostri tutorial precedenti, abbiamo imparato a conoscere la comunicazione SPI e I2C tra due schede Arduino. In questo tutorial sostituiremo una scheda Arduino con la scheda Blue Pill che è STM32F103C8 e comunicheremo con la scheda Arduino utilizzando il bus SPI. In questo esempio STM32 SPI, useremo Arduino UNO come Slave e STM32F103C8 come Master con due display LCD 16X2 collegati l'uno all'altro separatamente. Due Potenziometri sono inoltre collegati con STM32 (PA0) e Arduino (A0) per determinare i valori di invio (da 0 a 255) da master a slave e da slave a master variando il potenziometro.
SPI in STM32F103C8
Confrontando il bus SPI nella scheda Blue Pill di Arduino e STM32F103C8, STM32 ha 2 bus SPI mentre Arduino Uno ha un bus SPI. Arduino Uno ha un microcontrollore ATMEGA328 e STM32F103C8 ha ARM Cortex-M3 che lo rende più veloce della scheda Arudino.
Per ulteriori informazioni sulla comunicazione SPI, fare riferimento ai nostri articoli precedenti
- Come utilizzare SPI in Arduino: comunicazione tra due schede Arduino
- Comunicazione SPI con microcontrollore PIC PIC16F877A
- Comunicazione SPI tramite Bit Banging
- Rilevatore di perdite del serbatoio dell'acqua calda Raspberry Pi con moduli SPI
- Orologio in tempo reale ESP32 utilizzando il modulo DS3231
Pin STM32 SPI STM32F103C8
Linea SPI 1 | Pin in STM32F103C8 |
MOSI1 | PA7 o PB5 |
MISO1 | PA6 o PB4 |
SCK1 | PA5 o PB3 |
SS1 | PA4 o PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Pin SPI in Arduino
Linea SPI |
Pin in Arduino |
MOSI |
11 o ICSP-4 |
MISO |
12 o ICSP-1 |
SCK |
13 o ICSP-3 |
SS |
10 |
Componenti richiesti
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potenziometro 10k - 4
- Breadboard
- Collegamento dei cavi
Schema del circuito e connessioni per il tutorial SPI STM32
La tabella seguente mostra i pin collegati per la comunicazione STM32 SPI con Arduino.
Pin SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
La tabella seguente mostra i pin collegati per Two LCD (16x2) con STM32F103C8 e Arduino separatamente.
Perno LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Al potenziometro PIN centrale per il contrasto LCD |
Al potenziometro PIN centrale per il contrasto LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
UN |
+ 5V |
+ 5V |
K |
GND |
GND |
Importante:
- Non dimenticare di connettere Arduino GND e STM32F103C8 GND insieme.
Programmazione SPI STM32
La programmazione è simile al codice Arduino. Lo stesso
In questo esempio STM32 SPI, useremo Arduino UNO come Slave e STM32F103C8 come Master con due display LCD 16X2 collegati l'uno all'altro separatamente. Due Potenziometri sono inoltre collegati con STM32 (PA0) e Arduino (A0) per determinare i valori di invio (da 0 a 255) da master a slave e da slave a master variando il potenziometro.
L'ingresso analogico viene preso al pin PA0 STM32F10C8 (da 0 a 3,3 V) ruotando il potenziometro. Quindi questo valore di ingresso viene convertito in valore da analogico a digitale (da 0 a 4096) e questo valore digitale viene ulteriormente mappato a (da 0 a 255) poiché possiamo inviare solo dati a 8 bit (byte) contemporaneamente attraverso la comunicazione SPI.
Allo stesso modo nel lato Slave prendiamo il valore di ingresso analogico sul pin Arduino A0 da (0 a 5 V) utilizzando il potenziometro. E ancora questo valore di ingresso viene convertito in valore da analogico a digitale (da 0 a 1023) e questo valore digitale viene ulteriormente mappato a (da 0 a 255)
Questo tutorial ha due programmi uno per il master STM32 e l'altro per lo slave Arduino. I programmi completi per entrambe le parti sono forniti alla fine di questo progetto con un video dimostrativo.
Spiegazione della programmazione SPI STM32 master
1. Prima di tutto dobbiamo includere la libreria SPI per l'utilizzo delle funzioni di comunicazione SPI e la libreria LCD per l'utilizzo delle funzioni LCD. Definire anche i pin LCD per LCD 16x2. Ulteriori informazioni sull'interfacciamento dell'LCD con STM32 qui.
#includere
2. In void setup ()
- Avvia la comunicazione seriale alla velocità di trasmissione 9600.
Serial.begin (9600);
- Quindi inizia la comunicazione SPI
SPI.begin ();
- Quindi impostare il divisore dell'orologio per la comunicazione SPI. Ho impostato il divisore 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Quindi imposta il pin SS su ALTO poiché non abbiamo avviato alcun trasferimento su arduino slave.
digitalWrite (SS, HIGH);
3. In void loop ()
- Prima di inviare qualsiasi valore allo slave, è necessario ridurre il valore di selezione dello slave per iniziare il trasferimento allo slave dal master.
digitalWrite (SS, LOW);
- Quindi leggere il valore analogico dal POT STM32F10C8 master collegato al pin PA0.
int pot = analogRead (PA0);
Quindi converti questo valore in termini di un byte (da 0 a 255).
byte MasterSend = map (pot, 0,4096,0,255);
- Ecco il passaggio importante, nella seguente istruzione inviamo il valore POT convertito memorizzato nella variabile Mastersend all'Arduino slave, e riceviamo anche il valore dallo slave Arduino e lo memorizziamo nella variabile mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Successivamente visualizza i valori ricevuti dallo slave arduino con un ritardo di 500 microsecondi e quindi ricevi e visualizza continuamente i valori.
Serial.println ("Slave Arduino to Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (ritardo MasterReceive (500); digitalWrite (SS, HIGH);
Nota: usiamo serial.println () per visualizzare il risultato in Serial Motor di Arduino IDE.
Spiegazione della programmazione SPI di Arduino slave
1. Come il master, prima di tutto dobbiamo includere la libreria SPI per usare le funzioni di comunicazione I2C e la libreria LCD per usare le funzioni LCD. Definire anche i pin LCD per LCD 16x2.
#includere
2. In void setup ()
- Iniziamo la comunicazione seriale al baud rate 9600.
Serial.begin (9600);
- L'istruzione seguente imposta MISO come OUTPUT (Devo inviare dati a Master IN), quindi i dati vengono inviati tramite MISO di Slave Arduino.
pinMode (MISO, OUTPUT);
- 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 servizio 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. Avanti in void loop ()
- Leggere il valore analogico dal POT Slave Arduino collegato al pin A0.
int pot = analogRead (A0);
- Converti quel valore in termini di un byte da 0 a 255.
Slavesend = mappa (piatto, 0,1023,0,255);
- Il prossimo passo importante è inviare il valore convertito al Master STM32F10C8, quindi inserire il valore nel registro SPDR. Il registro SPDR viene utilizzato per inviare e ricevere valori.
SPDR = Slavesend;
- Quindi visualizzare il valore ricevuto ( SlaveReceive ) dal Master STM32F103C8 sul display LCD con un ritardo di 500 microsecondi e quindi ricevere e visualizzare continuamente quel valore.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); ritardo (500);
Con ruotando il potenziometro da un lato, è possibile vedere i valori variabili sul display LCD su un altro lato:
Ecco come avviene la comunicazione SPI in STM32. Ora puoi interfacciare qualsiasi sensore SPI con la scheda STM32.
La codifica completa per Master STM32 e Slave Arduino è fornita di seguito con un video dimostrativo