- STM32F103C8 Pregled I2C
- I2C zatiči v STM32F103C8
- I2C zatiči v Arduinu
- Potrebne komponente
- Shema vezja in povezave
- Programiranje I2C v STM32
- Pojasnilo glavnega programiranja STM32
- Pojasnilo programiranja slave Arduino
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 I2C.
STM32 ima več funkcij kot plošča Arduino. Zato bi bilo čudovito izvedeti več o komunikaciji med STM32 in Arduino z uporabo vodila SPI in I2C. V tej vadnici bomo uporabili vodilo I2C za komunikacijo med Arduino in STM32F103C8, o vodilu SPI pa bomo izvedeli v naslednji vadnici. Če želite izvedeti več o plošči STM32, si oglejte druge projekte STM32.
STM32F103C8 Pregled I2C
Če primerjamo I2C (Inter integrirana vezja) v plošči STM32F103C8 Blue Pill z Arduino Uno, bomo videli, da ima Arduino v sebi mikrokrmilnik ATMEGA328, STM32F103C8 pa ARM Cortex-M3. STM32 ima dve vodili I2C, medtem ko ima Arduino Uno samo eno vodilo I2C, STM32 pa je hitrejši od Arduina.
Če želite izvedeti več o komunikaciji I2C, si oglejte naše prejšnje članke
- Kako uporabljati I2C v Arduinu: Komunikacija med dvema ploščama Arduino
- I2C Komunikacija z mikrokrmilnikom PIC PIC16F877
- Povezava 16X2 LCD z ESP32 z uporabo I2C
- I2C komunikacija z MSP430 Launchpad
- Povezava LCD-ja z NodeMCU brez uporabe I2C
- Kako ravnati z več komunikacijami (I2C SPI UART) v enem programu arduino
I2C zatiči v STM32F103C8
SDA: PB7 ali PB9, PB11.
SCL: PB6 ali PB8, PB10.
I2C zatiči v Arduinu
SDA: zatič A4
SCL: zatič A5
Potrebne komponente
- STM32F103C8
- Arduino Uno
- LED (2-št.)
- Potisni gumb (2 št.)
- Upori (4-št.)
- Breadboard
- Povezovanje žic
Shema vezja in povezave
Naslednja tabela prikazuje povezavo med STM32 Blue Pill in Arduino Uno za uporabo vodila I2C. Potrebujete le dve žici.
STM32F103C8 |
Arduino |
Opis pin |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Tla |
Pomembno
- Ne pozabite povezati Arduino GND in STM32F103C8 GND skupaj.
- Nato na nožice obeh plošč ločeno priklopite upor dolžine 10 k.
V tej vadnici za STM32 I2C bomo konfigurirali STM32F103C8 kot Master in Arduino kot Slave. Obe plošči sta pritrjeni z LED in tipko posebej.
Za prikaz komunikacije I2C v STM32 nadzorujemo glavno LED STM32 z uporabo podrejene vrednosti gumba Arduino in nadzorujemo podrejeno LED Arduino z uporabo vrednosti tipke STM32F103C8. Te vrednosti se pošljejo po komunikacijskem vodilu I2C.
Programiranje I2C v STM32
Programiranje je podobno kodo Arduino. Enako
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
V Master STM32 poglejmo, kaj se dogaja:
1. Najprej moramo v STM32F103C8 vključiti knjižnico Wire in knjižnico softwire za uporabo komunikacijskih funkcij I2C.
#include
2. V void setup ()
- Začnemo serijsko komunikacijo s hitrostjo prenosa 9600.
Serial.begin (9600);
- Nato začnemo komunikacijo I2C na zatiču (B6, B7)
Wire.begin ();
3. V zanki Void ()
- Najprej dobimo podatke iz podrejenega Arduina, zato uporabimo requestFrom () z pomožnim naslovom 8 in zahtevamo en bajt.
Wire.requestFrom (8,1);
Prejeto vrednost preberemo z uporabo Wire.read ()
bajt a = Wire.read ();
- Odvisno od prejete vrednosti iz pomožne enote se glavna lučka vklopi ali izklopi z uporabo digitalnega pisanja na nožici PA1, serijski tisk pa se uporablja za tiskanje vrednosti v serijskem monitorju
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Master LED OFF"); }
- Nato moramo prebrati stanje zatiča PA0, ki je glavni gumb STM32.
int pinvalue = digitalRead (gumb);
- Nato pošljite vrednost pin-a v skladu z logiko, zato uporabimo pogoj if in nato začnemo prenos s podrejenim arduinom z naslovom 8 in nato vrednost zapišemo glede na vhodno vrednost gumba.
če (pinvalue == HIGH) { x = 1; } sicer { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Pojasnilo programiranja slave Arduino
1. Najprej moramo vključiti knjižnico Wire za uporabo komunikacijskih funkcij I2C.
#include
2. V void setup ()
- Začnemo serijsko komunikacijo s hitrostjo prenosa 9600.
Serial.begin (9600);
- Nato zaženite komunikacijo I2C na zatiču (A4, A5) s podrejenim naslovom kot 8. Tu je pomembno, da podate podrejeni naslov.
Wire.begin (8);
Nato moramo poklicati funkcijo Wire.onReceive, ko podrejeni prejme vrednost od glavne enote, in funkcijo Wire.onRequest, ko glavna zahteva vrednost od podrejene.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. Nato imamo dve funkciji, eno za dogodek zahteve in drugo za dogodek prejema
Za zahtevo Dogodek
Ko Master STM32 zahteva vrednost od podrejenega, se bo ta funkcija izvedla. Ta funkcija vzame vhodno vrednost s tipke Slave Arduino in z uporabo Wire.write () pošlje bajt (1 ali 0) Master STM32 v skladu z vrednostjo gumba .
void requestEvent () { int value = digitalRead (buttonpin); če (vrednost == VISOKO) { x = 1; } sicer { x = 0; } Wire.write (x); }
Za dogodek prejema
Ko Master pošlje podatke podrejenemu s podrejenim naslovom (8), se bo ta funkcija izvedla. Ta funkcija prebere prejeto vrednost iz glavne enote in shrani v spremenljivko bajta tipa in nato z logiko if vklopi ali izklopi podrejeno LED, odvisno od prejete vrednosti. Če je prejeta vrednost 1, se LED vklopi in za 0 LED ugasne.
void receiveEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Slave LED OFF"); } zamuda (500); }
Izhod
1. Ko na Master STM32 pritisnemo gumb, se LED, priključena na Slave Ardiono, prižge (bela).
2. Zdaj, ko pritisnemo gumb na podrejeni strani, se LED, priključena na Master, vklopi (rdeča) in ko tipko spustimo, LED ugasne.
3. Ko hkrati pritisnete obe tipki, lučki hkrati zasvetijo in ostanejo vklopljene, dokler gumba ne pritisnete
Torej tako poteka komunikacija I2C v STM32. Zdaj lahko kateri koli senzor I2C povežete s ploščo STM32.
Popolno kodiranje Master STM32 in Slave Arduino je predstavljeno spodaj z demonstracijskim videoposnetkom