- SPI w STM32F103C8
- Piny SPI w Arduino
- Wymagane składniki
- Schemat obwodu i połączenia dla samouczka STM32 SPI
- Programowanie STM32 SPI
- Objaśnienie programowania Master STM32 SPI
- Objaśnienie programowania Slave Arduino SPI
W naszych poprzednich samouczkach dowiedzieliśmy się o komunikacji SPI i I2C między dwoma płytami Arduino. W tym samouczku zastąpimy jedną płytkę Arduino płytą Blue Pill, czyli STM32F103C8 i będziemy komunikować się z płytą Arduino za pomocą magistrali SPI. W tym przykładzie STM32 SPI użyjemy Arduino UNO jako Slave i STM32F103C8 jako Master z dwoma wyświetlaczami LCD 16X2 podłączonymi do siebie osobno. Dwa potencjometry są również połączone ze STM32 (PA0) i Arduino (A0) w celu określenia wysyłanych wartości (od 0 do 255) z mastera do slave i slave do mastera poprzez zmianę potencjometru.
SPI w STM32F103C8
Porównując magistralę SPI na płytce Arduino i STM32F103C8 Blue Pill, STM32 ma 2 magistrale SPI, podczas gdy Arduino Uno ma jedną magistralę SPI. Arduino Uno ma w sobie mikrokontroler ATMEGA328, a STM32F103C8 ma ARM Cortex-M3, co czyni go szybszym niż płytka Arudino.
Aby dowiedzieć się więcej o komunikacji SPI, zapoznaj się z naszymi poprzednimi artykułami
- Jak korzystać z SPI w Arduino: Komunikacja między dwoma płytami Arduino
- Komunikacja SPI z mikrokontrolerem PIC PIC16F877A
- Komunikacja SPI przez Bit Banging
- Raspberry Pi Wykrywacz nieszczelności zbiornika ciepłej wody wykorzystujący moduły SPI
- Zegar czasu rzeczywistego ESP32 wykorzystujący moduł DS3231
STM32 Piny SPI STM32F103C8
Linia SPI 1 | Pin w STM32F103C8 |
MOSI1 | PA7 lub PB5 |
MISO1 | PA6 lub PB4 |
SCK1 | PA5 lub PB3 |
SS1 | PA4 lub PA15 |
Linia SPI 2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Piny SPI w Arduino
Linia SPI |
Pin w Arduino |
MOSI |
11 lub ICSP-4 |
MISO |
12 lub ICSP-1 |
SCK |
13 lub ICSP-3 |
SS |
10 |
Wymagane składniki
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potencjometr 10k - 4
- Płytka prototypowa
- Podłączanie przewodów
Schemat obwodu i połączenia dla samouczka STM32 SPI
Poniższa tabela przedstawia Piny podłączone do komunikacji STM32 SPI z Arduino.
Pin SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Poniższa tabela przedstawia piny połączone dla dwóch wyświetlaczy LCD (16x2) z STM32F103C8 i Arduino oddzielnie.
Pin LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Do środkowego PINu potencjometru dla kontrastu LCD |
Do środkowego PINu potencjometru dla kontrastu LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
mi |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
ZA |
+ 5V |
+ 5V |
K. |
GND |
GND |
Ważny:
- Nie zapomnij o połączeniu Arduino GND i STM32F103C8 GND.
Programowanie STM32 SPI
Programowanie jest podobne do kodu Arduino. To samo
W tym przykładzie STM32 SPI użyjemy Arduino UNO jako Slave i STM32F103C8 jako Master z dwoma wyświetlaczami LCD 16X2 podłączonymi do siebie osobno. Dwa potencjometry są również połączone ze STM32 (PA0) i Arduino (A0) w celu określenia wysyłanych wartości (od 0 do 255) z mastera do slave i slave do mastera poprzez zmianę potencjometru.
Wejście analogowe jest pobierane na styku PA0 STM32F10C8 (od 0 do 3,3 V), obracając potencjometr. Następnie ta wartość wejściowa jest konwertowana na wartość analogowo-cyfrową (od 0 do 4096), a ta wartość cyfrowa jest dalej odwzorowywana na (od 0 do 255), ponieważ jednocześnie możemy przesyłać tylko 8-bitowe (bajtowe) dane przez komunikację SPI.
Podobnie po stronie Slave za pomocą potencjometru pobieramy wartość wejścia analogowego na pinie A0 Arduino od (0 do 5V). I znowu ta wartość wejściowa jest konwertowana na wartość analogowo-cyfrową (od 0 do 1023), a ta wartość cyfrowa jest dalej odwzorowywana na (od 0 do 255)
Ten samouczek ma dwa programy, jeden dla master STM32, a drugi dla slave Arduino. Kompletne programy dla obu stron są podane na końcu tego projektu wraz z filmem demonstracyjnym.
Objaśnienie programowania Master STM32 SPI
1. Przede wszystkim musimy dołączyć bibliotekę SPI do wykorzystania funkcji komunikacyjnych SPI oraz bibliotekę LCD do wykorzystania funkcji LCD. Zdefiniuj również piny LCD dla 16x2 LCD. Dowiedz się więcej o łączeniu LCD z STM32 tutaj.
#zawierać
2. In void setup ()
- Rozpocznij komunikację szeregową z prędkością transmisji 9600.
Serial.begin (9600);
- Następnie rozpocznij komunikację SPI
SPI.begin ();
- Następnie ustaw dzielnik zegara na komunikację SPI. Ustawiłem przegrodę 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Następnie ustawmy pin SS WYSOKI, ponieważ nie rozpoczęliśmy żadnego transferu do niewolnika arduino.
digitalWrite (SS, HIGH);
3. W pustej pętli ()
- Przed wysłaniem jakiejkolwiek wartości do slave'a musimy LOW wybrać wartość slave, aby rozpocząć transfer do slave'a z mastera.
digitalWrite (SS, LOW);
- Następnie odczytaj wartość analogową z POT master STM32F10C8 podłączonego do pinu PA0.
int pot = analogRead (PA0);
Następnie przekonwertuj tę wartość na jeden bajt (od 0 do 255).
byte MasterSend = map (pot, 0,4096,0,255);
- Oto ważny krok, w poniższym zestawieniu wysyłamy przekonwertowaną wartość POT przechowywaną w zmiennej Mastersend do podrzędnego Arduino, a także otrzymujemy wartość z podrzędnego Arduino i przechowujemy ją w zmiennej nadrzędnej .
Mastereceive = SPI.transfer (Mastersend);
- Następnie wyświetl te otrzymane wartości od slave arduino z opóźnieniem 500 mikrosekund, a następnie w sposób ciągły odbieraj i wyświetlaj wartości.
Serial.println ("Slave Arduino do 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);
Uwaga: Używamy serial.println (), aby wyświetlić wynik w silniku szeregowym Arduino IDE.
Objaśnienie programowania Slave Arduino SPI
1. Podobnie jak master, przede wszystkim musimy dołączyć bibliotekę SPI do korzystania z funkcji komunikacyjnych I2C oraz bibliotekę LCD do korzystania z funkcji LCD. Zdefiniuj również piny LCD dla 16x2 LCD.
#zawierać
2. In void setup ()
- Rozpoczynamy komunikację szeregową z prędkością transmisji 9600.
Serial.begin (9600);
- Poniższa instrukcja ustawia MISO jako OUTPUT (Have to Send data to Master IN), więc dane są przesyłane przez MISO Slave Arduino.
pinMode (MISO, OUTPUT);
- Teraz włącz SPI w trybie podrzędnym za pomocą rejestru sterowania SPI
SPCR - = _BV (SPE);
- Następnie włącz przerwanie dla komunikacji SPI. Jeśli dane są odbierane od mastera, wywoływana jest procedura obsługi przerwania, a odebrana wartość jest pobierana z SPDR (rejestru danych SPI)
SPI.attachInterrupt ();
- Wartość z mastera jest pobierana z SPDR i przechowywana w zmiennej Slavereceived . Odbywa się to w następstwie funkcji Interrupt Routine.
ISR (SPI_STC_vect) {Slavereceived = SPDR; otrzymano = prawda; }
3. Dalej w void loop ()
- Odczytaj wartość analogową z Slave Arduino POT podłączonego do pinu A0.
int pot = analogRead (A0);
- Zamień tę wartość w postaci jednego bajtu na 0 do 255.
Slavesend = mapa (pula, 0,1023,0,255);
- Kolejnym ważnym krokiem jest przesłanie przekonwertowanej wartości do Master STM32F10C8, a więc umieszczenie wartości w rejestrze SPDR. Rejestr SPDR służy do wysyłania i odbierania wartości.
SPDR = Slavesend;
- Następnie wyświetl otrzymaną wartość ( SlaveReceive ) z Master STM32F103C8 na wyświetlaczu LCD z opóźnieniem 500 mikrosekund, a następnie w sposób ciągły odbieraj i wyświetlaj te wartości.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 do Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); opóźnienie (500);
Przez obracanie potencjometrów z jednej strony, można zobaczyć różne wartości na wyświetlaczu LCD na innej stronie:
Tak więc w STM32 odbywa się komunikacja SPI. Teraz możesz połączyć dowolny czujnik SPI z płytą STM32.
Pełne kodowanie dla Master STM32 i Slave Arduino jest podane poniżej wraz z filmem demonstracyjnym