- Przegląd STM32F103C8 I2C
- Piny I2C w STM32F103C8
- Piny I2C w Arduino
- Wymagane składniki
- Schemat obwodu i połączenia
- Programowanie I2C w STM32
- Objaśnienie programowania Master STM32
- Objaśnienie programowania Slave Arduino
W naszych poprzednich samouczkach dowiedzieliśmy się o komunikacji SPI i I2C między dwoma płytami Arduino. W tym samouczku wymienimy jedną płytkę Arduino na płytkę Blue Pill, czyli STM32F103C8 i będziemy komunikować się z płytą Arduino za pomocą magistrali I2C.
STM32 ma więcej funkcji niż płyta Arduino. Byłoby więc wspaniale poznać komunikację między STM32 a Arduino za pomocą magistrali SPI i I2C. W tym samouczku użyjemy magistrali I2C do komunikacji między Arduino a STM32F103C8, ao magistrali SPI dowiemy się w następnym samouczku. Aby dowiedzieć się więcej o płycie STM32, sprawdź inne projekty STM32.
Przegląd STM32F103C8 I2C
Porównując I2C (Inter Integrated Circuits) w płytce Blue Pill STM32F103C8 z Arduino Uno, zobaczymy, że Arduino ma w sobie mikrokontroler ATMEGA328, a STM32F103C8 ma w sobie ARM Cortex-M3. STM32 ma dwie magistrale I2C, podczas gdy Arduino Uno ma tylko jedną magistralę I2C, a STM32 jest szybszy niż Arduino.
Aby dowiedzieć się więcej o komunikacji I2C, zapoznaj się z naszymi poprzednimi artykułami
- Jak korzystać z I2C w Arduino: Komunikacja między dwoma płytami Arduino
- Komunikacja I2C z mikrokontrolerem PIC PIC16F877
- Połączenie wyświetlacza LCD 16X2 z ESP32 za pomocą I2C
- Komunikacja I2C z MSP430 Launchpad
- Łączenie LCD z NodeMCU bez użycia I2C
- Jak obsłużyć komunikację multi (I2C SPI UART) w jednym programie arduino
Piny I2C w STM32F103C8
SDA: PB7 lub PB9, PB11.
SCL: PB6 lub PB8, PB10.
Piny I2C w Arduino
SDA: pin A4
SCL: pin A5
Wymagane składniki
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- Przycisk (2-Nos)
- Rezystory (4-Nos)
- Płytka prototypowa
- Podłączanie przewodów
Schemat obwodu i połączenia
Poniższa tabela przedstawia połączenie między STM32 Blue Pill i Arduino Uno w celu korzystania z magistrali I2C. Wymaga tylko dwóch przewodów.
STM32F103C8 |
Arduino |
Opis pinów |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Ziemia |
Ważny
- Nie zapomnij o połączeniu Arduino GND i STM32F103C8 GND.
- Następnie podłącz rezystor pull down 10k do styków przycisku na obu płytkach oddzielnie.
W tym samouczku STM32 I2C skonfigurujemy STM32F103C8 jako Master i Arduino jako Slave. Obie płytki są dołączone oddzielnie za pomocą diody LED i przycisku.
Aby zademonstrować komunikację I2C w STM32, sterujemy diodą master STM32 za pomocą wartości przycisku slave Arduino i kontrolujemy diodę LED Arduino slave za pomocą wartości przycisku master STM32F103C8. Wartości te są przesyłane przez magistralę komunikacyjną I2C.
Programowanie I2C w STM32
Programowanie jest podobne do kodu Arduino. To samo
Ten samouczek ma dwa programy, jeden dla master STM32, a drugi dla slave Arduino. Kompletne programy dla obu stron są podane na końcu tego projektu wraz z filmem demonstracyjnym.
Objaśnienie programowania Master STM32
W Master STM32 zobaczmy, co się dzieje:
1. Przede wszystkim musimy dołączyć bibliotekę Wire i bibliotekę softwire do korzystania z funkcji komunikacyjnych I2C w STM32F103C8.
#zawierać
2. In void setup ()
- Rozpoczynamy komunikację szeregową z prędkością transmisji 9600.
Serial.begin (9600);
- Następnie rozpoczynamy komunikację I2C na pinie (B6, B7)
Wire.begin ();
3. W pętli Void ()
- Najpierw pobieramy dane z Slave Arduino, więc używamy requestFrom () z adresem slave 8 i żądamy jednego bajtu.
Wire.requestFrom (8,1);
Odebrana wartość jest odczytywana za pomocą Wire.read ()
byte a = Wire.read ();
- W zależności od wartości odebranej z urządzenia slave, dioda LED Master jest włączana lub wyłączana za pomocą cyfrowego zapisu na pinie PA1, a także druk szeregowy służy do drukowania wartości na monitorze szeregowym
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Dioda główna włączona"); } else { digitalWrite (LED, LOW); Serial.println ("Główna dioda LED wyłączona"); }
- Następnie należy odczytać stan pinu PA0 czyli przycisku master STM32.
int pinvalue = digitalRead (przypinka);
- Następnie wyślij wartość pinu zgodnie z logiką, więc używamy warunku if , a następnie rozpoczynamy transmisję z adresem slave arduino z 8, a następnie zapisujemy wartość zgodnie z wartością wejściową przycisku.
if (pinvalue == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Objaśnienie programowania Slave Arduino
1. Przede wszystkim musimy dołączyć bibliotekę Wire do korzystania z funkcji komunikacyjnych I2C.
#zawierać
2. In void setup ()
- Rozpoczynamy komunikację szeregową z prędkością transmisji 9600.
Serial.begin (9600);
- Następnie rozpocznij komunikację I2C na pinie (A4, A5) z adresem slave 8. Tutaj ważne jest, aby określić adres slave.
Wire.begin (8);
Następnie musimy wywołać funkcję Wire.onReceive, gdy Slave otrzyma wartość od mastera i funkcję Wire.onRequest, gdy Master zażąda wartości od Slave.
Wire.onReceive (acceptEvent); Wire.onRequest (requestEvent);
3. Następnie mamy dwie funkcje, jedną dla zdarzenia żądania, a drugą dla zdarzenia odbioru
Na żądanie Event
Gdy Master STM32 zażąda wartości od slave, ta funkcja zostanie wykonana. Ta funkcja pobiera wartość wejściową z przycisku Slave Arduino i wysyła bajt (1 lub 0) do Master STM32 zgodnie z wartością przycisku za pomocą Wire.write ().
void requestEvent () { int value = digitalRead (buttonpin); if (wartość == WYSOKA) { x = 1; } else { x = 0; } Wire.write (x); }
Odbierz wydarzenie
Gdy Master wysyła dane do slave'a z adresem slave (8), ta funkcja zostanie wykonana. Ta funkcja odczytuje odebraną wartość z mastera i zapisuje w zmiennej typu bajt, a następnie używa logiki if do włączania lub wyłączania diody LED slave w zależności od otrzymanej wartości. Jeżeli otrzymana wartość to 1 to dioda zaświeci się a dla 0 dioda gaśnie.
void otrzymaszEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Dioda slave włączona"); } else { digitalWrite (LED, LOW); Serial.println ("Dioda slave wyłączona"); } opóźnienie (500); }
Wynik
1. Po naciśnięciu przycisku na Master STM32, dioda LED podłączona do Slave Ardiono zaświeci się (biała).
2. Teraz, kiedy wciśniemy przycisk po stronie Slave, dioda LED podłączona do Master zapali się (czerwona), a kiedy przycisk zostanie zwolniony, dioda LED zgaśnie.
3. Gdy oba przyciski zostaną wciśnięte jednocześnie, obie diody LED zaświecą się w tym samym czasie i pozostaną włączone do momentu naciśnięcia przycisków
Tak więc w STM32 odbywa się komunikacja I2C. Teraz możesz połączyć dowolny czujnik I2C z płytą STM32.
Pełne kodowanie dla Master STM32 i Slave Arduino jest podane poniżej wraz z filmem demonstracyjnym