- STM32F103C8 I2C Overzicht
- I2C-pinnen in STM32F103C8
- I2C-pinnen in Arduino
- Componenten vereist
- Schakelschema en aansluitingen
- I2C-programmering in STM32
- Master STM32 Programmering Toelichting
- Slave Arduino Programmering Uitleg
In onze vorige tutorials hebben we geleerd over SPI- en I2C-communicatie tussen twee Arduino-boards. In deze tutorial zullen we één Arduino-bord vervangen door het Blue Pill-bord dat STM32F103C8 is en zal communiceren met het Arduino-bord via de I2C-bus.
STM32 heeft meer functies dan een Arduino-bord. Het zou dus geweldig zijn om meer te weten te komen over de communicatie tussen STM32 en Arduino door gebruik te maken van SPI & I2C-bus. In deze tutorial zullen we de I2C-bus gebruiken voor communicatie tussen Arduino en STM32F103C8, en zullen we in de volgende tutorial meer leren over SPI-bus. Bekijk andere STM32-projecten voor meer informatie over het STM32-bord.
STM32F103C8 I2C Overzicht
Als we I2C (Inter Integrated Circuits) in STM32F103C8 Blue Pill-bord vergelijken met Arduino Uno, dan zullen we zien dat Arduino een ATMEGA328-microcontroller bevat en STM32F103C8 ARM Cortex-M3 erin. STM32 heeft twee I2C-bussen terwijl Arduino Uno slechts één I2C-bus heeft en STM32 sneller is dan Arduino.
Raadpleeg onze vorige artikelen voor meer informatie over I2C-communicatie
- Hoe I2C in Arduino te gebruiken: communicatie tussen twee Arduino-kaarten
- I2C communicatie met PIC Microcontroller PIC16F877
- 16X2 LCD-interface met ESP32 met I2C
- I2C-communicatie met MSP430 Launchpad
- Interfacing LCD met NodeMCU zonder I2C te gebruiken
- Hoe om te gaan met multi-communicatie (I2C SPI UART) in een enkel programma van arduino
I2C-pinnen in STM32F103C8
SDA: PB7 of PB9, PB11.
SCL: PB6 of PB8, PB10.
I2C-pinnen in Arduino
SDA: A4-speld
SCL: A5-speld
Componenten vereist
- STM32F103C8
- Arduino Uno
- LED (2-nummers)
- Drukknop (2-nummers)
- Weerstanden (4-nrs)
- Breadboard
- Verbindingsdraden
Schakelschema en aansluitingen
De volgende tabel toont de verbinding tussen STM32 Blue Pill en Arduino Uno voor het gebruik van de I2C-bus. Het vereist slechts twee draden.
STM32F103C8 |
Arduino |
Pin Beschrijving |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Grond |
Belangrijk
- Vergeet niet om de Arduino GND en STM32F103C8 GND met elkaar te verbinden.
- Sluit vervolgens een Pull-down weerstand van 10k aan op de drukknoppennen van beide printplaten afzonderlijk.
In deze STM32 I2C-tutorial zullen we de STM32F103C8 configureren als Master en Arduino als Slave. Beide borden zijn afzonderlijk bevestigd met een LED en een drukknop.
Om I2C-communicatie in STM32 te demonstreren, besturen we de master STM32 LED door de slaaf Arduino-drukknopwaarde te gebruiken en de slaaf Arduino LED te besturen door de master STM32F103C8-drukknopwaarde te gebruiken. Deze waarden worden verzonden via de I2C-communicatiebus.
I2C-programmering in STM32
De programmering is vergelijkbaar met de Arduino-code. Hetzelfde
Deze tutorial heeft twee programma's een voor master STM32 en een voor slave Arduino. Aan het einde van dit project worden complete programma's voor beide kanten gegeven met een demonstratievideo.
Master STM32 Programmering Toelichting
Laten we in Master STM32 kijken wat er gebeurt:
1. Allereerst moeten we de Wire-bibliotheek en de softwire-bibliotheek opnemen voor het gebruik van I2C-communicatiefuncties in STM32F103C8.
# omvatten
2. In ongeldige opstelling ()
- We starten seriële communicatie met een baudrate van 9600.
Serial.begin (9600);
- Vervolgens starten we de I2C-communicatie op pin (B6, B7)
Wire.begin ();
3. In ongeldige lus ()
- Eerst krijgen we de gegevens van de Slave Arduino, dus gebruiken we requestFrom () met het slave-adres 8 en we vragen om één byte.
Wire.requestFrom (8,1);
De ontvangen waarde wordt gelezen met Wire.read ()
byte a = Wire.read ();
- Afhankelijk van de ontvangen waarde van de slaaf, wordt de Master-LED AAN of UIT gezet met behulp van digitalwrite op pin PA1 en wordt ook een seriële print gebruikt om de waarde in een seriële monitor af te drukken
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED AAN"); } else { digitalWrite (LED, LOW); Serial.println ("Master LED UIT"); }
- Vervolgens moeten we de status lezen van de pin PA0 die de master STM32-drukknop is.
int pinvalue = digitalRead (buttonpin);
- Stuur vervolgens de pin-waarde volgens de logica, dus we gebruiken if- conditie en beginnen dan de verzending met slave arduino met 8 als adres en schrijven dan de waarde volgens de invoerwaarde van de drukknop.
if (pinvalue == HIGH) { x = 1; } anders { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Slave Arduino Programmering Uitleg
1. Allereerst moeten we de Wire-bibliotheek opnemen voor het gebruik van I2C-communicatiefuncties.
# omvatten
2. In ongeldige opstelling ()
- We starten seriële communicatie met een baudrate van 9600.
Serial.begin (9600);
- Start vervolgens de I2C-communicatie op pin (A4, A5) met het slave-adres als 8. Hier is het belangrijk om het slave-adres op te geven.
Wire.begin (8);
Vervolgens moeten we de functie Wire.onReceive aanroepen wanneer Slave waarde ontvangt van master en Wire.onRequest- functieaanroep wanneer Master waarde opvraagt bij Slave.
Wire.onReceive (ontvangEvent); Wire.onRequest (requestEvent);
3. Vervolgens hebben we twee functies, een voor verzoekgebeurtenis en een voor ontvanggebeurtenis
Voor aanvraag Evenement
Wanneer Master STM32 waarde opvraagt bij de slaaf, zal deze functie worden uitgevoerd. Deze functie neemt de invoerwaarde van de Slave Arduino-drukknop en stuurt een byte (1 of 0) naar Master STM32 volgens de drukknopwaarde met behulp van Wire.write ().
void requestEvent () { int waarde = digitalRead (buttonpin); if (waarde == HIGH) { x = 1; } anders { x = 0; } Wire.write (x); }
Voor ontvangen evenement
Wanneer Master data naar slave stuurt met slave-adres (8), wordt deze functie uitgevoerd. Deze functie leest de ontvangen waarde van de master en slaat deze op in een variabele van het type byte en gebruikt vervolgens als logica om de slaaf-LED AAN of UIT te zetten, afhankelijk van de ontvangen waarde. Als de ontvangen waarde 1 is, gaat de LED AAN en voor 0 gaat de LED UIT.
void receEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED AAN"); } else { digitalWrite (LED, LOW); Serial.println ("Slave LED UIT"); } vertraging (500); }
Uitvoer
1. Wanneer we op de drukknop op Master STM32 drukken, gaat de LED die is aangesloten op Slave Ardiono AAN (wit).
2. Als we nu op de drukknop aan de Slave-zijde drukken, gaat de LED die op de Master is aangesloten AAN (rood) en als de knop wordt losgelaten, gaat de LED UIT.
3. Wanneer beide drukknoppen gelijktijdig worden ingedrukt, gloeien beide LED's tegelijkertijd en blijven AAN totdat de knoppen worden ingedrukt
Dit is dus hoe I2C-communicatie plaatsvindt in STM32. Nu kunt u elke I2C-sensor verbinden met de STM32-kaart.
De volledige codering voor Master STM32 en Slave Arduino wordt hieronder gegeven met een demonstratievideo