- SPI a STM32F103C8
- Pins SPI a Arduino
- Components necessaris
- Diagrama de circuits i connexions per a STM32 SPI Tutorial
- Programació SPM STM32
- Explicació de la programació mestra STM32 SPI
- Explicació de la programació Slave Arduino SPI
En els nostres tutorials anteriors, hem après sobre la comunicació SPI i I2C entre dues plaques Arduino. En aquest tutorial substituirem una placa Arduino per la placa Blue Pill que és STM32F103C8 i ens comunicarem amb la placa Arduino mitjançant el bus SPI. En aquest exemple STM32 SPI, utilitzarem Arduino UNO com a esclau i STM32F103C8 com a mestre amb dues pantalles LCD de 16X2 connectades entre si per separat. També es connecten dos potenciòmetres amb STM32 (PA0) i Arduino (A0) per determinar els valors d’enviament (0 a 255) de mestre a esclau i d’esclau a mestre variant el potenciòmetre.
SPI a STM32F103C8
Comparant el bus SPI a la placa Blue Pill Arduino i STM32F103C8, STM32 té 2 bus SPI, mentre que Arduino Uno té un bus SPI. Arduino Uno té microcontrolador ATMEGA328 i STM32F103C8 té ARM Cortex-M3, que el fa més ràpid que Arudino Board.
Per obtenir més informació sobre la comunicació SPI, consulteu els nostres articles anteriors
- Com utilitzar SPI a Arduino: comunicació entre dues plaques Arduino
- Comunicació SPI amb microcontrolador PIC PIC16F877A
- Comunicació SPI mitjançant Bit Banging
- Detector de fuites del dipòsit d’aigua calenta Raspberry Pi mitjançant mòduls SPI
- Rellotge ESP32 en temps real mitjançant el mòdul DS3231
STM32 SPI Pins STM32F103C8

| Línia SPI1 | Pin a STM32F103C8 |
| MOSI1 | PA7 o PB5 |
| MISO1 | PA6 o PB4 |
| SCK1 | PA5 o PB3 |
| SS1 | PA4 o PA15 |
| Línia SPI2 | |
| MOSI2 | PB15 |
| MISO2 | PB14 |
| SCK2 | PB13 |
| SS2 | PB12 |
Pins SPI a Arduino

|
Línia SPI |
Pin a Arduino |
|
MOSI |
11 o ICSP-4 |
|
MISO |
12 o ICSP-1 |
|
SCK |
13 o ICSP-3 |
|
SS |
10 |
Components necessaris
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potenciòmetre de 10 k: 4
- Taula de pa
- Connexió de cables
Diagrama de circuits i connexions per a STM32 SPI Tutorial


