- SPI u STM32F103C8
- SPI igle u Arduinu
- Komponente potrebne
- Kružni dijagram i veze za STM32 SPI lekciju
- STM32 SPI programiranje
- Objašnjenje glavnog programiranja STM32 SPI
- Objašnjenje programiranja za slave Arduino SPI
U našim prethodnim vodičima naučili smo o SPI i I2C komunikaciji između dvije Arduino ploče. U ovom uputstvu zamijenit ćemo jednu Arduino ploču pločom Blue Pill koja je STM32F103C8 i komunicirat će s Arduino pločom pomoću SPI sabirnice. U ovom primjeru STM32 SPI, koristit ćemo Arduino UNO kao slave i STM32F103C8 kao Master s dva 16X2 LCD zaslona međusobno spojena zasebno. Dva potenciometra također su povezana sa STM32 (PA0) i Arduino (A0) kako bi se varijabilnim potenciometrom odredile vrijednosti slanja (0 do 255) od glavnog do pomoćnog i od podređenog do glavnog.
SPI u STM32F103C8
Uspoređujući SPI sabirnicu u Arduino i STM32F103C8 Blue Pill pločici, STM32 ima 2 SPI sabirnice, dok Arduino Uno ima jednu SPI sabirnicu. Arduino Uno ima ATMEGA328 mikrokontroler, a STM32F103C8 ARM Cortex-M3 što ga čini bržim od Arudino ploče.
Da biste saznali više o SPI komunikaciji, pogledajte naše prethodne članke
- Kako koristiti SPI u Arduinu: Komunikacija između dvije Arduino ploče
- SPI komunikacija s PIC mikrokontrolerom PIC16F877A
- SPI komunikacija putem Bit Banginga
- Detektor propuštanja spremnika tople vode Raspberry Pi pomoću SPI modula
- ESP32 sat u stvarnom vremenu pomoću modula DS3231
STM32 SPI igle STM32F103C8

| SPI linija1 | Prikvačite u STM32F103C8 |
| MOSI1 | PA7 ili PB5 |
| MISO1 | PA6 ili PB4 |
| SCK1 | PA5 ili PB3 |
| SS1 | PA4 ili PA15 |
| SPI linija2 | |
| MOSI2 | PB15 |
| MISO2 | PB14 |
| SCK2 | PB13 |
| SS2 | PB12 |
SPI igle u Arduinu

|
SPI linija |
Prikvači u Arduinu |
|
MOSI |
11 ili ICSP-4 |
|
MISO |
12 ili ICSP-1 |
|
SCK |
13 ili ICSP-3 |
|
SS |
10 |
Komponente potrebne
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potenciometar 10k - 4
- Breadboard
- Spajanje žica
Kružni dijagram i veze za STM32 SPI lekciju


