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


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

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

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

В данном проекте мы будем использовать плату STM32F103C8 в качестве ведущего устройства (Master), а плату Arduino – в качестве ведомого устройства (slave). К обоим платам будут подключены потенциометры для управления передаваемыми по интерфейсу SPI значениями и ЖК дисплеи 16х2 для отображения принимаемых значений.

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

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

Назначение контактов (распиновка) платы STM32F103C8 (Blue Pill)Контакты SPI в плате STM32F103C8 представлены в следующей таблице.

SPI (линия 1) Контакт в STM32F103C8 SPI (линия 2) Контакт в STM32F103C8
MOSI1 PA7 или PB5 MOSI2 PB15
MISO1 PA6 или PB4 PB14 PB14
SCK1 PA5 или PB3 SCK2 PB13
SS1 PA4 или PA15 SS2 PB12

Как видите, две шины SPI открывают больше возможностей (по сравнению с платой Arduino).

Контакты SPI в плате Arduino Uno

Контакты SPI в плате Arduino Uno

Контакты SPI в плате Arduino Uno представлены в следующей таблице.

Линия SPI Контакт Arduino Uno
MOSI 11 или ICSP-4
MISO 12 или ICSP-1
SCK 13 или ICSP-3
SS 10

Здесь, как видите контакты SPI также сгруппированы в одном месте.

Необходимые компоненты

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

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

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

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

Контакт SPI STM32F103C8 Arduino Uno
MOSI PA7 11
MISO PA6 12
SCK PA5 13
SS1 PA4 10

Примечание: не забывайте соединить контакты GND (общий провод) плат STM32F103C8 и Arduino Uno.

Схема соединений между ЖК дисплеями 16х2 и платами STM32F103C8 и Arduino Uno приведена в следующей таблице.

ЖК дисплей STM32F103C8 Arduino Uno
VSS GND GND
VDD +5V +5V
V0 средний контакт потенциометра средний контакт потенциометра
RS PB0 2
RW GND GND
E PB1 3
D4 PB10 4
D5 PB11 5
D6 PC13 6
D7 PC14 7
A +5V +5V
K GND GND

Внешний вид собранной конструкции проекта приведен на следующем рисунке.

Внешний вид собранной конструкции проекта

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

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

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

В нашем проекте плата STM32F103C8 будет использоваться в качестве ведущей (Master), а плата Arduino Uno – в качестве ведомой (Slave). К каждой из плат подключены ЖК дисплеи 16х2 для отображения на них поступающей по интерфейсу SPI информации. Также к платам подключены потенциометры для управления передаваемыми значениями (от 0 до 255).

Потенциометр к плате STM32F103C8 подключен к ее контакту PA0 (0 до 3.3V). Значение на выходе АЦП данного контакта будет лежать в диапазоне от 0 до 4096, в дальнейшем мы преобразуем это значение в диапазон от 0 до 255 поскольку за один раз через интерфейс SPI мы можем передать только один байт (8 бит) информации.

На стороне ведомой Arduino потенциометр подключен к ее контакту A0. Значение на выходе АЦП данного контакта будет лежать в диапазоне от 0 до 1023, в дальнейшем мы преобразуем это значение в диапазон от 0 до 255 по указанной выше причине.

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

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

Первым делом в программе подключим библиотеки для работы с интерфейсом SPI и ЖК дисплеем 16х2, также укажем контакты платы, к которым подключен дисплей и создадим объект для работы с ним. Более подробно о подключении ЖК дисплея 16х2 к плате STM32 Blue Pill можно прочитать в этой статье.

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

Затем начнем связь по протоколу SPI.

Затем установим делитель частоты синхронизации (Clock divider) для связи по интерфейсу SPI. Мы установили этот делитель равным 16.

Далее подадим на контакт SS уровень HIGH до тех пор пока мы не начнем передачу данных на ведомую Arduino.

Затем в функции void loop() подадим на контакт SS (slave select – выбор ведомого) уровень LOW – это необходимо чтобы начать передачу данных от ведущего к ведомому.

После этого считаем аналоговое значение с контакта PA0 платы STM32F10C8.

Затем преобразуем это значение в диапазон 0-255 чтобы его можно было передавать с помощью одного байта информации.

