- STM32F103C8 I2C Prezentare generală
- Pinii I2C în STM32F103C8
- Pinii I2C în Arduino
- Componente necesare
- Diagrama circuitului și conexiunile
- Programare I2C în STM32
- Explicație de programare Master STM32
- Explicație despre programarea Slave Arduino
În tutorialele noastre anterioare, am aflat despre comunicarea SPI și I2C între două plăci Arduino. În acest tutorial vom înlocui o placă Arduino cu placa Blue Pill care este STM32F103C8 și vom comunica cu placa Arduino folosind magistrala I2C.
STM32 are mai multe caracteristici decât placa Arduino. Deci, ar fi minunat să învățăm despre comunicarea între STM32 și Arduino folosind magistrala SPI și I2C. În acest tutorial, vom folosi magistrala I2C pentru comunicarea între Arduino și STM32F103C8 și vom afla despre autobuzul SPI în următorul tutorial. Pentru a afla mai multe despre placa STM32, verificați alte proiecte STM32.
STM32F103C8 I2C Prezentare generală
Comparând I2C (circuite integrate) în placa STM32F103C8 Blue Pill cu Arduino Uno, atunci vom vedea că Arduino are microcontroler ATMEGA328 și STM32F103C8 are ARM Cortex-M3 în el. STM32 are două autobuze I2C, în timp ce Arduino Uno are doar un autobuz I2C, iar STM32 este mai rapid decât Arduino.
Pentru a afla mai multe despre comunicarea I2C, consultați articolele noastre anterioare
- Cum se folosește I2C în Arduino: comunicare între două plăci Arduino
- Comunicare I2C cu microcontroler PIC PIC16F877
- Interfață LCD 16X2 cu ESP32 folosind I2C
- Comunicare I2C cu MSP430 Launchpad
- Interfață LCD cu NodeMCU fără utilizarea I2C
- Cum să gestionați comunicațiile multiple (I2C SPI UART) într-un singur program de arduino
Pinii I2C în STM32F103C8
SDA: PB7 sau PB9, PB11.
SCL: PB6 sau PB8, PB10.
Pinii I2C în Arduino
SDA: pin A4
SCL: pin A5
Componente necesare
- STM32F103C8
- Arduino Uno
- LED (2 numere)
- Buton de apăsare (2 numere)
- Rezistoare (4 numere)
- Breadboard
- Conectarea firelor
Diagrama circuitului și conexiunile
Următorul tabel prezintă conexiunea dintre STM32 Blue Pill și Arduino Uno pentru utilizarea magistralei I2C. Necesită doar două fire.
STM32F103C8 |
Arduino |
Descrierea pinului |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Sol |
Important
- Nu uitați să conectați Arduino GND și STM32F103C8 GND împreună.
- Apoi conectați separat un rezistor de 10k la pinii butonului de pe ambele plăci.
În acest tutorial STM32 I2C vom configura STM32F103C8 ca Master și Arduino ca Slave. Ambele plăci sunt atașate separat cu un LED și un buton.
Pentru a demonstra comunicarea I2C în STM32, controlăm LED-ul master STM32 folosind valoarea butonului Arduino slave și controlăm LED-ul Arduino slave folosind valoarea butonului master STM32F103C8. Aceste valori sunt trimise prin magistrala de comunicații I2C.
Programare I2C în STM32
Programarea este similară codului Arduino. La fel
Acest tutorial are două programe unul pentru master STM32 și altul pentru Arduino slave. Programe complete pentru ambele părți sunt oferite la sfârșitul acestui proiect cu un videoclip demonstrativ.
Explicație de programare Master STM32
În Master STM32 să vedem ce se întâmplă:
1. În primul rând, trebuie să includem biblioteca Wire și biblioteca softwire pentru utilizarea funcțiilor de comunicație I2C în STM32F103C8.
#include
2. În configurare nulă ()
- Începem comunicarea în serie la rata Baud 9600.
Serial.begin (9600);
- Apoi începem comunicarea I2C la pin (B6, B7)
Wire.begin ();
3. În bucla Vid ()
- Mai întâi primim datele de la Slave Arduino, așa că folosim requestFrom () cu adresa slave 8 și solicităm un octet.
Wire.requestFrom (8,1);
Valoarea primită este citită folosind Wire.read ()
octet a = Wire.read ();
- În funcție de valoarea primită de la slave, LED-ul principal este pornit sau oprit utilizând digitalwrite la pinul PA1 și, de asemenea, imprimarea în serie este utilizată pentru a imprima valoarea în monitorul serial
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Master LED OFF"); }
- În continuare, trebuie să citim starea pinului PA0, care este butonul master STM32.
int pinvalue = digitalRead (buton);
- Apoi trimiteți valoarea pinului conform logicii, așa că folosim condiția if și apoi începem transmisia cu arduino slave cu 8 ca adresă și apoi scriem valoarea în funcție de valoarea de intrare a butonului.
if (pinvalue == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Explicație despre programarea Slave Arduino
1. În primul rând trebuie să includem biblioteca Wire pentru utilizarea funcțiilor de comunicare I2C.
#include
2. În configurare nulă ()
- Începem comunicarea în serie la rata Baud 9600.
Serial.begin (9600);
- Apoi începeți comunicarea I2C la pin (A4, A5) cu adresa slave ca 8. Aici este important să specificați adresa slave.
Wire.begin (8);
Apoi, trebuie să apelăm funcția Wire.onReceive atunci când Slave primește valoare de la master și funcția Wire.onRequest atunci când Master solicită valoarea de la Slave.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. În continuare avem două funcții, una pentru evenimentul de solicitare și una pentru evenimentul de primire
Pentru cerere Eveniment
Când Master STM32 solicită valoarea de la sclav, această funcție se va executa. Această funcție preia valoarea de intrare de la butonul Slave Arduino și trimite un octet (1 sau 0) către Master STM32 în funcție de valoarea butonului utilizând Wire.write ().
void requestEvent () { valoare int = digitalRead (buton); if (valoare == HIGH) { x = 1; } else { x = 0; } Wire.write (x); }
Pentru a primi eveniment
Când Maestrul trimite date către sclav cu adresă de sclav (8), această funcție se va executa. Această funcție citește valoarea primită de la master și se stochează într-o variabilă de tip octet și apoi se utilizează if logic pentru a activa sau dezactiva LED-ul slave în funcție de valoarea primită. Dacă valoarea primită este 1, LED-ul se aprinde, iar pentru 0 LED-ul se stinge.
void receiveEvent (int howMany) { octet a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println („LED sclav aprins”); } else { digitalWrite (LED, LOW); Serial.println ("LED sclav OFF"); } întârziere (500); }
Ieșire
1. Când apăsăm butonul de la Master STM32, LED-ul conectat la Slave Ardiono se aprinde (alb).
2. Acum, când apăsăm butonul din partea Slave, LED-ul conectat la Master se aprinde (roșu) și când butonul este eliberat, LED-ul se stinge.
3. Când ambele butoane sunt apăsate simultan, apoi ambele LED-uri aprind în același timp și rămân aprinse până când butoanele sunt apăsate
Deci, așa are loc comunicarea I2C în STM32. Acum puteți interfața orice senzor I2C cu placa STM32.
Codificarea completă pentru Master STM32 și Slave Arduino este prezentată mai jos cu un videoclip demonstrativ