Использование интерфейса 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

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

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

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

Ваш адрес email не будет опубликован.