- SPI in STM32F103C8
- SPI-pinnen in Arduino
- Componenten vereist
- Schakelschema en aansluitingen voor STM32 SPI-zelfstudie
- STM32 SPI-programmering
- Master STM32 SPI Programmering Uitleg
- Slave Arduino SPI Programmering Uitleg
In onze vorige tutorials hebben we geleerd over SPI- en I2C-communicatie tussen twee Arduino-boards. In deze tutorial zullen we één Arduino-bord vervangen door het Blue Pill-bord dat STM32F103C8 is en zal communiceren met het Arduino-bord via SPI-bus. In dit STM32 SPI-voorbeeld gebruiken we Arduino UNO als Slave en STM32F103C8 als Master met twee 16X2 LCD-schermen die afzonderlijk aan elkaar zijn bevestigd. Twee potentiometers zijn ook verbonden met STM32 (PA0) en Arduino (A0) om de zendwaarden (0 tot 255) te bepalen van master naar slave en van slave naar master door de potentiometer te variëren.
SPI in STM32F103C8
Vergelijking van SPI-bus in Arduino & STM32F103C8 Blue Pill-bord, STM32 heeft 2 SPI-bussen erin, terwijl Arduino Uno één SPI-bus heeft. Arduino Uno heeft een ATMEGA328-microcontroller erin en STM32F103C8 heeft ARM Cortex-M3 waardoor het sneller is dan het Arudino-bord.
Raadpleeg onze vorige artikelen voor meer informatie over SPI-communicatie
- Hoe SPI in Arduino te gebruiken: communicatie tussen twee Arduino-kaarten
- SPI-communicatie met PIC-microcontroller PIC16F877A
- SPI-communicatie via Bit Banging
- Raspberry Pi Heetwatertanklekdetector met SPI-modules
- ESP32 Real Time Clock met DS3231-module
STM32 SPI-pinnen STM32F103C8
SPI-lijn 1 | Pin in STM32F103C8 |
MOSI1 | PA7 of PB5 |
MISO1 | PA6 of PB4 |
SCK1 | PA5 of PB3 |
SS1 | PA4 of PA15 |
SPI-lijn 2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI-pinnen in Arduino
SPI-lijn |
Pin in Arduino |
MOSI |
11 of ICSP-4 |
MISO |
12 of ICSP-1 |
SCK |
13 of ICSP-3 |
SS |
10 |
Componenten vereist
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k Potentiometer - 4
- Breadboard
- Verbindingsdraden
Schakelschema en aansluitingen voor STM32 SPI-zelfstudie
De onderstaande tabel toont de pinnen die zijn aangesloten voor STM32 SPI-communicatie met Arduino.
SPI-pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
De onderstaande tabel toont de pinnen die zijn aangesloten voor twee LCD's (16x2) met STM32F103C8 en Arduino afzonderlijk.
LCD-pen |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Naar Potentiometer Center PIN voor LCD contrast |
Naar Potentiometer Center PIN voor LCD contrast |
RS |
PB0 |
2 |
RW |
GND |
GND |
E. |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
EEN |
+ 5V |
+ 5V |
K |
GND |
GND |
Belangrijk:
- Vergeet niet om de Arduino GND en STM32F103C8 GND met elkaar te verbinden.
STM32 SPI-programmering
De programmering is vergelijkbaar met de Arduino-code. Hetzelfde
In dit STM32 SPI-voorbeeld gebruiken we Arduino UNO als Slave en STM32F103C8 als Master met twee 16X2 LCD-schermen die afzonderlijk aan elkaar zijn bevestigd. Twee potentiometers zijn ook verbonden met STM32 (PA0) en Arduino (A0) om de zendwaarden (0 tot 255) te bepalen van master naar slave en van slave naar master door de potentiometer te variëren.
Analoge input wordt genomen op STM32F10C8 pin PA0 (0 tot 3.3V) door de potentiometer te draaien. Vervolgens wordt deze invoerwaarde omgezet in een analoog naar digitaal waarde (0 tot 4096) en deze digitale waarde wordt verder toegewezen aan (0 tot 255) omdat we alleen 8-bit (byte) gegevens tegelijk via SPI-communicatie kunnen verzenden.
Evenzo nemen we in Slave-zijde de analoge ingangswaarde op Arduino-pin A0 van (0 tot 5V) met behulp van een potentiometer. En opnieuw wordt deze ingangswaarde omgezet in analoog naar digitaal waarde (0 tot 1023) en deze digitale waarde wordt verder toegewezen aan (0 tot 255)
Deze tutorial heeft twee programma's een voor master STM32 en een voor slave Arduino. Aan het einde van dit project worden complete programma's voor beide kanten gegeven met een demonstratievideo.
Master STM32 SPI Programmering Uitleg
1. Allereerst moeten we de SPI-bibliotheek opnemen voor het gebruik van SPI-communicatiefuncties en de LCD-bibliotheek voor het gebruik van LCD-functies. Definieer ook LCD-pinnen voor 16x2 LCD. Lees hier meer over het koppelen van LCD met STM32.
# omvatten
2. In ongeldige opstelling ()
- Start seriële communicatie met een baudsnelheid van 9600.
Serial.begin (9600);
- Begin vervolgens met de SPI-communicatie
SPI.begin ();
- Stel vervolgens de klokverdeler in voor SPI-communicatie. Ik heb verdeler 16 ingesteld.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Stel vervolgens de SS-pin HIGH in, omdat we geen overdracht naar de slave-arduino hebben gestart.
digitalWrite (SS, HIGH);
3. In lege lus ()
- Voordat we een waarde naar de slaaf sturen, moeten we de slaafselectiewaarde LAGE om de overdracht naar de slaaf van de meester te starten.
digitalWrite (SS, LOW);
- Lees vervolgens de analoge waarde van de master STM32F10C8 POT die is aangesloten op pin PA0.
int pot = analogRead (PA0);
Converteer deze waarde vervolgens in termen van één byte (0 tot 255).
byte MasterSend = map (pot, 0,4096,0,255);
- Hier komt de belangrijke stap, in de volgende verklaring sturen we de geconverteerde POT-waarde die is opgeslagen in de Mastersend- variabele naar de slaaf Arduino, en ontvangen ook de waarde van de slaaf Arduino en slaan die op in de mastereceive- variabele.
Mastereceive = SPI.transfer (Mastersend);
- Geef vervolgens de ontvangen waarden van de slave-arduino weer met een vertraging van 500 microseconden en ontvang en toon vervolgens continu de waarden.
Serial.println ("Slave Arduino naar Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive vertraging (500); digitalWrite (SS, HIGH);
Opmerking: We gebruiken serial.println () om het resultaat te bekijken in Serial Motor of Arduino IDE.
Slave Arduino SPI Programmering Uitleg
1. Hetzelfde als master, allereerst moeten we de SPI-bibliotheek opnemen voor het gebruik van I2C-communicatiefuncties en de LCD-bibliotheek voor het gebruik van LCD-functies. Definieer ook LCD-pinnen voor 16x2 LCD.
# omvatten
2. In ongeldige opstelling ()
- We starten seriële communicatie met een baudrate van 9600.
Serial.begin (9600);
- Onderstaande instructie stelt MISO in als OUTPUT (Moet data naar Master IN sturen).Dus data worden verzonden via MISO van Slave Arduino.
pinMode (MISO, OUTPUT);
- Schakel nu SPI in Slave-modus in met behulp van SPI Control Register
SPCR - = _BV (SPE);
- Schakel vervolgens de onderbreking in voor SPI-communicatie. Als er gegevens worden ontvangen van de master, wordt de Interrupt Service Routine aangeroepen en wordt de ontvangen waarde overgenomen uit SPDR (SPI-gegevensregister)
SPI.attachInterrupt ();
- De waarde van master wordt uit SPDR gehaald en opgeslagen in Slavereceived- variabele. Dit vindt plaats in de volgende Interrupt Routine-functie.
ISR (SPI_STC_vect) {Slavereceived = SPDR; ontvangen = waar; }
3. Volgende in lege lus ()
- Lees de analoge waarde van de Slave Arduino POT die is aangesloten op pin A0.
int pot = analogRead (A0);
- Converteer die waarde in termen van één byte naar 0 tot 255.
Slavesend = map (pot, 0,1023,0,255);
- De volgende belangrijke stap is om de geconverteerde waarde naar de Master STM32F10C8 te sturen, dus plaats de waarde in het SPDR-register. Het SPDR-register wordt gebruikt om waarden te verzenden en te ontvangen.
SPDR = Slavesend;
- Geef vervolgens de ontvangen waarde ( SlaveReceive ) van Master STM32F103C8 weer op het LCD-scherm met een vertraging van 500 microseconden en ontvang en toon vervolgens continu die waarde.
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); vertraging (500);
Door de Potentiometer aan de ene kant te draaien, kun je de variërende waarden op het LCD-scherm aan de andere kant zien:
Dit is dus hoe SPI-communicatie plaatsvindt in STM32. Nu kunt u elke SPI-sensor verbinden met het STM32-bord.
De volledige codering voor Master STM32 en Slave Arduino wordt hieronder gegeven met een demonstratievideo