ESP32 Урок 8. SPI. Драйвер индикатора MAX7219



 На данном занятии мы начнем работу с интерфейсом SPI, который поддерживается аппаратно в микроконтроллере ESP32.

С данным интерфейсом мы очень неплохо знакомы, так как мы его постоянно используем при написании кода для других контроллеров, поэтому, дабы не тратить драгоценное время, мы не будем останавливаться на изучении передачи данных по шине и разновидностях режимов этой самой передачи.

Как мы знаем, у контроллера ESP32 целых четыре модуля SPI

 

 

Все они через мультиплексор общаются с ножками. Мы также можем эти ножки переопределять. Один из модулей (SPI0) у нас уже задействован для работы с внешней микросхемой FLASH-памяти и те ножки, по которым данный модуль общается с микросхемой, на нашей плате наружу не выведены, так что если что, мы не ошибёмся и не подключим к ним что-нибудь ещё.

Также с модулями SPI мы можем использовать DMA. Какой DMA с каким модулем использовать, мы разбираться сейчас не будем, так как за нас это всё проделает SDK, которым мы пользуемся. Возможно, в дальнейшем, мы займёмся отдельно периферией DMA в нашем контроллере. По рисунку, находящемуся выше, мы можем наблюдать, что SPI0 доступ к DMA не имеет вообще, остальные модули имеют, зато данный модуль работает с кэшем.

Также мы знаем, что SPI может работать как в режиме MASTER, так и в режиме SLAVE. Модуль SPI1 может быть использован только в качестве ведущего (MASTER). Модули SPI2 и SPI3 могут работать в обеих режимах, как в качестве ведущего, так и в качестве ведомого.

Шины сигналов SPI состоят из сигналов D, Q, CS0-CS2, CLK, WP и HD, как показано в таблице ниже. Контроллеры SPI0 и SPI1 совместно используют одну сигнальную шину через арбитр; сигналы общей шины начинаются с SPI. Контроллеры SPI2 и SPI3 используют сигнальные шины, начинающиеся с HSPI и VSPI соответственно. Линии ввода-вывода, включенные в вышеупомянутые сигнальные шины, могут быть сопоставлены с контактами либо через модуль IO_MUX, либо через матрицу GPIO

 

 

Вообщем, если нам вдруг потребуется что-то знать ещё по работе модулей, то мы вернёмся к документации уже по мере написания кода.

Работать на данном уроке с шиной SPI мы будем в режиме MASTER, так как он гораздо проще в программировании, с режимом SLAVE, если он нам вообще потребуется, мы познакомимся в будущих уроках. Также для ещё большей простоты программирования в данном уроке мы будем работать с шиной SPI только в режиме передачи. В качестве ведомого устройства, подключаемого по шине, мы возьмём восьмиразрядный семисегментный индикатор, динамическая индикация которого реализована на микросхеме-драйвере MAX7219. Данная микросхема общается с контроллером именно по шине SPI. Мы неоднократно уже работали с данной микросхемой с использованием других контроллеров, поэтому весь процесс работы с ней нам знаком.

Для подключения к данному индикатору на плате мы будем использовать следующие ножки

 

 

И в результате мы получим следующее соответствие ножек платы с ножками индикатора

 

3V3 — VCC

GND — GND

GPIO23 — DIN

GPIO5 — CS

GPIO18 — CLK

 

Также для исследования передачи данных мы подключим логический анализатор к ножкам GND, MOSI, CLK и CS. Получится следующая схема

 

 

Проект мы давайте сделаем из проекта урока 7 с именем I2C_LCD2004 и назовём его LED7219.

Прежде чем добавить данный проект в Espressif IDE, мы переименуем файлы lcd2004.h и lcd2004.h.c соответственно в max7219.h и max7219.c.

Сразу отредактируем их в блокноте и они приобретут следующий вид

 

 

 

Файлы i2c_user.h и i2c_user.c удалим.

Соответственно, в файле CMakeLists.txt также произойдут изменения

 

set(COMPONENT_SRCS «main.c» «max7219.c»)

 

 

Файл Kconfig.projbuild также приведём в соответствие используемым ножкам

 

 

