- SPI i STM32F103C8
- SPI Pins i Arduino
- Komponenter, der kræves
- Kredsløbsdiagram og forbindelser til STM32 SPI-vejledning
- STM32 SPI-programmering
- Master STM32 SPI Programmering Forklaring
- Slave Arduino SPI Programmering Forklaring
I vores tidligere tutorials har vi lært om SPI og I2C kommunikation mellem to Arduino boards. I denne vejledning udskifter vi et Arduino-kort med Blue Pill-kortet, der er STM32F103C8 og kommunikerer med Arduino-kortet ved hjælp af SPI-bus. I dette STM32 SPI-eksempel bruger vi Arduino UNO som slave og STM32F103C8 som master med to 16X2 LCD-skærme, der er fastgjort til hinanden separat. To potentiometre er også forbundet med STM32 (PA0) og Arduino (A0) for at bestemme sendeværdierne (0 til 255) fra master til slave og slave til master ved at variere potentiometeret.
SPI i STM32F103C8
Sammenligning af SPI-bus i Arduino & STM32F103C8 Blue Pill-kort har STM32 2 SPI-bus i sig, mens Arduino Uno har en SPI-bus. Arduino Uno har ATMEGA328 mikrocontroller i sig, og STM32F103C8 har ARM Cortex-M3, hvilket gør det hurtigere end Arudino Board.
For at lære mere om SPI-kommunikation, se vores tidligere artikler
- Sådan bruges SPI i Arduino: Kommunikation mellem to Arduino Boards
- SPI-kommunikation med PIC Microcontroller PIC16F877A
- SPI-kommunikation via Bit Banging
- Raspberry Pi varmtvandsbeholder lækagedetektor ved hjælp af SPI-moduler
- ESP32 Real Time Clock ved hjælp af DS3231-modul
STM32 SPI-stifter STM32F103C8
SPI Line1 | Pin i STM32F103C8 |
MOSI1 | PA7 eller PB5 |
MISO1 | PA6 eller PB4 |
SCK1 | PA5 eller PB3 |
SS1 | PA4 eller PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI Pins i Arduino
SPI Line |
Pin i Arduino |
MOSI |
11 eller ICSP-4 |
MISO |
12 eller ICSP-1 |
SCK |
13 eller ICSP-3 |
SS |
10 |
Komponenter, der kræves
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potentiometer - 4
- Brødbræt
- Tilslutning af ledninger
Kredsløbsdiagram og forbindelser til STM32 SPI-vejledning
Nedenstående tabel viser stifterne forbundet til STM32 SPI-kommunikation med Arduino.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Nedenstående tabel viser stifterne, der er tilsluttet to LCD (16x2) med STM32F103C8 og Arduino separat.
LCD-pin |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Til Potentiometer Center PIN for LCD kontrast |
Til Potentiometer Center PIN for LCD kontrast |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
EN |
+ 5V |
+ 5V |
K |
GND |
GND |
Vigtig:
- Glem ikke at forbinde Arduino GND og STM32F103C8 GND sammen.
STM32 SPI-programmering
Programmeringen svarer til Arduino-koden. Det samme
I dette STM32 SPI-eksempel bruger vi Arduino UNO som slave og STM32F103C8 som master med to 16X2 LCD-skærme, der er fastgjort til hinanden separat. To potentiometre er også forbundet med STM32 (PA0) og Arduino (A0) for at bestemme sendeværdierne (0 til 255) fra master til slave og slave til master ved at variere potentiometeret.
Analog indgang tages ved STM32F10C8 ben PA0 (0 til 3,3 V) ved at dreje potentiometeret. Derefter konverteres denne inputværdi til Analog til Digital værdi (0 til 4096), og denne digitale værdi kortlægges yderligere til (0 til 255), da vi kun kan sende 8-bit (byte) data via SPI-kommunikation på én gang.
På samme måde i Slave-siden tager vi den analoge inputværdi ved Arduino-pin A0 fra (0 til 5V) ved hjælp af potentiometer. Og igen konverteres denne inputværdi til Analog til Digital værdi (0 til 1023), og denne digitale værdi kortlægges yderligere til (0 til 255)
Denne vejledning har to programmer et til master STM32 og et andet til slave Arduino. Komplette programmer for begge sider gives i slutningen af dette projekt med en demonstrationsvideo.
Master STM32 SPI Programmering Forklaring
1. Først og fremmest skal vi inkludere SPI-biblioteket til brug af SPI-kommunikationsfunktioner og LCD-bibliotek til brug af LCD-funktioner. Definer også LCD-ben til 16x2 LCD. Lær mere om grænseflade mellem LCD og STM32 her.
#omfatte
2. I ugyldig opsætning ()
- Start seriel kommunikation ved baudrate 9600.
Serial.begin (9600);
- Start derefter SPI-kommunikationen
SPI.begin ();
- Indstil derefter urdeleren til SPI-kommunikation. Jeg har indstillet skillevæg 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Indstil derefter SS-stiften HIGH, da vi ikke startede nogen overførsel til slave arduino.
digitalWrite (SS, HIGH);
3. I ugyldig løkke ()
- Inden vi sender en værdi til slave, skal vi ned til slave-valgværdien for at begynde overførsel til slave fra master.
digitalWrite (SS, LOW);
- Læs derefter den analoge værdi fra master STM32F10C8 POT fastgjort til pin PA0.
int pot = analogRead (PA0);
Konverter derefter denne værdi i form af en byte (0 til 255).
byte MasterSend = kort (pot, 0,4096,0,255);
- Her kommer det vigtige trin, i den følgende erklæring sender vi den konverterede POT-værdi, der er gemt i Mastersend- variablen til slave Arduino, og modtager også værdi fra slave Arduino og lagrede den i mastereceive- variabel.
Mastereceive = SPI.transfer (Mastersend);
- Derefter viser de modtagne værdier fra slave arduino med en forsinkelse på 500 mikrosekunder og derefter kontinuerligt modtage og vise værdierne.
Serial.println ("Slave Arduino til 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);
Bemærk: Vi bruger serial.println () til at se resultatet i Serial Motor of Arduino IDE.
Slave Arduino SPI Programmering Forklaring
1. Samme som master, først og fremmest skal vi inkludere SPI-biblioteket til brug af I2C-kommunikationsfunktioner og LCD-bibliotek til brug af LCD-funktioner. Definer også LCD-ben til 16x2 LCD.
#omfatte
2. I ugyldig opsætning ()
- Vi starter seriel kommunikation med baudrate 9600.
Serial.begin (9600);
- Nedenstående sætning indstiller MISO som OUTPUT (skal sende data til Master IN). Så data sendes via MISO fra Slave Arduino.
pinMode (MISO, OUTPUT);
- Tænd nu SPI i Slave Mode ved hjælp af SPI Control Register
SPCR - = _BV (SPE);
- Tænd derefter afbrydelsen TIL SPI-kommunikation. Hvis der modtages data fra master kaldes Interrupt Service Routine, og den modtagne værdi hentes fra SPDR (SPI data Register)
SPI.attachInterrupt ();
- Værdien fra master hentes fra SPDR og lagres i Slavereceived- variabel. Dette finder sted i følgende Afbryd rutinefunktion.
ISR (SPI_STC_vect) {Slavereceived = SPDR; modtaget = sandt; }
3. Næste i ugyldig sløjfe ()
- Læs den analoge værdi fra Slave Arduino POT, der er knyttet til pin A0.
int pot = analogRead (A0);
- Konverter denne værdi i form af en byte som 0 til 255.
Slavesend = kort (pot, 0,1023,0,255);
- Næste vigtige trin er at sende den konverterede værdi til Master STM32F10C8, så placer værdien i SPDR-registeret. SPDR-registret bruges til at sende og modtage værdier.
SPDR = Slavesend;
- Vis derefter den modtagne værdi ( SlaveReceive ) fra Master STM32F103C8 på LCD med en forsinkelse på 500 mikrosekunder, og modtag og vis derefter disse værdier kontinuerligt.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 til Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); forsinkelse (500);
Ved at dreje potentiometeret på den ene side kan du se de forskellige værdier på LCD på en anden side:
Så dette er, hvordan SPI-kommunikation finder sted i STM32. Nu kan du interface enhver SPI-sensor med STM32-kort.
Den komplette kodning til Master STM32 og Slave Arduino er angivet nedenfor med en demonstrationsvideo