- SPI v STM32F103C8
- SPI piny v Arduine
- Súčasti sú povinné
- Schéma zapojenia a zapojenie pre príručku STM32 SPI
- STM32 SPI programovanie
- Vysvetlenie programovania Master STM32 SPI
- Vysvetlenie programovania Slave Arduino SPI
V našich predchádzajúcich tutoriáloch sme sa dozvedeli o komunikácii SPI a I2C medzi dvoma doskami Arduino. V tomto tutoriáli nahradíme jednu dosku Arduino doskou Blue Pill, ktorá je STM32F103C8 a budeme s doskou Arduino komunikovať pomocou zbernice SPI. V tomto príklade STM32 SPI použijeme Arduino UNO ako Slave a STM32F103C8 ako Master s dvomi LCD displejmi 16X2, ktoré sú navzájom spojené. Dva potenciometre sú tiež pripojené k STM32 (PA0) a Arduino (A0) na stanovenie vysielacích hodnôt (0 až 255) z mastera na slave a slave na mastera zmenou potenciometra.
SPI v STM32F103C8
Pri porovnaní zbernice SPI v doske Arduino a STM32F103C8 Blue Pill má STM32 v sebe 2 zbernice SPI, zatiaľ čo Arduino Uno má jednu zbernicu SPI. Arduino Uno má v sebe mikrokontrolér ATMEGA328 a STM32F103C8 má ARM Cortex-M3, vďaka čomu je rýchlejší ako doska Arudino.
Ak sa chcete dozvedieť viac informácií o komunikácii SPI, prečítajte si naše predchádzajúce články
- Ako používať SPI v Arduine: Komunikácia medzi dvoma doskami Arduino
- Komunikácia SPI s mikrokontrolérom PIC PIC16F877A
- SPI komunikácia cez Bit Banging
- Detektor úniku z nádrže na horúcu vodu Raspberry Pi využívajúci moduly SPI
- Hodiny ESP32 v reálnom čase pomocou modulu DS3231
STM32 SPI piny STM32F103C8
SPI linka1 | Pripnite do STM32F103C8 |
MOSI1 | PA7 alebo PB5 |
MISO1 | PA6 alebo PB4 |
SCK1 | PA5 alebo PB3 |
SS1 | PA4 alebo PA15 |
SPI linka2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI piny v Arduine
SPI linka |
Pripnite si Arduino |
MOSI |
11 alebo ICSP-4 |
MISO |
12 alebo ICSP-1 |
SCK |
13 alebo ICSP-3 |
SS |
10 |
Súčasti sú povinné
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potenciometer - 4
- Nepál
- Pripojenie drôtov
Schéma zapojenia a zapojenie pre príručku STM32 SPI
Nasledujúca tabuľka zobrazuje piny pripojené pre komunikáciu STM32 SPI s Arduino.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
V nasledujúcej tabuľke sú uvedené konektory pripojené k dvom LCD (16x2) s STM32F103C8 a Arduino osobitne.
Pin LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Na stredový PIN potenciometra pre kontrast LCD |
Na stredový PIN potenciometra pre 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é:
- Nezabudnite prepojiť Arduino GND a STM32F103C8 GND dohromady.
STM32 SPI programovanie
Programovanie je podobné kódu Arduino. Rovnaký
V tomto príklade STM32 SPI použijeme Arduino UNO ako Slave a STM32F103C8 ako Master s dvomi LCD displejmi 16X2, ktoré sú navzájom spojené. Dva potenciometre sú tiež pripojené k STM32 (PA0) a Arduino (A0) na stanovenie vysielacích hodnôt (0 až 255) z mastera na slave a slave na mastera zmenou potenciometra.
Analógový vstup sa sníma na pin ST032F10C8 PA0 (0 až 3,3 V) otáčaním potenciometra. Potom sa táto vstupná hodnota prevedie na analógovo-digitálnu hodnotu (0 až 4096) a táto digitálna hodnota sa ďalej namapuje na (0 až 255), pretože prostredníctvom komunikácie SPI môžeme naraz posielať iba 8-bitové (bajtové) údaje.
Podobne na strane slave berieme analógovú vstupnú hodnotu na pin Arduino A0 od (0 do 5 V) pomocou potenciometra. A opäť sa táto vstupná hodnota prevedie na analógovo-digitálnu hodnotu (0 až 1023) a táto digitálna hodnota sa ďalej namapuje na (0 až 255).
Tento tutoriál má dva programy, jeden pre master STM32 a druhý pre slave Arduino. Kompletné programy pre obe strany sú uvedené na konci tohto projektu s ukážkovým videom.
Vysvetlenie programovania Master STM32 SPI
1. Najprv musíme zahrnúť knižnicu SPI na používanie komunikačných funkcií SPI a knižnicu LCD na používanie funkcií LCD. Definujte tiež kolíky LCD pre 16x2 LCD. Viac informácií o prepojení LCD so STM32 sa dozviete tu.
#include
2. V neplatnom nastavení ()
- Začnite sériovú komunikáciu s prenosovou rýchlosťou 9600.
Serial.begin (9600);
- Ďalej začne komunikácia SPI
SPI.begin ();
- Potom nastavte rozdeľovač hodín pre komunikáciu SPI. Nastavil som rozdeľovač 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Ďalej nastavte SS kolík VYSOKÝ, pretože sme nezačali so žiadnym prenosom na slave arduino.
digitalWrite (SS, HIGH);
3. V neplatnej slučke ()
- Pred odoslaním akejkoľvek hodnoty do slave musíme LOW slave zvoliť hodnotu, aby sa začal prenos do slave z mastera.
digitalWrite (SS, LOW);
- Ďalej prečítajte analógovú hodnotu z masteru STM32F10C8 POT pripojeného na pin PA0.
int pot = analogRead (PA0);
Potom túto hodnotu preveďte na jeden bajt (0 až 255).
byte MasterSend = mapa (pot, 0,4096,0,255);
- Prichádza dôležitý krok, v nasledujúcom vyhlásení pošleme prevedenú hodnotu POT uloženú v premennej Mastersend na podradené Arduino a tiež prijmeme hodnotu od podriadeného Arduino a uložíme ju do premennej mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Ďalej zobrazte prijaté hodnoty od slave arduino s oneskorením 500 mikrosekúnd a potom tieto hodnoty neustále prijímajte a zobrazujte.
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 (oneskorenie MasterReceive) (500); digitalWrite (SS, HIGH);
Poznámka: Na zobrazenie výsledku v Serial Motor of Arduino IDE používame serial.println ().
Vysvetlenie programovania Slave Arduino SPI
1. Rovnako ako master, v prvom rade musíme zahrnúť knižnicu SPI na používanie komunikačných funkcií I2C a LCD knižnicu na používanie funkcií LCD. Definujte tiež kolíky LCD pre 16x2 LCD.
#include
2. V neplatnom nastavení ()
- Sériovú komunikáciu začíname prenosovou rýchlosťou 9600.
Serial.begin (9600);
- Nižšie uvedené vyhlásenie nastavuje MISO ako VÝSTUP (Musíte odoslať údaje do Master IN). Takže údaje sa odosielajú prostredníctvom MISO Slave Arduino.
pinMode (MISO, VÝSTUP);
- Teraz zapnite SPI v režime Slave pomocou ovládacieho registra SPI
SPCR - = _BV (SPE);
- Potom zapnite prerušenie pre komunikáciu SPI. Ak sú dáta prijaté z mastera, je vyvolaná rutina prerušenia služby a prijatá hodnota je prevzatá z SPDR (SPI data Register)
SPI.attachInterrupt ();
- Hodnota z mastera je prevzatá z SPDR a je uložená v premennej prijatej slavou . To sa deje v nasledujúcej funkcii prerušenia rutiny.
ISR (SPI_STC_vect) {Slavereceived = SPDR; prijaté = pravda; }
3. Ďalej v neplatnej slučke ()
- Odčítajte analógovú hodnotu zo zariadenia Slave Arduino POT pripojeného na pin A0.
int pot = analogRead (A0);
- Túto hodnotu preveďte na jeden bajt z 0 na 255.
Slavesend = mapa (pot, 0,1023,0,255);
- Ďalším dôležitým krokom je zaslanie prevedenej hodnoty na Master STM32F10C8, takže hodnotu umiestnite do registra SPDR. Register SPDR sa používa na odosielanie a prijímanie hodnôt.
SPDR = Slavesend;
- Potom zobrazte prijatú hodnotu ( SlaveReceive ) z Master STM32F103C8 na LCD s oneskorením 500 mikrosekúnd a potom tieto hodnoty nepretržite prijímajte a zobrazujte.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 na Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); oneskorenie (500);
Tým, otáčaním potenciometra na jednej strane, môžete vidieť rôzne hodnoty na displeji na druhej strane:
Takto teda prebieha komunikácia SPI v STM32. Teraz môžete prepojiť akýkoľvek snímač SPI s doskou STM32.
Kompletné kódovanie pre Master STM32 a Slave Arduino je uvedené nižšie s ukážkovým videom