Tablica u nastavku prikazuje igle povezane za STM32 SPI komunikaciju s Arduinom.
|
SPI pribadača |
STM32F103C8 |
Arduino |
|
MOSI |
PA7 |
11 |
|
MISO |
PA6 |
12 |
|
SCK |
PA5 |
13 |
|
SS1 |
PA4 |
10 |
Tablica u nastavku prikazuje pinove spojene za dva LCD zaslona (16x2) sa STM32F103C8 i Arduino odvojeno.
|
LCD pin |
STM32F103C8 |
Arduino |
|
VSS |
GND |
GND |
|
VDD |
+ 5V |
+ 5V |
|
V0 |
Na središnji PIN potenciometra za LCD kontrast |
Na središnji PIN potenciometra za LCD kontrast |
|
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 |
Važno:
- Ne zaboravite povezati Arduino GND i STM32F103C8 GND zajedno.
STM32 SPI programiranje
Programiranje je slično Arduino kodu. Isto
U ovom primjeru STM32 SPI, koristit ćemo Arduino UNO kao slave i STM32F103C8 kao Master s dva 16X2 LCD zaslona međusobno spojena zasebno. Dva potenciometra također su povezana sa STM32 (PA0) i Arduino (A0) kako bi se varijabilnim potenciometrom odredile vrijednosti slanja (0 do 255) od glavnog do pomoćnog i od podređenog do glavnog.
Analogni ulaz uzima se na STM32F10C8 pin PA0 (0 do 3,3 V) okretanjem potenciometra. Tada se ta ulazna vrijednost pretvara u analognu u digitalnu vrijednost (0 do 4096) i ta se digitalna vrijednost dodatno preslikava na (0 do 255) jer odjednom možemo poslati samo 8-bitne (bajtne) podatke putem SPI komunikacije.
Slično na podređenoj strani uzimamo analognu ulaznu vrijednost na Arduino pin A0 od (0 do 5V) pomoću potenciometra. I opet se ova ulazna vrijednost pretvara u analognu u digitalnu vrijednost (0 do 1023) i ta se digitalna vrijednost dalje preslikava u (0 do 255)
Ovaj tutorial ima dva programa, jedan za master STM32 i drugi za slave Arduino. Kompletni programi za obje strane dati su na kraju ovog projekta s demonstracijskim videom.
Objašnjenje glavnog programiranja STM32 SPI
1. Prije svega moramo uključiti SPI knjižnicu za korištenje SPI komunikacijskih funkcija i LCD knjižnicu za korištenje LCD funkcija. Također definirajte LCD igle za LCD 16x2. Ovdje saznajte više o povezivanju LCD-a sa STM32.
#include
2. U void postavljanju ()
- Pokrenite serijsku komunikaciju brzinom prijenosa 9600.
Serial.begin (9600);
- Zatim započnite SPI komunikaciju
SPI.begin ();
- Zatim postavite razdjelnik sata za SPI komunikaciju. Postavio sam razdjelnik 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Dalje postavite SS pin HIGH jer nismo započeli nikakav prijenos na slave arduino.
digitalWrite (SS, HIGH);
3. U void petlji ()
- Prije slanja bilo koje vrijednosti na slave moramo smanjiti vrijednost odabrane slave da bismo započeli prijenos na slave od master-a.
digitalWrite (SS, LOW);
- Zatim pročitajte analognu vrijednost s matičnog STM32F10C8 POT-a pričvršćenog na pin PA0.
int pot = analogRead (PA0);
Zatim pretvorite ovu vrijednost u jedan bajt (0 do 255).
bajt MasterSend = karta (pot, 0,4096,0,255);
- Ovdje dolazi važan korak, u sljedećem navodu šaljemo pretvorenu vrijednost POT pohranjenu u Mastersend varijablu podređenom Arduinu, a također primamo vrijednost od podređenog Arduina i pohranjujemo je u mastereceive varijablu.
Mastereceive = SPI.transfer (Mastersend);
- Sljedeće prikazuju one primljene vrijednosti iz slave arduina s odgodom od 500 mikrosekundi, a zatim kontinuirano primaju i prikazuju vrijednosti.
Serial.println ("Slave Arduino za 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);
Napomena: Koristimo serial.println () za prikaz rezultata u Serial Motoru Arduino IDE-a.
Objašnjenje programiranja za slave Arduino SPI
1. Isto kao i master, prije svega moramo uključiti SPI knjižnicu za upotrebu I2C komunikacijskih funkcija i LCD knjižnicu za korištenje LCD funkcija. Također definirajte LCD igle za LCD 16x2.
#include
2. U void postavljanju ()
- Serijsku komunikaciju započinjemo brzinom prijenosa 9600.
Serial.begin (9600);
- Ispod izjave postavlja se MISO kao IZLAZ (mora poslati podatke Master IN-u). Dakle, podaci se šalju putem MISO-a Slave Arduina.
pinMode (MISO, IZLAZ);
- Sada uključite SPI u podređenom načinu pomoću SPI kontrolnog registra
SPCR - = _BV (SPE);
- Zatim Uključite prekid za SPI komunikaciju. Ako se podaci primaju od glavnog pretplatnika, poziva se rutina usluge prekida i prima se vrijednost iz SPDR-a (SPI registar podataka)
SPI.attachInterrupt ();
- Vrijednost iz master preuzima se iz SPDR-a i pohranjuje u Slavereceived varijablu. To se događa u sljedećoj funkciji Prekidna rutina.
ISR (SPI_STC_vect) {Slavereceived = SPDR; primljeno = točno; }
3. Sljedeće u void petlji ()
- Očitajte analognu vrijednost iz Slave Arduino POT-a pričvršćenog na pin A0.
int pot = analogRead (A0);
- Pretvorite tu vrijednost u smislu jednog bajta u 0 do 255.
Slavesend = karta (lonac, 0,1023,0,255);
- Sljedeći važan korak je slanje pretvorene vrijednosti na glavni STM32F10C8, pa stavite vrijednost u SPDR registar. SPDR registar koristi se za slanje i primanje vrijednosti.
SPDR = Slavesend;
- Zatim prikažite primljenu vrijednost ( SlaveReceive ) od Master STM32F103C8 na LCD-u s odgodom od 500 mikrosekundi, a zatim kontinuirano primite i prikažite tu vrijednost.
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); kašnjenje (500);
Do okretanjem potenciometra na jednoj strani, možete vidjeti različite vrijednosti na LCD na drugu stranu:

Dakle, ovako se odvija SPI komunikacija u STM32. Sada možete spojiti bilo koji SPI senzor sa STM32 pločom.
Kompletno kodiranje Master STM32 i Slave Arduino dato je u nastavku s demonstracijskim video zapisom