Добавим наш проект в Espressif IDE и в файле main.h вместо подключения библиотеки для работы с I2C подключим библиотеку для SPI, а также изменим имя нашей подключаемой библиотеки для работы с индикатором. Содержимое файла станет следующим

 

 

Перейдём в main.c и после строки

 

static const char *TAG = «main»;

 

удалим весь код до функции app_main, в которой оставим только бесконечный цикл и задержку

 

 

Попробуем собрать код, посмотреть содержимое конфигуратора, затем ещё раз собрать код.

Если всё нормально собирается, то идём дальше.

В функции app_main сконфигурируем модуль SPI. Делается это аналогично I2C заполнением полей переменной структуры и вызовом специальной функции для применения конфигурации. Перед заполнением полей объявим переменную для кода ошибки, а после вызова функции инициализации драйвера SPI выведем в лог код ошибки

 

 

 

В файле max7219.h объявим структуру для нашего устройства

 

 

Вернёмся в main.c и в функции app_main объявим переменную типа данной структуры

 

 

Перейдём в файл max7219.c и объявим макросы для частоты шины и для количества используемых разрядов в индикаторе

 

 

Ниже добавим функцию отправки пакета байтов в шину

 

 

Код для отправки байтов в SPI чем-то напоминает отправку в I2C. Здесь в цикле заполняются поля структуры, а именно длина пакета (так как у нас всегда будет отправка по 2 байта — адрес регистра и сами данные, то мы будем сразу отправлять 16-разрядный пакет). Затем даём полю указатель на данные и вызываем функцию отправки пакета.

Ниже добавим функцию инициализации индикатора

 

 

Здесь мы конфигурируем устройство, а затем посылаем поочерёдно команды в микросхему таким же образом, как мы это делали и в случаях использования других контроллеров.

Выше добавим функцию вывода числа на индикаторе, а также функцию очистки разрядов индикатора, которые у нас остались неизменными со времён использования индикатора с другими контроллерами

 

 

В функции Init_7219 по окончанию очистим наш индикатор

 

 

Во всех функциях данного файла мы не проверяем выполнение функций и не возвращаем коды ошибок. Если у нас индикатор откажется работать, мы всегда можем это сделать.

В заголовочном файле max7219.h объявим прототипы на 3 функции, которые нам могут потребоваться в дальнейшем

 

 

Вернёмся в файл main.c и в функции app_main вызовем функцию инициализации индикатора

 

 

Далее попробуем вывести на индикатор число

 

 

Соберём код, прошьём контроллер и, если всё нормально, то мы увидим наше число на индикаторе

 

 

Также в терминальной программе мы видим, что у нас инициализация прошла успешно

 

 

Посмотрим также, как передаются данные в программе логического анализа

 

 

Здесь видно, что всё передаётся правильно и шина работает на частоте ровно 10 МГц.

Подождём 2 секунды

 

 

Объявим локальную целочисленную переменную

 

 

Затем в бесконечном цикле запустим счётчик, значения которого будем выводить на индикатор

 

 

Снова соберём код, прошьём контроллер и увидим, как наш счётчик начнет считать

 

 

Итак, на данном уроке мы начали знакомиться с работой модуля SPI в контроллере ESP32, пока используя его только для передачи данных в режиме MASTER. Также мы не использовали другие режимы полярности и фазы. В дальнейшем мы обязательно познакомимся с работой SPI в ESP32 и на приём, а также и в режиме ведомого (SLAVE).

 

Данная статья в Дзен.

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

Недорогие отладочные платы ESP32 можно купить здесь: Недорогие отладочные платы ESP32

Логический анализатор 16 каналов можно приобрести здесь

Индикатор светодиодный семиразрядный с драйвером MAX7219

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

 

ESP32 SPI. Драйвер индикатора MAX7219

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

 

ESP32 SPI. Драйвер индикатора MAX7219

3 комментария на “ESP32 Урок 8. SPI. Драйвер индикатора MAX7219
  1. Артем:

    Добрый день, как еще можно поддержать ресурс, Юmoney почему-то уже которую неделю выдает ошибку? Также очень интересен был бы урок по TWAI (CAN).

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

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

*