- STM32F103C8 Общ преглед на I2C
- I2C щифтове в STM32F103C8
- I2C щифтове в Arduino
- Необходими компоненти
- Електрическа схема и връзки
- Програмиране на I2C в STM32
- Master STM32 Обяснение на програмирането
- Обяснение на програмирането на Slave Arduino
В предишните ни уроци научихме за SPI и I2C комуникацията между две Arduino платки. В този урок ще заменим една платка Arduino с платката Blue Pill, която е STM32F103C8 и ще комуникира с платката Arduino чрез I2C шина.
STM32 има повече функции от Arduino. Така че би било чудесно да научите за комуникацията между STM32 и Arduino чрез използване на SPI и I2C шина. В този урок ще използваме I2C шина за комуникация между Arduino и STM32F103C8 и ще научим за SPI шината в следващия урок. За да научите повече за STM32 платката, проверете други STM32 проекти.
STM32F103C8 Общ преглед на I2C
Сравнявайки I2C (Inter Integrated Circuits) в платката STM32F103C8 Blue Pill с Arduino Uno, тогава ще видим, че Arduino има ATMEGA328 микроконтролер в себе си, а STM32F103C8 има ARM Cortex-M3 в него. STM32 има две I2C шини, докато Arduino Uno има само една I2C шина и STM32 е по-бърз от Arduino.
За да научите повече за I2C комуникацията, вижте нашите предишни статии
- Как да използвам I2C в Arduino: Комуникация между две платки Arduino
- I2C комуникация с PIC микроконтролер PIC16F877
- Свързване на 16X2 LCD с ESP32 чрез I2C
- I2C комуникация с MSP430 Launchpad
- Взаимодействие на LCD с NodeMCU без използване на I2C
- Как да се справя с много комуникации (I2C SPI UART) в една програма на arduino
I2C щифтове в STM32F103C8
SDA: PB7 или PB9, PB11.
SCL: PB6 или PB8, PB10.
I2C щифтове в Arduino
SDA: A4 щифт
SCL: A5 щифт
Необходими компоненти
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- Бутон (2-Nos)
- Резистори (4-Nos)
- Макет
- Свързване на проводници
Електрическа схема и връзки
Следващата таблица показва връзката между STM32 Blue Pill и Arduino Uno за използване на I2C шина. Необходими са само два проводника.
STM32F103C8 |
Arduino |
Описание на щифта |
B7 |
A4 |
SDA |
В6 |
A5 |
SCL |
GND |
GND |
Земя |
Важно
- Не забравяйте да свържете заедно Arduino GND и STM32F103C8 GND.
- След това свържете издърпващ резистор от 10k към щифтовете на бутоните на двете платки поотделно.
В този урок за STM32 I2C ще конфигурираме STM32F103C8 като Master и Arduino като Slave. И двете платки са прикрепени с LED и бутон отделно.
За да демонстрираме I2C комуникация в STM32, ние контролираме главния светодиод STM32, като използваме подчинена стойност на бутон Arduino и контролираме подчинен Arduino LED, като използваме стойността на бутон STM32F103C8. Тези стойности се изпращат чрез I2C комуникационна шина.
Програмиране на I2C в STM32
Програмирането е подобно на кода на Arduino. Същото
Този урок има две програми - една за главен STM32 и друга за slave Arduino. Пълни програми за двете страни са дадени в края на този проект с демонстрационно видео.
Master STM32 Обяснение на програмирането
В Master STM32 нека видим какво се случва:
1. Преди всичко трябва да включим библиотеката Wire и библиотеката на softwire за използване на комуникационни функции I2C в STM32F103C8.
#include
2. При настройка за невалидност ()
- Започваме серийна комуникация със скорост на предаване 9600.
Serial.begin (9600);
- След това стартираме комуникацията I2C на пин (B6, B7)
Wire.begin ();
3. В цикъл Void ()
- Първо получаваме данните от Slave Arduino, така че използваме requestFrom () с подчинен адрес 8 и искаме един байт.
Wire.requestFrom (8,1);
Получената стойност се чете с помощта на Wire.read ()
байт a = Wire.read ();
- В зависимост от получената стойност от подчиненото устройство, главният светодиод се включва или изключва чрез цифрово писане на пин PA1, а също така сериен печат се използва за отпечатване на стойност в сериен монитор
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Master LED OFF"); }
- След това трябва да прочетем състоянието на щифта PA0, който е главният бутон STM32.
int pinvalue = digitalRead (бутон);
- След това изпратете стойността на пина в съответствие с логиката, така че ние използваме условието if и след това започваме предаването с подчинен arduino с 8 като адрес и след това записваме стойността според стойността на входния бутон.
ако (pinvalue == HIGH) { x = 1; } иначе { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Обяснение на програмирането на Slave Arduino
1. На първо място трябва да включим Wire библиотека за използване на комуникационни функции I2C.
#include
2. При настройка за невалидност ()
- Започваме серийна комуникация със скорост на предаване 9600.
Serial.begin (9600);
- След това стартирайте I2C комуникацията на пин (A4, A5) с подчинен адрес като 8. Тук е важно да посочите подчинения адрес.
Wire.begin (8);
След това трябва да извикаме функцията Wire.onReceive, когато Slave получава стойност от master и Call.onRequest извиква функцията, когато Master заявява стойност от Slave.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. След това имаме две функции една за събитие за заявка и една за събитие за получаване
За заявка Събитие
Когато Master STM32 иска стойност от подчинен, тази функция ще се изпълни. Тази функция взема входна стойност от бутон Slave Arduino и изпраща байт (1 или 0) към Master STM32 според стойността на бутона, като използва Wire.write ().
void requestEvent () { int value = digitalRead (buttonpin); ако (стойност == HIGH) { x = 1; } иначе { x = 0; } Wire.write (x); }
За събитие за получаване
Когато Master изпраща данни на slave с slave адрес (8), тази функция ще се изпълни. Тази функция чете получената стойност от master и съхранява в променлива от байт тип и след това използва if логика, за да включи или изключи slave LED в зависимост от получената стойност. Ако получената стойност е 1, тогава светодиодът се включва и за 0 светодиода се изключва.
void receiveEvent (int howMany) { байт a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED ON"); } else { digitalWrite (LED, LOW); Serial.println ("Slave LED OFF"); } закъснение (500); }
Изход
1. Когато натиснем бутона в Master STM32, светодиодът, свързан към Slave Ardiono, се включва (бял).
2. Сега, когато натиснем бутона от страна на Slave, светодиодът, свързан към Master, се включва (червен) и когато бутонът се освободи, LED се изключва.
3. Когато двата бутона са едновременно натиснати едновременно, и двата светодиода светят едновременно и остават включени, докато бутоните не бъдат натиснати
Така че, как се осъществява I2C комуникацията в STM32. Сега можете да свържете всеки I2C сензор с платка STM32.
Пълното кодиране за Master STM32 и Slave Arduino е дадено по-долу с демонстрационно видео