- SPI în STM32F103C8
- Pinii SPI în Arduino
- Componente necesare
- Diagrama circuitului și conexiunile pentru tutorialul STM32 SPI
- Programare STM32 SPI
- Explicație de programare Master STM32 SPI
- Explicație privind programarea Slave Arduino SPI
În tutorialele noastre anterioare, am aflat despre comunicarea SPI și I2C între două plăci Arduino. În acest tutorial vom înlocui o placă Arduino cu placa Blue Pill care este STM32F103C8 și vom comunica cu placa Arduino utilizând magistrala SPI. În acest exemplu STM32 SPI, vom folosi Arduino UNO ca Slave și STM32F103C8 ca Master cu două afișaje LCD 16X2 atașate unul la altul separat. Două potențiometre sunt, de asemenea, conectate cu STM32 (PA0) și Arduino (A0) pentru a determina valorile de trimitere (de la 0 la 255) de la master la slave și slave la master, variind potențiometrul.
SPI în STM32F103C8
Comparând magistrala SPI în placa Arduino și STM32F103C8 Blue Pill, STM32 are 2 magistrale SPI în timp ce Arduino Uno are o singură magistrală SPI. Arduino Uno are microcontroler ATMEGA328, iar STM32F103C8 are ARM Cortex-M3, ceea ce îl face mai rapid decât placa Arudino.
Pentru a afla mai multe despre comunicarea SPI, consultați articolele noastre anterioare
- Cum se folosește SPI în Arduino: comunicare între două plăci Arduino
- Comunicare SPI cu microcontroler PIC PIC16F877A
- Comunicare SPI prin Bit Banging
- Detector de scurgere al rezervorului de apă fierbinte Raspberry Pi utilizând module SPI
- ESP32 Ceas în timp real folosind modulul DS3231
STM32 SPI Pinii STM32F103C8
Linia SPI1 | Pin în STM32F103C8 |
MOSI1 | PA7 sau PB5 |
MISO1 | PA6 sau PB4 |
SCK1 | PA5 sau PB3 |
SS1 | PA4 sau PA15 |
Linia SPI2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Pinii SPI în Arduino
Linia SPI |
Pin în Arduino |
MOSI |
11 sau ICSP-4 |
MISO |
12 sau ICSP-1 |
SCK |
13 sau ICSP-3 |
SS |
10 |
Componente necesare
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potențiometru 10k - 4
- Breadboard
- Conectarea firelor
Diagrama circuitului și conexiunile pentru tutorialul STM32 SPI
Tabelul de mai jos prezintă Pinii conectați pentru comunicarea STM32 SPI cu Arduino.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Tabelul de mai jos prezintă pinii conectați pentru Two LCD (16x2) cu STM32F103C8 și Arduino separat.
Pin LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
La codul PIN pentru centru potențiometru pentru contrast LCD |
La codul PIN pentru centru potențiometru pentru contrast 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:
- Nu uitați să conectați Arduino GND și STM32F103C8 GND împreună.
Programare STM32 SPI
Programarea este similară codului Arduino. La fel
În acest exemplu STM32 SPI, vom folosi Arduino UNO ca Slave și STM32F103C8 ca Master cu două afișaje LCD 16X2 atașate unul la altul separat. Două potențiometre sunt, de asemenea, conectate cu STM32 (PA0) și Arduino (A0) pentru a determina valorile de trimitere (de la 0 la 255) de la master la slave și slave la master, variind potențiometrul.
Intrarea analogică se face la pinul ST032F10C8 PA0 (0 la 3,3 V) prin rotirea potențiometrului. Apoi, această valoare de intrare este convertită în valoare analogică în digitală (0 la 4096) și această valoare digitală este mapată în continuare la (0 la 255), deoarece putem trimite doar date pe 8 biți (octeți) prin comunicare SPI simultan.
În mod similar, în partea Slave luăm valoarea de intrare analogică la pinul Arduino A0 de la (0 la 5V) folosind potențiometrul. Și din nou, această valoare de intrare este convertită în valoare analogică în digitală (0-1023), iar această valoare digitală este mapată în continuare (0-255)
Acest tutorial are două programe unul pentru master STM32 și altul pentru Arduino slave. Programe complete pentru ambele părți sunt oferite la sfârșitul acestui proiect cu un videoclip demonstrativ.
Explicație de programare Master STM32 SPI
1. În primul rând trebuie să includem biblioteca SPI pentru utilizarea funcțiilor de comunicare SPI și biblioteca LCD pentru utilizarea funcțiilor LCD. De asemenea, definiți pinii LCD pentru 16x2 LCD. Aflați mai multe despre interfața LCD cu STM32 aici.
#include
2. În configurare nulă ()
- Porniți comunicarea în serie la Baud Rate 9600.
Serial.begin (9600);
- Apoi începeți comunicarea SPI
SPI.begin ();
- Apoi setați divizorul de ceas pentru comunicarea SPI. Am setat divizorul 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Apoi setați pinul SS HIGH deoarece nu am început niciun transfer către arduino slave.
digitalWrite (SS, HIGH);
3. În bucla nulă ()
- Înainte de a trimite orice valoare către sclav, trebuie să scăzem valoarea de selectare a sclavului pentru a începe transferul către sclav de la stăpân.
digitalWrite (SS, LOW);
- Apoi citiți valoarea analogică de la masterul STM32F10C8 POT atașat pinului PA0.
int pot = analogRead (PA0);
Apoi convertiți această valoare în termeni de un octet (0 la 255).
octet MasterSend = hartă (pot, 0,4096,0,255);
- Aici vine pasul important, în următoarea declarație trimitem valoarea POT convertită stocată în variabila Mastersend către sclavul Arduino și primim, de asemenea, valoare de la sclavul Arduino și stocată în variabila mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Apoi afișați valorile primite de la arduino-ul slave cu o întârziere de 500 microsecunde și apoi primiți și afișați continuu valorile.
Serial.println ("Slave Arduino la 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);
Notă: Folosim serial.println () pentru a vizualiza rezultatul în Serial Motor of Arduino IDE.
Explicație privind programarea Slave Arduino SPI
1. La fel ca masterul, în primul rând trebuie să includem biblioteca SPI pentru utilizarea funcțiilor de comunicație I2C și biblioteca LCD pentru utilizarea funcțiilor LCD. De asemenea, definiți pinii LCD pentru 16x2 LCD.
#include
2. În configurare nulă ()
- Începem comunicarea în serie la rata Baud 9600.
Serial.begin (9600);
- Declarația de mai jos setează MISO ca OUTPUT (Trebuie să trimiteți date către Master IN). Deci, datele sunt trimise prin MISO al Slave Arduino.
pinMode (MISO, OUTPUT);
- Acum porniți SPI în modul Slave folosind SPI Control Register
SPCR - = _BV (SPE);
- Apoi porniți întreruperea pentru comunicarea SPI. Dacă se primesc date de la master, se apelează rutina de întrerupere a serviciului și valoarea primită este preluată din SPDR (SPI data Register)
SPI.attachInterrupt ();
- Valoarea de la master este preluată de la SPDR și stocată în variabila Slavereceived . Acest lucru are loc în urma funcției de întrerupere a rutinei.
ISR (SPI_STC_vect) {Slavereceived = SPDR; primit = adevărat; }
3. Următorul în bucla nulă ()
- Citiți valoarea analogică din Slave Arduino POT atașat pinului A0.
int pot = analogRead (A0);
- Convertiți acea valoare în termeni de un octet ca 0 la 255.
Slavesend = hartă (pot, 0,1023,0,255);
- Următorul pas important este să trimiteți valoarea convertită către Master STM32F10C8, așa că plasați valoarea în registrul SPDR. Registrul SPDR este utilizat pentru a trimite și primi valori.
SPDR = Slavă;
- Apoi afișați valoarea primită ( SlaveReceive ) de la Master STM32F103C8 pe LCD cu o întârziere de 500 microsecunde și apoi primiți și afișați în mod continuu acea valoare.
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); întârziere (500);
Prin rotirea potențiometru la o parte, puteți vedea valorile variind de pe ecranul LCD pe o altă latură:
Deci, așa are loc comunicarea SPI în STM32. Acum puteți interfața orice senzor SPI cu placa STM32.
Codificarea completă pentru Master STM32 și Slave Arduino este prezentată mai jos cu un videoclip demonstrativ