- STM32F103C8 I2C Översikt
- I2C-stift i STM32F103C8
- I2C-stift i Arduino
- Komponenter krävs
- Kretsschema och anslutningar
- I2C-programmering i STM32
- Master STM32 Programmering Förklaring
- Slave Arduino Programmering Förklaring
I våra tidigare handledning har vi lärt oss om SPI- och I2C-kommunikation mellan två Arduino-kort. I den här handledningen kommer vi att ersätta ett Arduino-kort med Blue Pill-kortet som är STM32F103C8 och kommunicera med Arduino-kortet med I2C-buss.
STM32 har fler funktioner än Arduino-kortet. Så det skulle vara fantastiskt att lära sig mer om kommunikation mellan STM32 och Arduino med SPI & I2C-buss. I denna handledning använder vi I2C-buss för kommunikation mellan Arduino och STM32F103C8, och kommer att lära oss om SPI-buss i nästa handledning. För att veta mer om STM32-kortet, kolla in andra STM32-projekt.
STM32F103C8 I2C Översikt
Jämförelse av I2C (interintegrerade kretsar) i STM32F103C8 Blue Pill-kort med Arduino Uno, då ser vi att Arduino har ATMEGA328 mikrokontroller i sig, och STM32F103C8 har ARM Cortex-M3 i sig. STM32 har två I2C-bussar medan Arduino Uno bara har en I2C-buss och STM32 är snabbare än Arduino.
För att lära dig mer om I2C-kommunikation, se våra tidigare artiklar
- Hur man använder I2C i Arduino: Kommunikation mellan två Arduino-kort
- I2C-kommunikation med PIC-mikrokontroller PIC16F877
- Gränssnitt 16X2 LCD med ESP32 med I2C
- I2C-kommunikation med MSP430 Launchpad
- Gränssnitt LCD med NodeMCU utan att använda I2C
- Hur man hanterar multikommunikation (I2C SPI UART) i ett enda program av arduino
I2C-stift i STM32F103C8
SDA: PB7 eller PB9, PB11.
SCL: PB6 eller PB8, PB10.
I2C-stift i Arduino
SDA: A4-stift
SCL: A5-stift
Komponenter krävs
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- Tryckknapp (2-Nos)
- Motstånd (4-Nos)
- Bakbord
- Anslutande ledningar
Kretsschema och anslutningar
Följande tabell visar anslutningen mellan STM32 Blue Pill och Arduino Uno för användning av I2C-buss. Det kräver bara två ledningar.
STM32F103C8 |
Arduino |
Stiftbeskrivning |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Jord |
Viktig
- Glöm inte att ansluta Arduino GND och STM32F103C8 GND tillsammans.
- Anslut sedan ett pull down-motstånd på 10k till tryckknappstiften på båda korten separat.
I denna STM32 I2C-handledning konfigurerar vi STM32F103C8 som Master och Arduino som Slave. Båda brädorna är fästa med en LED och en tryckknapp separat.
För att demonstrera I2C-kommunikation i STM32 kontrollerar vi master STM32 LED med hjälp av slav Arduino tryckknappsvärde och styr slav Arduino LED med master STM32F103C8 tryckknappsvärde. Dessa värden skickas via I2C-kommunikationsbuss.
I2C-programmering i STM32
Programmeringen liknar Arduino-koden. Det samma
Denna handledning har två program, ett för master STM32 och ett för slav Arduino. Kompletta program för båda sidor ges i slutet av detta projekt med en demonstrationsvideo.
Master STM32 Programmering Förklaring
Låt oss se vad som händer i Master STM32:
1. Först och främst måste vi inkludera Wire-biblioteket och softwire-biblioteket för att använda I2C-kommunikationsfunktioner i STM32F103C8.
#omfatta
2. I ogiltig installation ()
- Vi börjar seriekommunikation med överföringshastighet 9600.
Serial.begin (9600);
- Därefter startar vi I2C-kommunikationen vid stift (B6, B7)
Wire.begin ();
3. I Void loop ()
- Först får vi data från Slave Arduino så vi använder requestFrom () med slavadressen 8 och vi begär en byte.
Wire.requestFrom (8,1);
Det mottagna värdet läses med Wire.read ()
byte a = Wire.read ();
- Beroende på det mottagna värdet från slaven tänds eller släcks Master-lysdioden med digitalwrite vid stift PA1 och seriell utskrift används för att skriva ut värde i seriell bildskärm
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED ON"); } annat { digitalWrite (LED, LOW); Serial.println ("Master LED OFF"); }
- Därefter måste vi läsa status för stiftet PA0 som är master STM32-tryckknappen.
int pinvalue = digitalRead (buttonpin);
- Nästa skicka stiftvärdet enligt logiken, så vi använder if villkor och börjar sedan överföringen med slavarduino med 8 som adress och skriv sedan värdet enligt tryckknappens ingångsvärde.
if (värde == HÖG) { x = 1; } annat { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Slave Arduino Programmering Förklaring
1. Först och främst måste vi inkludera Wire-biblioteket för att använda I2C-kommunikationsfunktioner.
#omfatta
2. I ogiltig installation ()
- Vi börjar seriekommunikation med överföringshastighet 9600.
Serial.begin (9600);
- Starta sedan I2C-kommunikationen vid stift (A4, A5) med slavadress som 8. Här är det viktigt att ange slavadressen.
Wire.begin (8);
Därefter måste vi ringa Wire.onReceive- funktionen när Slave får värde från master och Wire.onRequest- funktionsanrop när Master-begäran har värde från Slave.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. Därefter har vi två funktioner en för begivenhetshändelse och en för mottagningshändelse
För begäran Event
När Master STM32 begär värde från slav kommer denna funktion att köras. Denna funktion tar inmatningsvärde från Slave Arduino-tryckknappen och skickar en byte (1 eller 0) till Master STM32 enligt tryckknappsvärdet med Wire.write ().
void requestEvent () { int value = digitalRead (buttonpin); om (värde == HÖG) { x = 1; } annat { x = 0; } Wire.write (x); }
För mottagningshändelse
När Master skickar data till slav med slavadress (8) kommer denna funktion att utföras. Denna funktion läser det mottagna värdet från master och lagrar i en variabel av typbyte och använd sedan om logik för att slå på eller stänga av slav-LED beroende på det mottagna värdet. Om det mottagna värdet är 1 tänds lysdioden PÅ och för 0 lyser den av.
ogiltigt mottagandeEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED ON"); } annat { digitalWrite (LED, LOW); Serial.println ("Slave LED OFF"); } fördröjning (500); }
Produktion
1. När vi trycker på tryckknappen på Master STM32 tänds lysdioden ansluten till Slave Ardiono (vit).
2. När vi nu trycker på tryckknappen på slavsidan tänds lysdioden som är ansluten till master (röd) och när knappen släpps släcks lysdioden.
3. När båda tryckknapparna trycktes in samtidigt, lyser båda lysdioderna samtidigt och förblir PÅ tills knapparna trycks in
Så det här är I2C-kommunikation som sker i STM32. Nu kan du ansluta vilken I2C-sensor som helst med STM32-kortet.
Den fullständiga kodningen för Master STM32 och Slave Arduino ges nedan med en demonstrationsvideo