- STM32F103C8 Огляд I2C
- I2C-шпильки в STM32F103C8
- I2C шпильки в Arduino
- Потрібні компоненти
- Схема та з'єднання
- Програмування I2C в STM32
- Основне програмування 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 (інтегральні мікросхеми) на платі STM32F103C8 Blue Pill з Arduino Uno, ми побачимо, що в Arduino є мікроконтролер ATMEGA328, а в STM32F103C8 ARM Cortex-M3. STM32 має дві шини I2C, тоді як Arduino Uno має лише одну шину I2C, а STM32 швидше, ніж Arduino.
Щоб дізнатись більше про зв'язок I2C, зверніться до наших попередніх статей
- Як використовувати I2C в Arduino: Зв'язок між двома платами Arduino
- Зв'язок I2C з мікроконтролером PIC16F877
- Зв'язок РК-дисплея 16X2 з ESP32 за допомогою I2C
- Зв'язок I2C з пусковою панеллю MSP430
- Зв'язок РК з 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
- Світлодіод (2-Ні)
- Кнопка (2-Ні)
- Резистори (4-ні)
- Макет
- Підключення проводів
Схема та з'єднання
У таблиці нижче показано зв’язок між STM32 Blue Pill та Arduino Uno для використання шини I2C. Для цього потрібно всього два дроти.
STM32F103C8 |
Ардуїно |
Опис штифта |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Земля |
Важливо
- Не забудьте з'єднати GND Arduino та STM32F103C8 GND разом.
- Потім підключіть висувний резистор 10k до штифтів кнопки на обох платах окремо.
У цьому посібнику для STM32 I2C ми налаштуємо STM32F103C8 як ведучого, а Arduino як підлеглого. Обидві дошки прикріплені світлодіодом та кнопкою окремо.
Щоб продемонструвати зв'язок I2C у STM32, ми управляємо головним світлодіодом STM32, використовуючи значення керованої кнопки Arduino, а керований індикатор slave Arduino використовуємо значення основного кнопки STM32F103C8. Ці значення надсилаються через шину зв'язку I2C.
Програмування I2C в STM32
Програмування схоже на код Arduino. Так само
Цей підручник має дві програми - одну для майстра STM32 та іншу для підлеглого Arduino. Повні програми для обох сторін наведені в кінці цього проекту з демонстраційним відео.
Основне програмування STM32 Пояснення
У Master STM32 давайте подивимося, що відбувається:
1. Перш за все нам потрібно включити в STM32F103C8 бібліотеку Wire і бібліотеку програмного забезпечення для використання функцій зв'язку I2C.
#включати
2. Налаштування void ()
- Ми починаємо послідовний зв'язок зі швидкістю передачі даних 9600.
Serial.begin (9600);
- Далі ми починаємо зв'язок I2C на виводі (B6, B7)
Wire.begin ();
3. У циклі Void ()
- Спочатку ми отримуємо дані від веденого 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 (світлодіод, НИЗЬКИЙ); 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 ();
Пояснення програмування підлеглого Arduino
1. Перш за все нам потрібно включити бібліотеку Wire для використання функцій зв'язку I2C.
#включати
2. Налаштування void ()
- Ми починаємо послідовний зв'язок зі швидкістю передачі даних 9600.
Serial.begin (9600);
- Далі розпочніть зв'язок I2C на виводі (A4, A5) з адресою веденого як 8. Тут важливо вказати адресу веденого пристрою.
Wire.begin (8);
Далі нам потрібно викликати функцію Wire.onReceive, коли ведений отримує значення від ведучого, і виклик функції Wire.onRequest, коли головне запитує значення від веденого.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. Далі ми маємо дві функції: одну для події запиту та одну для події отримання
За запитом Подія
Коли Master STM32 запитує значення від веденого, ця функція буде виконана. Ця функція приймає вхідне значення від кнопки Slave Arduino і надсилає байт (1 або 0) до Master STM32 відповідно до значення кнопки за допомогою Wire.write ().
void requestEvent () { int value = digitalRead (buttonpin); якщо (значення == ВИСОКО) { x = 1; } ще { x = 0; } Wire.write (x); }
Для отримання події
Коли ведучий надсилає дані веденому з веденою адресою (8), ця функція буде виконана. Ця функція зчитує отримане значення з ведучого і зберігає у змінну байта типу, а потім використовує if логіку, щоб увімкнути або вимкнути підлеглий світлодіод залежно від отриманого значення. Якщо отримане значення дорівнює 1, тоді світлодіод вмикається, а для 0 світлодіод вимикається.
void receiveEvent (int howMany) { байт a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Ведомий світлодіод увімкнено"); } else { digitalWrite (світлодіод, НИЗЬКИЙ); Serial.println ("Slave LED OFF"); } затримка (500); }
Вихідні дані
1. Коли ми натискаємо кнопку на Master STM32, світлодіод, підключений до Slave Ardiono, вмикається (білий).
2. Тепер, коли ми натискаємо кнопку на стороні веденого, світлодіод, підключений до ведучого, вмикається (червоний), а коли кнопка відпускається, світлодіод вимикається.
3. При одночасному натисканні обох кнопок обидва світлодіоди світяться одночасно і залишаються увімкненими до натискання кнопок
Отже, так відбувається зв'язок I2C в STM32. Тепер ви можете підключити будь-який датчик I2C до плати STM32.
Повне кодування Master STM32 і Slave Arduino наведено нижче з демонстраційним відео