- SPI in STM32F103C8
- SPI-Pins in Arduino
- Erforderliche Komponenten
- Schaltplan und Anschlüsse für STM32 SPI Tutorial
- STM32 SPI-Programmierung
- Erläuterung zur Master-STM32-SPI-Programmierung
- Erklärung zur Slave-Arduino-SPI-Programmierung
In unseren vorherigen Tutorials haben wir etwas über die SPI- und I2C-Kommunikation zwischen zwei Arduino-Boards gelernt. In diesem Tutorial werden wir eine Arduino-Karte durch die Blue Pill-Karte STM32F103C8 ersetzen und über einen SPI-Bus mit der Arduino-Karte kommunizieren. In diesem STM32 SPI-Beispiel verwenden wir Arduino UNO als Slave und STM32F103C8 als Master mit zwei separat aneinander angeschlossenen 16X2-LCD-Displays. Zwei Potentiometer sind ebenfalls mit STM32 (PA0) und Arduino (A0) verbunden, um die Sendewerte (0 bis 255) von Master zu Slave und von Slave zu Master durch Variieren des Potentiometers zu bestimmen.
SPI in STM32F103C8
Beim Vergleich des SPI-Busses in Arduino & STM32F103C8 Blue Pill Board verfügt STM32 über 2 SPI-Busse, während Arduino Uno über einen SPI-Bus verfügt. Arduino Uno verfügt über einen ATMEGA328-Mikrocontroller, und STM32F103C8 verfügt über ARM Cortex-M3, wodurch es schneller als Arudino Board ist.
Weitere Informationen zur SPI-Kommunikation finden Sie in unseren vorherigen Artikeln
- Verwendung von SPI in Arduino: Kommunikation zwischen zwei Arduino-Boards
- SPI-Kommunikation mit dem PIC-Mikrocontroller PIC16F877A
- SPI-Kommunikation über Bit Banging
- Raspberry Pi Heißwassertank-Lecksucher mit SPI-Modulen
- ESP32 Echtzeituhr mit DS3231-Modul
STM32 SPI-Pins STM32F103C8
SPI Line1 | Pin in STM32F103C8 |
MOSI1 | PA7 oder PB5 |
MISO1 | PA6 oder PB4 |
SCK1 | PA5 oder PB3 |
SS1 | PA4 oder PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI-Pins in Arduino
SPI-Leitung |
Pin in Arduino |
MOSI |
11 oder ICSP-4 |
MISO |
12 oder ICSP-1 |
SCK |
13 oder ICSP-3 |
SS |
10 |
Erforderliche Komponenten
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k Potentiometer - 4
- Steckbrett
- Kabel anschließen
Schaltplan und Anschlüsse für STM32 SPI Tutorial
Die folgende Tabelle zeigt die Pins, die für die STM32 SPI-Kommunikation mit Arduino verbunden sind.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Die folgende Tabelle zeigt die Pins, die für zwei LCD-Bildschirme (16 x 2) mit STM32F103C8 und Arduino separat verbunden sind.
LCD-Pin |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Zur Potentiometer-Center-PIN für den LCD-Kontrast |
Zur Potentiometer-Center-PIN für den LCD-Kontrast |
RS |
PB0 |
2 |
RW |
GND |
GND |
E. |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
EIN |
+ 5V |
+ 5V |
K. |
GND |
GND |
Wichtig:
- Vergessen Sie nicht, Arduino GND und STM32F103C8 GND miteinander zu verbinden.
STM32 SPI-Programmierung
Die Programmierung ähnelt dem Arduino-Code. Das Gleiche
In diesem STM32 SPI-Beispiel verwenden wir Arduino UNO als Slave und STM32F103C8 als Master mit zwei separat aneinander angeschlossenen 16X2-LCD-Displays. Zwei Potentiometer sind ebenfalls mit STM32 (PA0) und Arduino (A0) verbunden, um die Sendewerte (0 bis 255) von Master zu Slave und von Slave zu Master durch Variieren des Potentiometers zu bestimmen.
Der Analogeingang erfolgt am STM32F10C8-Pin PA0 (0 bis 3,3 V) durch Drehen des Potentiometers. Dann wird dieser Eingabewert in einen Analog-Digital-Wert (0 bis 4096) umgewandelt und dieser digitale Wert wird weiter auf (0 bis 255) abgebildet, da nur 8-Bit-Daten (Byte) gleichzeitig über die SPI-Kommunikation gesendet werden können.
In ähnlicher Weise nehmen wir auf der Slave-Seite den analogen Eingangswert am Arduino-Pin A0 von (0 bis 5 V) unter Verwendung eines Potentiometers. Und wieder wird dieser Eingangswert in einen Analog-Digital-Wert (0 bis 1023) umgewandelt und dieser Digitalwert wird weiter auf (0 bis 255) abgebildet.
Dieses Tutorial enthält zwei Programme, eines für Master STM32 und eines für Slave Arduino. Komplette Programme für beide Seiten finden Sie am Ende dieses Projekts mit einem Demonstrationsvideo.
Erläuterung zur Master-STM32-SPI-Programmierung
1. Zunächst müssen wir die SPI-Bibliothek für die Verwendung von SPI-Kommunikationsfunktionen und die LCD-Bibliothek für die Verwendung von LCD-Funktionen einbeziehen. Definieren Sie auch LCD-Pins für 16x2-LCD. Weitere Informationen zur Verbindung von LCD mit STM32 finden Sie hier.
#einschließen
2. In void setup ()
- Starten Sie die serielle Kommunikation mit einer Baudrate von 9600.
Serial.begin (9600);
- Beginnen Sie als nächstes mit der SPI-Kommunikation
SPI.begin ();
- Stellen Sie dann den Taktteiler für die SPI-Kommunikation ein. Ich habe Teiler 16 eingestellt.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Als nächstes setzen Sie den SS-Pin auf HIGH, da wir keine Übertragung zum Slave-Arduino gestartet haben.
digitalWrite (SS, HIGH);
3. In void loop ()
- Bevor wir einen Wert an den Slave senden, müssen wir den Slave-Auswahlwert auf LOW setzen, um die Übertragung vom Master zum Slave zu beginnen.
digitalWrite (SS, LOW);
- Lesen Sie als nächstes den Analogwert vom Master-STOT STM32F10C8 ab, der an Pin PA0 angeschlossen ist.
int pot = analogRead (PA0);
Konvertieren Sie diesen Wert dann in ein Byte (0 bis 255).
Byte MasterSend = Karte (Topf, 0,4096,0,255);
- Hier kommt der wichtige Schritt: In der folgenden Anweisung senden wir den konvertierten POT-Wert, der in der Mastersend- Variablen gespeichert ist, an den Slave Arduino und empfangen auch den Wert vom Slave Arduino und speichern ihn in der mastereceive- Variablen.
Mastereceive = SPI.transfer (Mastersend);
- Als nächstes werden die vom Slave-Arduino empfangenen Werte mit einer Verzögerung von 500 Mikrosekunden angezeigt und anschließend kontinuierlich empfangen und angezeigt.
Serial.println ("Slave Arduino to 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);
Hinweis: Wir verwenden serial.println (), um das Ergebnis in Serial Motor der Arduino IDE anzuzeigen.
Erklärung zur Slave-Arduino-SPI-Programmierung
1. Wie beim Master müssen wir zunächst die SPI-Bibliothek für die Verwendung von I2C-Kommunikationsfunktionen und die LCD-Bibliothek für die Verwendung von LCD-Funktionen einbeziehen. Definieren Sie auch LCD-Pins für 16x2-LCD.
#einschließen
2. In void setup ()
- Wir starten die serielle Kommunikation mit einer Baudrate von 9600.
Serial.begin (9600);
- Die folgende Anweisung setzt MISO als OUTPUT (Daten müssen an Master IN gesendet werden). Daten werden also über MISO von Slave Arduino gesendet.
PinMode (MISO, OUTPUT);
- Schalten Sie nun SPI im Slave-Modus mithilfe des SPI-Steuerregisters ein
SPCR - = _BV (SPE);
- Schalten Sie dann den Interrupt für die SPI-Kommunikation ein. Wenn Daten vom Master empfangen werden, wird die Interrupt Service Routine aufgerufen und der empfangene Wert vom SPDR (SPI Data Register) übernommen.
SPI.attachInterrupt ();
- Der Wert vom Master wird aus SPDR übernommen und in der Slavereceived- Variablen gespeichert. Dies erfolgt in der folgenden Interrupt-Routine-Funktion.
ISR (SPI_STC_vect) {Slavereceived = SPDR; empfangen = wahr; }}
3. Weiter in void loop ()
- Lesen Sie den Analogwert vom Slave Arduino POT ab, der an Pin A0 angeschlossen ist.
int pot = analogRead (A0);
- Konvertieren Sie diesen Wert in ein Byte als 0 in 255.
Slavesend = Karte (Topf, 0,1023,0,255);
- Der nächste wichtige Schritt besteht darin, den konvertierten Wert an den Master STM32F10C8 zu senden. Platzieren Sie den Wert also im SPDR-Register. Das SPDR-Register wird zum Senden und Empfangen von Werten verwendet.
SPDR = Slavesend;
- Zeigen Sie dann den vom Master STM32F103C8 empfangenen Wert ( SlaveReceive ) mit einer Verzögerung von 500 Mikrosekunden auf dem LCD an und empfangen und zeigen Sie diesen Wert kontinuierlich an.
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); Verzögerung (500);
Durch Drehen des Potentiometers auf einer Seite können Sie die unterschiedlichen Werte auf dem LCD auf einer anderen Seite sehen:
So findet die SPI-Kommunikation in STM32 statt. Jetzt können Sie jeden SPI-Sensor mit der STM32-Karte verbinden.
Die vollständige Codierung für Master STM32 und Slave Arduino finden Sie unten mit einem Demonstrationsvideo