La taula següent mostra els pins connectats per a la comunicació STM32 SPI amb Arduino.
|
Pin SPI |
STM32F103C8 |
Arduino |
|
MOSI |
PA7 |
11 |
|
MISO |
PA6 |
12 |
|
SCK |
PA5 |
13 |
|
SS1 |
PA4 |
10 |
La taula següent mostra els pins connectats per a dues pantalles LCD (16x2) amb STM32F103C8 i Arduino per separat.
|
Pin LCD |
STM32F103C8 |
Arduino |
|
VSS |
GND |
GND |
|
VDD |
+ 5V |
+ 5V |
|
V0 |
Al PIN del centre del potenciòmetre per al contrast de la pantalla LCD |
Al PIN del centre del potenciòmetre per al contrast de la pantalla LCD |
|
RS |
PB0 |
2 |
|
RW |
GND |
GND |
|
E |
PB1 |
3 |
|
D4 |
PB10 |
4 |
|
D5 |
PB11 |
5 |
|
D6 |
PC13 |
6 |
|
D7 |
PC14 |
7 |
|
A |
+ 5V |
+ 5V |
|
K |
GND |
GND |
Important:
- No us oblideu de connectar l'Arduino GND i el STM32F103C8 GND.
Programació SPM STM32
La programació és similar al codi Arduino. El mateix
En aquest exemple STM32 SPI, utilitzarem Arduino UNO com a esclau i STM32F103C8 com a mestre amb dues pantalles LCD de 16X2 connectades entre si per separat. També es connecten dos potenciòmetres amb STM32 (PA0) i Arduino (A0) per determinar els valors d’enviament (0 a 255) de mestre a esclau i d’esclau a mestre variant el potenciòmetre.
L'entrada analògica es pren al pin PA0 de STM32F10C8 (0 a 3,3 V) girant el potenciòmetre. A continuació, aquest valor d'entrada es converteix en valor analògic a digital (0 a 4096) i aquest valor digital es mapea a (0 a 255), ja que només podem enviar dades de 8 bits (bytes) a través de la comunicació SPI alhora.
De la mateixa manera, al costat esclau prenem el valor d'entrada analògica al pin A0 d'Arduino de (0 a 5V) mitjançant un potenciòmetre. I, de nou, aquest valor d'entrada es converteix en valor analògic a digital (0 a 1023) i aquest valor digital es mapea a (0 a 255)
Aquest tutorial té dos programes, un per al mestre STM32 i un altre per a Arduino esclau. Al final d’aquest projecte es donen programes complets per a les dues parts amb un vídeo de demostració.
Explicació de la programació mestra STM32 SPI
1. Primer de tot, hem d' incloure la biblioteca SPI per utilitzar les funcions de comunicació SPI i la biblioteca LCD per utilitzar les funcions LCD. Definiu també pins LCD per a LCD de 16x2. Obteniu més informació sobre la interfície de la pantalla LCD amb STM32 aquí.
#incloure
2. Configuració nul·la ()
- Inicieu la comunicació en sèrie a Baud Rate 9600.
Serial.begin (9600);
- A continuació, comenceu la comunicació SPI
SPI.begin ();
- A continuació, configureu el divisor de rellotge per a la comunicació SPI. He establert el divisor 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- A continuació, configureu el pin SS HIGH ja que no vam iniciar cap transferència a arduino esclau.
digitalWrite (SS, HIGH);
3. En bucle buit ()
- Abans d'enviar cap valor a l'esclau, hem de BAIXAR el valor de selecció esclau per començar a transferir-lo a l'esclau des del mestre.
digitalWrite (SS, BAIX);
- A continuació, llegiu el valor analògic del POT mestre STM32F10C8 connectat al pin PA0.
int pot = analogRead (PA0);
A continuació, converteix aquest valor en termes d’un byte (0 a 255).
byte MasterSend = mapa (pot, 0,4096,0,255);
- Aquí ve el pas important: a la següent declaració, enviem el valor POT convertit emmagatzemat a la variable Mastersend a l’esclau Arduino i també rebem el valor de l’esclau Arduino i l’emmagatzema a la variable mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- A continuació, mostreu els valors rebuts de l'arduino esclau amb un retard de 500 microsegons i, a continuació, rebreu i visualitzeu els valors.
Serial.println ("Arduino esclau a Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive delay (500); digitalWrite (SS, HIGH);
Nota: Utilitzem serial.println () per veure el resultat a Serial Motor of Arduino IDE.
Explicació de la programació Slave Arduino SPI
1. Igual que el mestre, primer de tot hem d’ incloure la biblioteca SPI per utilitzar funcions de comunicació I2C i la biblioteca LCD per utilitzar funcions LCD. Definiu també pins LCD per a LCD de 16x2.
#incloure
2. Configuració nul·la ()
- Comencem la comunicació en sèrie a Baud Rate 9600.
Serial.begin (9600);
- A continuació, la sentència defineix MISO com a SORTIDA (heu d’enviar dades a Master IN). Així, les dades s’envien mitjançant MISO de Slave Arduino.
pinMode (MISO, OUTPUT);
- Ara activeu SPI en mode esclau mitjançant el registre de control SPI
SPCR - = _BV (SPE);
- A continuació, activeu la interrupció per a la comunicació SPI. Si es reben dades del mestre, es crida a la rutina de servei d'interrupció i el valor rebut es pren de SPDR (registre de dades SPI)
SPI.attachInterrupt ();
- El valor del mestre es pren de SPDR i s’emmagatzema a la variable Slavereceived . Això té lloc a la funció de la rutina d'interrupció.
ISR (SPI_STC_vect) {Slavereceived = SPDR; rebut = cert; }
3. Següent en bucle buit ()
- Llegiu el valor analògic del SOTA Arduino POT connectat al pin A0.
int pot = analogRead (A0);
- Convertiu aquest valor en termes d’un byte de 0 a 255.
Slavesend = mapa (pot, 0,1023,0,255);
- El següent pas important és enviar el valor convertit al Master STM32F10C8, de manera que col·loqueu el valor al registre SPDR. El registre SPDR s’utilitza per enviar i rebre valors.
SPDR = enviació d'esclaus;
- A continuació, mostreu el valor rebut ( SlaveReceive ) del Master STM32F103C8 a la pantalla LCD amb un retard de 500 microsegons i, a continuació, rebreu i visualitzeu el valor.
lcd.setCursor (0,0); lcd.print ("Esclau: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 a Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); retard (500);
En girar el potenciòmetre per un costat, podeu veure els diferents valors a la pantalla LCD d’un altre costat:

Així doncs, així es produeix la comunicació SPI a STM32. Ara podeu connectar qualsevol sensor SPI amb la placa STM32.
A continuació es mostra la codificació completa per a Master STM32 i Slave Arduino amb un vídeo de demostració
