Использование интерфейса I2C в STM32F103C8 (Blue Pill)


Интерфейс I2C в настоящее время является одним из самых популярных интерфейсов для связи между внутренними компонентами электронной аппаратуры. Ранее на нашем сайте мы рассматривали статью про использование интерфейса I2C в плате Arduino, в которой демонстрировали возможность связи между двумя платами Arduino по протоколу I2C. В этой же статье мы заменим одну из плат Arduino в отмеченном проекте на плату STM32F103C8, которая также известна под названием STM32 Blue Pill ("синяя таблетка"). Таким образом, мы рассмотрим использование интерфейса I2C в плате STM32F103C8 (Blue Pill) и ее связь по данному интерфейсу с платой Arduino.

Внешний вид проекта для демонстрации возможностей интерфейса I2C в STM32F103C8 (Blue Pill)

Если сравнивать интерфейс I2C (Inter Integrated Circuits) в платах STM32F103C8 Blue Pill и Arduino Uno мы увидим, что в плате Arduino он реализуется с помощью микроконтроллера ATMEGA328, а в плате STM32F103C8 – с помощью микроконтроллера ARM Cortex M3. Плата Arduino Uno имеет только одну шину I2C, а плате STM32 их две. К тому же по вычислительным возможностям плата STM32F103C8 значительно превосходит плату Arduino Uno.

В следующей статье на нашем сайте мы рассмотрим использование интерфейса SPI в плате STM32F103C8.

Контакты I2C в плате STM32F103C8

Распиновка платы STM32F103C8 представлена на следующем рисунке.

Назначение контактов (распиновка) платы STM32F103C8 (Blue Pill)Как видно из представленной схемы, контактами I2C в плате STM32F103C8 являются следующие:

  • SDA: PB7 или PB9, PB11;
  • SCL: PB6 или PB8, PB10.

Контактами I2C в плате Arduino Uno являются:

  • SDA: контакт A4;
  • SCL: контакт A5.

Контакты I2C в плате Arduino UnoНеобходимые компоненты

  1. Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
  2. Плата Arduino Uno (купить на AliExpress).
  3. Светодиод – 2 шт. (купить на AliExpress).
  4. Кнопка – 2 шт.
  5. Резисторы 10 кОм (2 шт.) и 2,2 кОм (2 шт.) (купить на AliExpress).
  6. Макетная плата.
  7. Соединительные провода.

Схема проекта

Схема для связи между платами STM32F103C8T6 и Arduino Uno по интерфейсу I2C представлена на следующем рисунке.

Схема для связи между платами STM32F103C8T6 и Arduino Uno по интерфейсу I2CСоединения между платами STM32 Blue Pill и Arduino Uno по шине I2C представлены в следующей таблице. Для этого требуется всего два провода.

Плата STM32 Blue Pill Плата Arduino Uno Описание контакта
B7 A4 SDA
B6 A5 SCL
GND GND Ground

Примечания:

  • не забудьте соединить контакты GND (общий провод) плат Arduino и STM32F103C8;
  • подключите подтягивающие резисторы 10 кОм к каждой из двух кнопок в схеме.

В нашем проекте плата STM32 Blue Pill будет выступать в роли ведущего устройства (Master) для связи по интерфейсу I2C, а плата Arduino – в роли ведомого (Slave). К каждой из плат подключены светодиод и кнопка.

Для демонстрации возможностей использования интерфейса I2C в плате STM32 мы будем управлять светодиодом, подключенным к ней (к ведущему), с помощью кнопки, подключенной к плате Arduino (ведомой). Аналогично мы будем управлять светодиодом, подключенным к плате Arduino (ведомой), с помощью кнопки, подключенной к плате STM32 (ведущей). Данные будут передаваться по шине I2C.

Объяснение программ для работы с интерфейсом I2C

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Программа для платы STM32 в данном случае будет очень похожа на программу для платы Arduino – будет использоваться та же самая библиотека <wire.h>. Программировать плату STM32F103C8 мы будем с помощью Arduino IDE через USB порт, без использования внешнего FTDI программатора.

В нашем проекте у нас будет две программы: одна для платы STM32, которая будет выступать ведущим устройством, и одна для платы Arduino, которая будет выступать ведомым устройством.

Объяснение программы для платы STM32 (ведущей)

В программе для платы STM32 (ведущей) нам первым делом необходимо подключить библиотеки Wire.h и SoftWire.h.

Затем в функции void setup() мы инициализируем последовательную связь со скоростью 9600 бод.

После этого мы начнем связь по протоколу I2C на контактах (B6, B7).

Далее в функции void loop() мы будем получать данные от ведомой Arduino с помощью функции Wire.requestFrom(8,1), где 8 – это адрес ведомого (slave address), а 1 – количество запрашиваемых байт (то есть в данном случае мы будем запрашивать один байт).

Принимаемое значение мы будем считывать с помощью функции Wire.read().

В зависимости от принятого от ведомого значения мы будем включать или выключать светодиод, подключенный к нашей плате STM32 (ведущей), с помощью функции digitalWrite(). Также мы будем выводить в окно монитора последовательной связи сообщение, свидетельствующее о включении/выключении светодиода.

Затем мы будем считывать состояние контакта PA0 платы STM32, к которому подключена кнопка.

Далее в зависимости от состояния контакта PA0 мы будем передавать соответствующее значение (0 или 1) ведомой плате Аrduino с адресом 8.

Объяснение программы для платы Arduino (ведомой)

Первым делом в программе подключим библиотеку Wire для использования возможностей протокола I2C.

Затем в функции void setup() мы инициализируем последовательную связь со скоростью 9600 бод.

Далее начнем связь по протоколу I2C на контактах (A4, A5) с адресом ведомого (slave address) 8. Здесь важно указать адрес ведомого.

После этого мы должны вызвать функцию Wire.onReceive когда ведомый получает значение от ведущего и функцию Wire.onRequest когда ведущий (Master) запрашивает значение от ведомого (Slave).

Затем нам необходимо запрограммировать две функции – для события запроса и для события приема.

Для события запроса

Данная функция будет выполняться когда плата STM32 (ведущая) будет запрашивать значение от ведомого (slave). Эта функция будет считывать значение (0 или 1) с кнопки, подключенной к ведомой Arduino, и передавать его ведущей STM32 с помощью функции Wire.write().

Для события приема

Данная функция будет выполняться когда ведущий (Master) будет передавать данные ведомому (slave) с адресом равным 8. Функция будет считывать принятое от ведущего значение и сохранять его в переменной типа byte. Далее в зависимости от принятого значения она будет включать или выключать светодиод.

Тестирование работы проекта

Когда мы будем нажимать кнопку, подключенную к ведущей STM32, светодиод, подключенный к ведомой Arduino, будет загораться.

Включение светодиода, подключенного к ведомой Arduino

Если же мы нажмем кнопку на ведомой стороне, то загорится светодиод на ведущей стороне.

Включение светодиода, подключенного к ведущей STM32

Когда обе кнопки будут нажаты одновременно, то оба светодиода загорятся в одно и то же время и будут оставаться во включенном состоянии до тех пор, пока мы не отпустим кнопки.

Включение обоих светодиодов в нашем проекте

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Код для ведущей STM32

Код для ведомой Arduino

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
1 919 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *