- SPI v STM32F103C8
- Zatiči SPI v Arduinu
- Potrebne komponente
- Shema vezij in povezave za vadnico STM32 SPI
- STM32 SPI programiranje
- Pojasnilo glavnega programiranja STM32 SPI
- Pojasnilo programiranja Slave Arduino SPI
V naših prejšnjih vajah smo spoznali komunikacijo SPI in I2C med dvema ploščama Arduino. V tej vadnici bomo eno ploščo Arduino zamenjali s ploščo Blue Pill, ki je STM32F103C8, in bo komunicirala z ploščo Arduino prek vodila SPI. V tem primeru STM32 SPI bomo uporabili Arduino UNO kot podrejeni in STM32F103C8 kot glavni z dvema 16X2 LCD zaslonoma, pritrjenima drug na drugega posebej. Dva potenciometra sta povezana tudi s STM32 (PA0) in Arduino (A0), da določita vrednosti pošiljanja (od 0 do 255) od glavnega do pomožnega in od podrejenega do glavnega s spreminjanjem potenciometra.
SPI v STM32F103C8
Če primerjamo vodilo SPI v plošči Arduino in STM32F103C8 Blue Pill, ima STM32 2 vodila SPI, medtem ko ima Arduino Uno eno vodilo SPI. Arduino Uno ima v sebi mikrokrmilnik ATMEGA328, STM32F103C8 pa ARM Cortex-M3, zaradi česar je hitrejši kot Arudino Board.
Če želite izvedeti več o komunikaciji SPI, si oglejte naše prejšnje članke
- Kako uporabljati SPI v Arduinu: Komunikacija med dvema ploščama Arduino
- Komunikacija SPI z mikrokrmilnikom PIC PIC16F877A
- SPI komunikacija prek bit banging
- Detektor puščanja rezervoarja za vročo vodo Raspberry Pi z uporabo modulov SPI
- Ura v realnem času ESP32 z uporabo modula DS3231
STM32 SPI zatiči STM32F103C8
SPI linija 1 | Pripnite v STM32F103C8 |
MOSI1 | PA7 ali PB5 |
MISO1 | PA6 ali PB4 |
SCK1 | PA5 ali PB3 |
SS1 | PA4 ali PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Zatiči SPI v Arduinu
SPI linija |
Pripnite v Arduino |
MOSI |
11 ali ICSP-4 |
MISO |
12 ali ICSP-1 |
SCK |
13 ali ICSP-3 |
SS |
10. |
Potrebne komponente
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potenciometer - 4
- Breadboard
- Povezovanje žic
Shema vezij in povezave za vadnico STM32 SPI
Spodnja tabela prikazuje priključke, priključene za komunikacijo STM32 SPI z Arduino.
Zatič SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11. |
MISO |
PA6 |
12. |
SCK |
PA5 |
13. |
SS1 |
PA4 |
10. |
Spodnja tabela prikazuje nožice, povezane ločeno za dva LCD (16x2) s STM32F103C8 in Arduino.
LCD pin |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Na sredinsko kodo PIN potenciometra za kontrast LCD |
Na sredinsko kodo PIN potenciometra za 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 |
Pomembno:
- Ne pozabite povezati Arduino GND in STM32F103C8 GND skupaj.
STM32 SPI programiranje
Programiranje je podobno kodo Arduino. Enako
V tem primeru STM32 SPI bomo uporabili Arduino UNO kot podrejeni in STM32F103C8 kot glavni z dvema 16X2 LCD zaslonoma, pritrjenima drug na drugega posebej. Dva potenciometra sta povezana tudi s STM32 (PA0) in Arduino (A0), da določita vrednosti pošiljanja (od 0 do 255) od glavnega do pomožnega in od podrejenega do glavnega s spreminjanjem potenciometra.
Analogni vhod se izvede na STM32F10C8 pin PA0 (0 do 3,3 V) z vrtenjem potenciometra. Nato se ta vhodna vrednost pretvori v analogno v digitalno vrednost (0 do 4096) in ta digitalna vrednost se nato preslika na (0 do 255), saj lahko prek komunikacije SPI hkrati pošljemo le 8-bitne (bajtne) podatke.
Podobno na podrejeni strani s pomočjo potenciometra vzamemo analogno vhodno vrednost na Arduino pin A0 od (0 do 5V). In spet se ta vhodna vrednost pretvori v analogno v digitalno vrednost (0 do 1023) in ta digitalna vrednost se nato preslika na (0 do 255)
Ta vadnica ima dva programa, enega za glavnega STM32 in drugega za suženjski Arduino. Celotni programi za obe strani so podani na koncu tega projekta z demonstracijskim videom.
Pojasnilo glavnega programiranja STM32 SPI
1. Najprej moramo vključiti knjižnico SPI za uporabo komunikacijskih funkcij SPI in knjižnico LCD za uporabo funkcij LCD. Določite tudi zatiče LCD za LCD 16x2. Več o povezovanju LCD-ja s STM32 preberite tukaj.
#include
2. V void setup ()
- Začnite serijsko komunikacijo s hitrostjo prenosa 9600.
Serial.begin (9600);
- Nato začnite komunikacijo SPI
SPI.begin ();
- Nato nastavite delilnik ure za komunikacijo SPI. Nastavil sem delilnik 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Nato nastavite SS pin HIGH, ker nismo začeli nobenega prenosa na slave arduino.
digitalWrite (SS, HIGH);
3. V void zanki ()
- Preden poljubno vrednost pošljemo pomožni enoti, moramo NIZKO vrednost izbrati podrejeni, da začnemo prenašati podrejeno iz glavnega.
digitalWrite (SS, LOW);
- Nato preberite analogno vrednost iz glavne enote STM32F10C8 POT, pritrjene na zatič PA0.
int pot = analogRead (PA0);
Nato pretvorite to vrednost v en bajt (0 do 255).
bajt MasterSend = zemljevid (pot, 0,4096,0,255);
- Prihaja pomemben korak v naslednjo izjavo pošljemo pretvorjeno POT vrednost, shranjeno v Mastersend spremenljivko na slave Arduino, in tudi dobili največ od slave Arduino in shranijo, da v mastereceive spremenljivko.
Mastereceive = SPI.transfer (Mastersend);
- Nato prikažite tiste prejete vrednosti iz podrejenega arduina z zakasnitvijo 500 mikrosekund in nato neprekinjeno sprejemajte in prikazujte vrednosti.
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);
Opomba: Za ogled rezultata v Serial Motor of Arduino IDE uporabljamo serial.println ().
Pojasnilo programiranja Slave Arduino SPI
1. Enako kot master, najprej moramo vključiti knjižnico SPI za uporabo komunikacijskih funkcij I2C in knjižnico LCD za uporabo funkcij LCD. Določite tudi zatiče LCD za LCD 16x2.
#include
2. V void setup ()
- Začnemo serijsko komunikacijo s hitrostjo prenosa 9600.
Serial.begin (9600);
- Spodaj stavek MISO nastavi kot IZHOD (podatke je treba poslati Master IN). Torej se podatki pošljejo prek MISO podrejenega Arduina.
pinMode (MISO, IZHOD);
- Zdaj vklopite SPI v podrejenem načinu z uporabo nadzornega registra SPI
SPCR - = _BV (SPE);
- Nato vklopite prekinitev za komunikacijo SPI. Če so podatki prejeti od glavne enote, se pokliče prekinitvena rutina in prejeta vrednost se vzame iz SPDR (SPI data Register)
SPI.attachInterrupt ();
- Vrednost iz masterja je vzeta iz SPDR in shranjena v spremenljivki Slavereceived . To se zgodi v naslednji prekinitveni rutinski funkciji.
ISR (SPI_STC_vect) {Slavereceived = SPDR; prejeto = resnično; }
3. Naslednja void zanka ()
- Preberite analogno vrednost iz podrejenega Arduino POT, pritrjenega na zatič A0.
int pot = analogRead (A0);
- Pretvorite to vrednost v en bajt v 0 na 255.
Slavesend = zemljevid (pot, 0,1023,0,255);
- Naslednji pomemben korak je poslati pretvorjeno vrednost v glavni STM32F10C8, zato vrednost vnesite v register SPDR. Register SPDR se uporablja za pošiljanje in sprejemanje vrednosti.
SPDR = Slavesend;
- Nato prikažite prejeto vrednost ( SlaveReceive ) iz Master STM32F103C8 na LCD z zakasnitvijo 500 mikrosekund in nato neprekinjeno prejemajte in prikažite te vrednosti.
lcd.setCursor (0,0); lcd.print ("suženj: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); zamuda (500);
Z vrtenjem potenciometra na eni strani lahko na LCD-ju na drugi strani vidite različne vrednosti:
Tako torej poteka komunikacija SPI v STM32. Zdaj lahko kateri koli SPI senzor povežete s ploščo STM32.
Popolno kodiranje Master STM32 in Slave Arduino je predstavljeno spodaj z demonstracijskim videoposnetkom