- STM32F103C8 I2C Visió general
- Pins I2C a STM32F103C8
- Pins I2C a Arduino
- Components necessaris
- Diagrama de circuits i connexions
- Programació I2C a STM32
- Explicació de la programació mestra STM32
- Explicació de la programació Slave Arduino
En els nostres tutorials anteriors, hem après sobre la comunicació SPI i I2C entre dues plaques Arduino. En aquest tutorial substituirem una placa Arduino per la placa Blue Pill que és STM32F103C8 i ens comunicarem amb la placa Arduino mitjançant el bus I2C.
STM32 té més funcions que la placa Arduino. Per tant, seria fantàstic conèixer la comunicació entre STM32 i Arduino utilitzant el bus SPI i I2C. En aquest tutorial, utilitzarem el bus I2C per a la comunicació entre Arduino i STM32F103C8 i coneixerem el bus SPI al proper tutorial. Per obtenir més informació sobre la placa STM32, consulteu altres projectes STM32.
STM32F103C8 I2C Visió general
Comparant I2C (Circuits integrats inter) a la placa STM32F103C8 Blue Pill amb Arduino Uno, veurem que Arduino té microcontrolador ATMEGA328 i que STM32F103C8 té ARM Cortex-M3. STM32 té dos busos I2C mentre que Arduino Uno només té un bus I2C i STM32 és més ràpid que Arduino.
Per obtenir més informació sobre la comunicació I2C, consulteu els nostres articles anteriors
- Com utilitzar I2C a Arduino: comunicació entre dues plaques Arduino
- Comunicació I2C amb microcontrolador PIC PIC16F877
- Interfície LCD 16X2 amb ESP32 mitjançant I2C
- Comunicació I2C amb MSP430 Launchpad
- Interfície LCD amb NodeMCU sense utilitzar I2C
- Com gestionar comunicacions múltiples (I2C SPI UART) en un sol programa d'arduino
Pins I2C a STM32F103C8
SDA: PB7 o PB9, PB11.
SCL: PB6 o PB8, PB10.

Pins I2C a Arduino
SDA: pin A4
SCL: pin A5

Components necessaris
- STM32F103C8
- Arduino Uno
- LED (2 números)
- Polsador (2 números)
- Resistències (4 números)
- Taula de pa
- Connexió de cables
Diagrama de circuits i connexions

La taula següent mostra la connexió entre STM32 Blue Pill i Arduino Uno per utilitzar el bus I2C. Requereix només dos cables.
|
STM32F103C8 |
Arduino |
Descripció del pin |
|
B7 |
A4 |
SDA |
|
B6 |
A5 |
SCL |
|
GND |
GND |
Terra |
Important
- No us oblideu de connectar l'Arduino GND i el STM32F103C8 GND.
- A continuació, connecteu una resistència de 10k cap avall als passadors del polsador de la placa per separat.
En aquest tutorial STM32 I2C configurarem el STM32F103C8 com a mestre i Arduino com a esclau. Ambdues taules s’uneixen amb un LED i un polsador per separat.
Per demostrar la comunicació I2C a STM32, controlem el LED mestre STM32 mitjançant el valor del botó polsador Arduino esclau i controlem el LED Arduino esclau mitjançant el valor del polsador mestre STM32F103C8. Aquests valors s’envien mitjançant un bus de comunicació I2C.
Programació I2C a STM32
La programació és similar al codi Arduino. El mateix
Aquest tutorial té dos programes, un per al mestre STM32 i un altre per a Arduino esclau. Al final d’aquest projecte es donen programes complets per a les dues parts amb un vídeo de demostració.
Explicació de la programació mestra STM32
A Master STM32 vegem què passa:
1. Primer de tot, hem d’incloure la biblioteca Wire i la biblioteca softwire per utilitzar les funcions de comunicació I2C a STM32F103C8.
#incloure
2. Configuració nul·la ()
- Comencem la comunicació en sèrie a Baud Rate 9600.
Serial.begin (9600);
- A continuació, iniciem la comunicació I2C al pin (B6, B7)
Wire.begin ();
3. En bucle buit ()
- Primer obtenim les dades del Slave Arduino, de manera que fem servir requestFrom () amb l’adreça slave 8 i sol·licitem un byte.
Wire.requestFrom (8,1);
El valor rebut es llegeix mitjançant Wire.read ()
byte a = Wire.read ();
- Depenent del valor rebut de l'esclau, el LED principal s'encén o s'apaga mitjançant digitalwrite al pin PA1 i també s'utilitza la impressió en sèrie per imprimir el valor en el monitor sèrie
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED principal activat"); } else { digitalWrite (LED, BAIX); Serial.println ("LED mestre apagat"); }
- A continuació, hem de llegir l'estat del pin PA0 que és el polsador mestre STM32.
int pinvalue = digitalRead (tecla de botó);
- A continuació, envieu el valor del pin segons la lògica, de manera que fem servir if condition i, a continuació, comencem la transmissió amb arduino esclau amb 8 com a adreça i, a continuació, escriviu el valor segons el valor d'entrada del polsador.
if (pinvalue == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Explicació de la programació Slave Arduino
1. Primer de tot, hem d’incloure la biblioteca Wire per utilitzar les funcions de comunicació I2C.
#incloure
2. Configuració nul·la ()
- Comencem la comunicació en sèrie a Baud Rate 9600.
Serial.begin (9600);
- A continuació, inicieu la comunicació I2C al pin (A4, A5) amb l'adreça esclava com a 8. Aquí és important especificar l'adreça esclava.
Wire.begin (8);
A continuació, hem de trucar a la funció Wire.onReceive quan l’esclau rep el valor del mestre i a la funció Wire.onRequest quan el valor de la sol·licitud del mestre l’esclau.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. A continuació, tenim dues funcions, una per a un esdeveniment de sol·licitud i una per a un esdeveniment de recepció
Per a sol·licitud Esdeveniment
Quan el valor principal de la sol·licitud STM32 de l'esclau s'executarà aquesta funció. Aquesta funció pren el valor d’entrada del polsador Slave Arduino i envia un byte (1 o 0) a Master STM32 segons el valor del polsador mitjançant Wire.write ().
void requestEvent () { valor int = digitalRead (botó); if (valor == ALT) { x = 1; } else { x = 0; } Wire.write (x); }
Per rebre un esdeveniment
Quan el Mestre envia dades a l'esclau amb l'adreça esclava (8), aquesta funció s'executarà. Aquesta funció llegeix el valor rebut del mestre i s'emmagatzema en una variable de tipus byte i, a continuació, utilitzeu if logic per activar o apagar el LED esclau en funció del valor rebut. Si el valor rebut és 1, el LED s’encén i el 0 s’apaga.
void receiveEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("LED esclau encès"); } else { digitalWrite (LED, BAIX); Serial.println ("LED esclau apagat"); } retard (500); }
Sortida
1. Quan premem el polsador a Master STM32, el LED connectat a Slave Ardiono s'encén (blanc).

2. Ara, quan premem el polsador al costat de l'esclau, el LED connectat a Master s'encén (vermell) i quan es deixa anar el botó, el LED s'apaga.

3. Quan els dos botons polsadors van prémer simultanewolsy, els dos LED brillen alhora i es mantenen activats fins que es premen els botons.

Així doncs, així es produeix la comunicació I2C a STM32. Ara podeu connectar qualsevol sensor I2C amb la placa STM32.
A continuació es mostra la codificació completa per a Master STM32 i Slave Arduino amb un vídeo de demostració
