- SPI i STM32F103C8
- SPI Pins i Arduino
- Komponenter kreves
- Kretsdiagram og tilkoblinger for STM32 SPI-opplæring
- STM32 SPI-programmering
- Master STM32 SPI Programmering Forklaring
- Slave Arduino SPI Programmering Forklaring
I våre tidligere veiledninger har vi lært om SPI og I2C kommunikasjon mellom to Arduino-kort. I denne opplæringen vil vi erstatte ett Arduino-kort med Blue Pill-kortet som er STM32F103C8 og vil kommunisere med Arduino-kortet ved hjelp av SPI-buss. I dette STM32 SPI-eksemplet vil vi bruke Arduino UNO som slave og STM32F103C8 som master med to 16X2 LCD-skjerm festet til hverandre hver for seg. To potensiometere er også koblet til STM32 (PA0) og Arduino (A0) for å bestemme sendeverdiene (0 til 255) fra master til slave og slave til master ved å variere potensiometeret.
SPI i STM32F103C8
Sammenligning av SPI-buss i Arduino og STM32F103C8 Blue Pill-kort, har STM32 2 SPI-busser i mens Arduino Uno har en SPI-buss. Arduino Uno har ATMEGA328 mikrokontroller i seg, og STM32F103C8 har ARM Cortex-M3, noe som gjør den raskere enn Arudino Board.
For å lære mer om SPI-kommunikasjon, se våre tidligere artikler
- Hvordan bruke SPI i Arduino: Kommunikasjon mellom to Arduino-brett
- SPI Kommunikasjon med PIC Microcontroller PIC16F877A
- SPI-kommunikasjon via Bit Banging
- Raspberry Pi varmtvannstanklekkasjedetektor ved hjelp av SPI-moduler
- ESP32 sanntidsklokke ved hjelp av DS3231-modulen
STM32 SPI-pins STM32F103C8
SPI Line1 | Fest 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 |
Fest i Arduino |
MOSI |
11 eller ICSP-4 |
MISO |
12 eller ICSP-1 |
SCK |
13 eller ICSP-3 |
SS |
10 |
Komponenter kreves
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potensiometer - 4
- Brettbrett
- Koble ledninger
Kretsdiagram og tilkoblinger for STM32 SPI-opplæring
Tabellen nedenfor viser pins koblet til STM32 SPI-kommunikasjon med Arduino.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
1. 3 |
SS1 |
PA4 |
10 |
Tabellen nedenfor viser pinnene som er koblet til to LCD (16x2) med STM32F103C8 og Arduino hver for seg.
LCD-pinne |
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 |
Viktig:
- Ikke glem å koble Arduino GND og STM32F103C8 GND sammen.
STM32 SPI-programmering
Programmeringen ligner på Arduino-koden. Det samme
I dette STM32 SPI-eksemplet vil vi bruke Arduino UNO som slave og STM32F103C8 som master med to 16X2 LCD-skjerm festet til hverandre hver for seg. To potensiometere er også koblet til STM32 (PA0) og Arduino (A0) for å bestemme sendeverdiene (0 til 255) fra master til slave og slave til master ved å variere potensiometeret.
Analog inngang blir tatt ved STM32F10C8 pin PA0 (0 til 3,3 V) ved å rotere potensiometeret. Deretter blir denne inngangsverdien konvertert til Analog til Digital verdi (0 til 4096), og denne digitale verdien blir videre kartlagt til (0 til 255) da vi bare kan sende 8-biters (byte) data gjennom SPI-kommunikasjon på en gang.
På samme måte i Slave-siden tar vi analog inngangsverdi på Arduino pin A0 fra (0 til 5V) ved å bruke potensiometer. Og igjen konverteres denne inngangsverdien til Analog til Digital verdi (0 til 1023), og denne digitale verdien blir videre kartlagt til (0 til 255)
Denne opplæringen har to programmer, ett for master STM32 og et annet for slave Arduino. Komplette programmer for begge sider er gitt på slutten av dette prosjektet med en demonstrasjonsvideo.
Master STM32 SPI Programmering Forklaring
1. Først og fremst må vi inkludere SPI-biblioteket for bruk av SPI-kommunikasjonsfunksjoner og LCD-bibliotek for bruk av LCD-funksjoner. Definer også LCD-pinner for 16x2 LCD. Lær mer om grensesnitt LCD med STM32 her.
#inkludere
2. I ugyldig oppsett ()
- Start seriell kommunikasjon med baudrate 9600.
Serial.begin (9600);
- Neste start SPI-kommunikasjonen
SPI.begin ();
- Still deretter inn klokkedeleren for SPI-kommunikasjon. Jeg har satt skillelinje 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Sett deretter SS-pinnen HØY siden vi ikke startet noen overføring til slave arduino.
digitalWrite (SS, HIGH);
3. I ugyldig sløyfe ()
- Før vi sender noen verdi til slave, må vi LAVE slavevalgverdien for å begynne å overføre til slave fra master.
digitalWrite (SS, LOW);
- Les deretter den analoge verdien fra master STM32F10C8 POT festet til pin PA0.
int pot = analogRead (PA0);
Konverter deretter denne verdien i form av en byte (0 til 255).
byte MasterSend = kart (pott, 0,4096,0,255);
- Her kommer det viktige trinnet, i følgende uttalelse sender vi den konverterte POT-verdien som er lagret i Mastersend- variabelen til slaven Arduino, og mottar også verdi fra slave Arduino og lagret den i mastereceive- variabel.
Mastereceive = SPI.transfer (Mastersend);
- Neste viser de mottatte verdiene fra slaven arduino med en forsinkelse på 500 mikrosekunder, og motta og vise deretter verdiene kontinuerlig.
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);
Merk: Vi bruker serial.println () for å se resultatet i Serial Motor av Arduino IDE.
Slave Arduino SPI Programmering Forklaring
1. Samme som master, først og fremst trenger vi å inkludere SPI-biblioteket for bruk av I2C-kommunikasjonsfunksjoner og LCD-bibliotek for bruk av LCD-funksjoner. Definer også LCD-pinner for 16x2 LCD.
#inkludere
2. I ugyldig oppsett ()
- Vi starter seriekommunikasjon med Baud Rate 9600.
Serial.begin (9600);
- Nedenfor uttalelsen setter MISO som OUTPUT (Må sende data til Master IN). Så data sendes via MISO fra Slave Arduino.
pinMode (MISO, OUTPUT);
- Slå nå på SPI i slave-modus ved å bruke SPI Control Register
SPCR - = _BV (SPE);
- Slå deretter PÅ avbrudd for SPI-kommunikasjon. Hvis data mottas fra master, kalles Interrupt Service Routine og den mottatte verdien hentes fra SPDR (SPI data Register)
SPI.attachInterrupt ();
- Verdien fra master er hentet fra SPDR og lagret i slavereceived variable. Dette skjer i følgende avbryt rutinefunksjon.
ISR (SPI_STC_vect) {Slavereceived = SPDR; mottatt = sant; }
3. Neste i ugyldig sløyfe ()
- Les den analoge verdien fra Slave Arduino POT festet til pin A0.
int pot = analogRead (A0);
- Konverter den verdien i form av en byte som 0 til 255.
Slavesend = kart (pott, 0,1023,0,255);
- Neste viktige trinn er å sende den konverterte verdien til Master STM32F10C8, så plasser verdien i SPDR-registeret. SPDR-registeret brukes til å sende og motta verdier.
SPDR = Slavesend;
- Deretter viser du den mottatte verdien ( SlaveReceive ) fra Master STM32F103C8 på LCD med en forsinkelse på 500 mikrosekunder, og deretter mottar og viser denne verdien kontinuerlig.
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); forsinkelse (500);
Ved å rotere potensiometeret på den ene siden, kan du se de forskjellige verdiene på LCD-skjermen på en annen side:
Så dette er hvordan SPI-kommunikasjon foregår i STM32. Nå kan du grensesnitt hvilken som helst SPI-sensor med STM32-kort.
Den komplette kodingen for Master STM32 og Slave Arduino er gitt nedenfor med en demonstrasjonsvideo