- SPI v STM32F103C8
- SPI piny v Arduinu
- Požadované komponenty
- Výukové schéma a zapojení pro STM32 SPI
- Programování STM32 SPI
- Vysvětlení programování Master STM32 SPI
- Vysvětlení programování Slave Arduino SPI
V našich předchozích cvičeních jsme se dozvěděli o komunikaci SPI a I2C mezi dvěma deskami Arduino. V tomto tutoriálu nahradíme jednu desku Arduino deskou Blue Pill, která je STM32F103C8 a budeme s deskou Arduino komunikovat pomocí sběrnice SPI. V tomto příkladu STM32 SPI použijeme Arduino UNO jako Slave a STM32F103C8 jako Master se dvěma LCD displejem 16X2 připojeným k sobě zvlášť. Dva potenciometry jsou také spojeny s STM32 (PA0) a Arduino (A0), aby určily hodnoty odesílání (0 až 255) z master na slave a slave na master změnou potenciometru.
SPI v STM32F103C8
Ve srovnání s sběrnicí SPI v desce Arduino a desce STM32F103C8 Blue Pill má STM32 2 sběrnice SPI, zatímco Arduino Uno má jednu sběrnici SPI. Arduino Uno má v sobě mikrokontrolér ATMEGA328 a STM32F103C8 má ARM Cortex-M3, díky čemuž je rychlejší než deska Arudino.
Další informace o komunikaci SPI najdete v našich předchozích článcích
- Jak používat SPI v Arduinu: Komunikace mezi dvěma deskami Arduino
- Komunikace SPI s mikrokontrolérem PIC PIC16F877A
- Komunikace SPI prostřednictvím bit Banging
- Detektor úniku horké vody z nádrže Raspberry Pi pomocí modulů SPI
- Hodiny reálného času ESP32 pomocí modulu DS3231
STM32 SPI piny STM32F103C8
Řádek SPI | Kolík v STM32F103C8 |
MOSI1 | PA7 nebo PB5 |
MISO1 | PA6 nebo PB4 |
SCK1 | PA5 nebo PB3 |
SS1 | PA4 nebo PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI piny v Arduinu
Linka SPI |
Připojte Arduino |
MOSI |
11 nebo ICSP-4 |
MISO |
12 nebo ICSP-1 |
SCK |
13 nebo ICSP-3 |
SS |
10 |
Požadované komponenty
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potenciometr - 4
- Nepájivá deska
- Připojení vodičů
Výukové schéma a zapojení pro STM32 SPI
V tabulce níže jsou uvedeny piny připojené pro komunikaci STM32 SPI s Arduino.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
V tabulce níže jsou uvedeny piny připojené pro dva LCD (16x2) s STM32F103C8 a Arduino samostatně.
Kolík LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Na středový PIN potenciometru pro kontrast LCD |
Na středový PIN potenciometru pro kontrast LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5V |
+ 5V |
K. |
GND |
GND |
Důležité:
- Nezapomeňte propojit Arduino GND a STM32F103C8 GND dohromady.
Programování STM32 SPI
Programování je podobné kódu Arduino. Stejný
V tomto příkladu STM32 SPI použijeme Arduino UNO jako Slave a STM32F103C8 jako Master se dvěma LCD displejem 16X2 připojeným k sobě zvlášť. Dva potenciometry jsou také spojeny s STM32 (PA0) a Arduino (A0), aby určily hodnoty odesílání (0 až 255) z master na slave a slave na master změnou potenciometru.
Analogový vstup je přijímán na pin ST032F10C8 PA0 (0 až 3,3 V) otáčením potenciometru. Poté je tato vstupní hodnota převedena na analogově-digitální hodnotu (0 až 4096) a tato digitální hodnota je dále mapována na (0 až 255), protože můžeme prostřednictvím komunikace SPI odeslat pouze 8bitová (bajtová) data.
Podobně na straně Slave vezmeme analogovou vstupní hodnotu na pin Arduino A0 od (0 do 5 V) pomocí potenciometru. A opět je tato vstupní hodnota převedena na analogově-digitální hodnotu (0 až 1023) a tato digitální hodnota je dále mapována na (0 až 255)
Tento výukový program má dva programy, jeden pro master STM32 a druhý pro slave Arduino. Kompletní programy pro obě strany jsou uvedeny na konci tohoto projektu s ukázkovým videem.
Vysvětlení programování Master STM32 SPI
1. Nejprve musíme zahrnout knihovnu SPI pro používání komunikačních funkcí SPI a knihovnu LCD pro používání funkcí LCD. Také definujte piny LCD pro 16x2 LCD. Další informace o propojení LCD se STM32 se dozvíte zde.
#zahrnout
2. V neplatném nastavení ()
- Zahajte sériovou komunikaci s přenosovou rychlostí 9600.
Serial.begin (9600);
- Dále začněte komunikaci SPI
SPI.begin ();
- Poté nastavte dělič hodin pro komunikaci SPI. Nastavil jsem dělič 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Dále nastavte SS pin HIGH, protože jsme nezačali žádný přenos na slave arduino.
digitalWrite (SS, HIGH);
3. V prázdné smyčce ()
- Před odesláním jakékoli hodnoty slave musíme LOW slave vybrat hodnotu pro zahájení přenosu na slave z masteru.
digitalWrite (SS, LOW);
- Dále načtěte analogovou hodnotu z hlavního STM32F10C8 POT připojeného k pinu PA0.
int pot = analogRead (PA0);
Poté tuto hodnotu převeďte na jeden bajt (0 až 255).
byte MasterSend = mapa (pot, 0,4096,0,255);
- Zde přichází důležitý krok, v následujícím prohlášení pošleme převedenou hodnotu POT uloženou v proměnné Mastersend slave Arduino a také přijmeme hodnotu od slave Arduino a uložíme ji do proměnné mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Dále zobrazte tyto přijaté hodnoty od slave arduino se zpožděním 500 mikrosekund a poté průběžně přijímejte a zobrazujte hodnoty.
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 (zpoždění MasterReceive) (500); digitalWrite (SS, HIGH);
Poznámka: K zobrazení výsledku v Serial Motor of Arduino IDE používáme serial.println ().
Vysvětlení programování Slave Arduino SPI
1. Stejně jako master musíme nejdříve zahrnout knihovnu SPI pro používání komunikačních funkcí I2C a knihovnu LCD pro používání funkcí LCD. Také definujte piny LCD pro 16x2 LCD.
#zahrnout
2. V neplatném nastavení ()
- Zahajujeme sériovou komunikaci s přenosovou rychlostí 9600.
Serial.begin (9600);
- Níže uvedené prohlášení nastavuje MISO jako VÝSTUP (Musí odeslat data do Master IN). Takže data se odesílají prostřednictvím MISO Slave Arduino.
pinMode (MISO, VÝSTUP);
- Nyní zapněte SPI v režimu Slave pomocí SPI Control Register
SPCR - = _BV (SPE);
- Poté zapněte přerušení pro komunikaci SPI. Pokud jsou data přijata z masteru, je volána rutina služby přerušení a přijatá hodnota je převzata z SPDR (SPI data Register)
SPI.attachInterrupt ();
- Hodnota z masteru je převzata z SPDR a uložena do Slavereceived proměnné. K tomu dochází v následující funkci Přerušit rutinu.
ISR (SPI_STC_vect) {Slavereceived = SPDR; obdrženo = pravda; }
3. Další v neplatné smyčce ()
- Odečtěte analogovou hodnotu ze Slave Arduino POT připojeného k pinu A0.
int pot = analogRead (A0);
- Tuto hodnotu převeďte na jeden bajt jako 0 až 255.
Slavesend = mapa (pot, 0,1023,0,255);
- Dalším důležitým krokem je odeslání převedené hodnoty na Master STM32F10C8, takže hodnotu umístěte do registru SPDR. Registr SPDR se používá k odesílání a přijímání hodnot.
SPDR = Slavesend;
- Poté zobrazte přijatou hodnotu ( SlaveReceive ) z Master STM32F103C8 na LCD se zpožděním 500 mikrosekund a poté tyto hodnoty nepřetržitě přijímejte a zobrazujte.
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); zpoždění (500);
Tím, otáčením potenciometru na jedné straně, můžete vidět různé hodnoty na displeji na druhé straně:
Takto tedy probíhá komunikace SPI v STM32. Nyní můžete propojit jakýkoli snímač SPI s deskou STM32.
Kompletní kódování pro Master STM32 a Slave Arduino je uvedeno níže s ukázkovým videem