Далее у нас идет такой важный шаг, как передача значения переменной Mastersend к ведомой Arduino и прием значения от ведомой Arduino в переменную Mastereceive.

Далее отобразим принятые значения от ведомой Arduino на экране ЖК дисплея с задержкой 500 мс и затем продолжим в непрерывном режиме принимать значения и отображать их на экране дисплея.

Примечание: мы используем функцию serial.println() для отображения результатов в окне монитора последовательной связи Arduino IDE.

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

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

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

Затем зададим режим работы для контакта MISO на вывод данных (OUTPUT) – это необходимо чтобы передавать данные ведущему устройству (Master).

После этого переведем интерфейс SPI в режим ведомого (Slave Mode) используя управляющий регистр SPI (SPI Control Register).

Далее включим обработку прерываний в интерфейсе SPI. Если мы получим данные от ведущего (master), то произойдет вызов процедуры обработки прерывания (Interrupt Service Routine) и принятое значение будет извлечено из регистра SPDR (SPI data Register – регистр данных SPI).

Затем в функции обработки прерывания (Interrupt Routine function) мы принятое значение из регистра SPDR будем сохранять в переменной Slavereceived.

Далее в функции void loop() мы будем считывать аналоговое значение с контакта A0 платы Arduino и сохранять его в переменной pot.

Затем преобразуем это значение в диапазон 0-255 чтобы его можно было передавать с помощью одного байта.

Далее нам необходимо передать это преобразованное значение ведущей STM32F10C8, поэтому мы поместим это значение в регистр SPDR. Данный регистр используется для передачи и приема значений.

Затем отобразим принятое от ведущей STM32F103C8 значение на экране ЖК дисплея с задержкой 500 мс и затем в непрерывном режиме будем осуществлять прием данных и их отображение на экране ЖК дсиплея.

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

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

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

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

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

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

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

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

Комментарии

Использование интерфейса SPI в STM32F103C8 (Blue Pill) — 12 комментариев

  1. Добрый день! Контакты SPI в плате STM32F103C8 представлены в следующей таблице. А как скеч решает к каким именно контактом обратится?

  2. Может кому пригодится, синяя плата, 128 кб, не работает SPI2.
    Решение:
    SPI.SPI_CPOL = SPI_CPOL_High;//Low для оригинальных STM32, а для китайских High !
    //Name.SPI_CPOL-высоким или низким уровнем будет тактовый сигнал:
    //SPI_CPOL_Low-в ожидании на выходе у MASTER будет низкий уровень, тактовый сигнал высокий.
    //SPI_CPOL_High-тут наоборот,в ожидании на выходе у MASTER будет высокий уровень, тактовый сигнал низкий.

  3. Прямо вот напрямую соединили STM32 на 3.3 вольта уровни, с Arduino на 5в уровни, и ничего не сдохло... странно, странно...

    • Леонид, ну чудеса случаются. )) У нас на сайте есть статья где мы соединяли 5в Ардуино с 3.3 вольта Raspberry Pi и тоже ничего не сдохло

      • да не, никаких чудес. просто ты спер этот текст с чужого сайта, а ссылочку не поставил.

        • Не спер, а вручную перевел. Различайте понятия, Артем. И ссылок на их сайт у меня на сайте стоит достаточно много, я думаю они не очень в обиде если именно с этой страницы на их сайт ссылки не стояло. И первоисточник статьи всегда посмотреть под их видео, которое я всегда оставляю. А если бы хотел усиленно скрыть что оригинал статьи находится на другом сайте, то не оставлял бы. И деньги за просмотры своих видео на моем сайте получают они, а не я, поэтому в некотором плане им даже хорошо, что кто то их статьи переводит на русский язык.

          • Есть общепринятый порядок определения первоисточника в переводной стате. И это не: "Опубликовано 04.04.2022 автором admin-new". Оформляйте переводы как положено и тогда вопросов возникать не будет. Помимо этого есть еще и копирайт, автор первоисточника должен подтвердить согласие на перевод и опубликование своего материала.

            • Андрей, хочется верить в то, что вы в жизни жестко соблюдаете все правила, которые есть в современном мире

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

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