- STM32F103C8 I2C Обзор
- Контакты I2C в STM32F103C8
- Контакты I2C в Arduino
- Необходимые компоненты
- Принципиальная схема и подключения
- Программирование I2C в STM32
- Пояснение к программированию Master STM32
- Объяснение программирования подчиненного устройства 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 с ESP32 с использованием I2C
- Связь I2C с MSP430 Launchpad
- Взаимодействие ЖК-дисплея с NodeMCU без использования I2C
- Как управлять несколькими коммуникациями (I2C SPI UART) в одной программе Arduino
Контакты I2C в STM32F103C8
SDA: PB7 или PB9, PB11.
SCL: PB6 или PB8, PB10.
Контакты I2C в Arduino
SDA: контакт A4
SCL: контакт A5
Необходимые компоненты
- STM32F103C8
- Ардуино Уно
- Светодиод (2 шт.)
- Кнопка (2 шт.)
- Резисторы (4 шт.)
- Макетная плата
- Подключение проводов
Принципиальная схема и подключения
В следующей таблице показано соединение между STM32 Blue Pill и Arduino Uno для использования шины I2C. Для этого требуется всего два провода.
STM32F103C8 |
Ардуино |
Описание контакта |
B7 |
A4 |
ПДД |
B6 |
A5 |
SCL |
GND |
GND |
Земля |
Важный
- Не забудьте соединить Arduino GND и STM32F103C8 GND вместе.
- Затем подключите резистор Pull down на 10 кОм к контактам кнопок на обеих платах по отдельности.
В этом руководстве по STM32 I2C мы настроим STM32F103C8 как ведущий, а Arduino как ведомый. К обеим платам прилагаются отдельно светодиод и кнопка.
Чтобы продемонстрировать связь I2C в STM32, мы управляем ведущим светодиодом STM32, используя значение кнопки ведомого устройства Arduino, и управляем светодиодом ведомого устройства Arduino, используя значение кнопки ведущего устройства STM32F103C8. Эти значения отправляются через коммуникационную шину I2C.
Программирование I2C в STM32
Программирование похоже на код Arduino. Такой же
В этом руководстве есть две программы: одна для главного STM32, а другая - для подчиненного Arduino. Полные программы для обеих сторон представлены в конце этого проекта с демонстрационным видео.
Пояснение к программированию Master STM32
В Master STM32 посмотрим, что происходит:
1. Прежде всего нам необходимо включить библиотеку Wire и библиотеку softwire для использования функций связи I2C в STM32F103C8.
#включают
2. В void setup ()
- Мы запускаем последовательную связь со скоростью 9600 бод.
Serial.begin (9600);
- Затем мы запускаем связь I2C на контакте (B6, B7).
Wire.begin ();
3. В цикле Void ()
- Сначала мы получаем данные от подчиненного устройства Arduino, поэтому мы используем requestFrom () с подчиненным адресом 8 и запрашиваем один байт.
Wire.requestFrom (8,1);
Полученное значение считывается с помощью Wire.read ()
байт a = Wire.read ();
- В зависимости от значения, полученного от ведомого, главный светодиод включается или выключается с помощью цифровой записи на выводе PA1, а также последовательная печать используется для печати значения в последовательном мониторе.
если (a == 1) { digitalWrite (LED, HIGH); Serial.println («Главный светодиод горит»); } else { digitalWrite (светодиод, НИЗКИЙ); Serial.println («Главный светодиод выключен»); }
- Затем нам нужно прочитать состояние вывода PA0, который является главной кнопкой STM32.
int pinvalue = digitalRead (кнопка);
- Затем отправьте значение вывода в соответствии с логикой, поэтому мы используем условие if, а затем начинаем передачу с ведомого Arduino с 8 в качестве адреса, а затем записываем значение в соответствии со значением ввода кнопки.
если (pinvalue == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Объяснение программирования подчиненного устройства Arduino
1. Прежде всего нам нужно включить библиотеку Wire для использования функций связи I2C.
#включают
2. В void setup ()
- Мы запускаем последовательную связь со скоростью 9600 бод.
Serial.begin (9600);
- Затем запустите связь I2C на выводе (A4, A5) с адресом ведомого как 8. Здесь важно указать адрес ведомого.
Wire.begin (8);
Затем нам нужно вызвать функцию Wire.onReceive, когда Slave получает значение от мастера, и вызов функции Wire.onRequest, когда Master запрашивает значение от Slave.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. Далее у нас есть две функции: одна для события запроса и одна для события получения.
По запросу Событие
Когда Master STM32 запрашивает значение от ведомого, эта функция будет выполняться. Эта функция принимает входное значение от кнопки Slave Arduino и отправляет байт (1 или 0) в Master STM32 в соответствии со значением кнопки с помощью Wire.write ().
void requestEvent () { значение int = digitalRead (кнопка); если (значение == ВЫСОКИЙ) { х = 1; } else { x = 0; } Wire.write (x); }
Для получения события
Когда мастер отправляет данные на подчиненное устройство с адресом подчиненного устройства (8), эта функция будет выполняться. Эта функция считывает полученное значение от ведущего и сохраняет его в переменной типа byte, а затем использует логику if для включения или выключения светодиодного индикатора ведомого в зависимости от полученного значения. Если получено значение 1, то светодиод включается, а при 0 светодиод гаснет.
void receiveEvent (int howMany) { байт = Wire.read (); если (a == 1) { digitalWrite (LED, HIGH); Serial.println («Подчиненный светодиод включен»); } else { digitalWrite (светодиод, НИЗКИЙ); Serial.println («Светодиод ведомого выключен»); } задержка (500); }
Вывод
1. Когда мы нажимаем кнопку на Master STM32, светодиод, подключенный к Slave Ardiono, включается (белый).
2. Теперь, когда мы нажимаем кнопку на стороне Slave, светодиод, подключенный к Master, включается (красный), а когда кнопка отпускается, светодиод гаснет.
3. Когда обе кнопки нажимаются одновременно, оба светодиода светятся одновременно и остаются включенными до тех пор, пока кнопки не будут нажаты.
Вот как происходит коммуникация I2C в STM32. Теперь вы можете подключить любой датчик I2C к плате STM32.
Полное кодирование для Master STM32 и Slave Arduino приведено ниже с демонстрационным видео.