На данном уроке мы попробуем к контроллеру ESP32 подключить дисплей TFT разрешением 240×320 по интерфейсу SPI.
С подобным дисплеем мы уже работали неоднократно с применением других контроллеров. Мы подключали его и по 8-разрядной, и по 16-разрядной параллельным шинам. Работали мы с ним и с использованием интерфейса SPI, подключая его к контроллеру STM32 вот в этом уроке.
Поэтому нет смысла заново рассказывать о характеристиках данного дисплея. Я лишь напомню, что подключен он с использованием контроллера дисплея ILI9341, который позволяет подключать подобные дисплеи по различным шинам.
Дисплей поставляется вместе с контроллером на удобной плате. Только нужно искать комплектацию именно с интерфейсом SPI, так как есть и другие виды поставок. Внизу страницы я дам ссылку на такой дисплей, на момент написания сценария урока она рабочая, сколько просуществует, не знаю.
Вот так выглядит данный дисплей
У меня дисплей размером диагонали 2,8 дюймов, могут быть другие размеры, главное, чтобы разрешение было 320×240 и контроллер чтобы был такой же.
Верхние 5 ножек относятся к работе с сенсорной панелью (TouchScreen), поэтому мы их использовать не будем, следующая 6 ножка — MISO тоже не будет нами использована, так как нам нет смысла ничего читать из дисплея, мы знаем, что у нас именно ILI9341, да и не совсем корректно контроллер работает с MISO.
Подключим к нашей отладочной плате только нижние следующим образом
Для мониторинга передачи данных по шине SPI я подключил ещё и логический анализатор к ножкам MOSI, SCK и CS.
Проект был сделан из проекта урока 8 с именем LED7219 и назван был ILI9341_SPI.
В каталоге main проекта откроем файл Kconfig.projbuild. В данном пункте нужно будет добавить пункты для остальных ножек. В пунктах для контактов SPI также изменятся номера ножек портов GPIO. Поэтому даю полное содержимое файла
Также переименуем файлы max7219.h и max7219.c соответственно в spi_ili9341.h и spi_ili9341.c.
Сразу изменим содержимое данных файлов:
spi_ili9341.h
spi_ili9341.c
В файле CMakeLists.txt внесём также соответствующие изменения
set(COMPONENT_SRCS "main.c spi_ili9341.c")
В main.h также изменим имя подключаемого файла
#include "spi_ili9341.h"
Откроем наш проект в Espressif IDE, перейдём в файл main.c и в функции app_main удалим объявление переменной для счётчика
volatile long cnt;
В данном поле укажем конкретный максимальный размер буфера
.max_transfer_sz = 16*320*2+8,
Вот это можно удалить
.flags = 0
Здесь вместо единички будет макрос для автоматического определения модуля DMA
ret=spi_bus_initialize(HSPI_HOST, &cfg, SPI_DMA_CH_AUTO);
Выше функции app_main добавим вот такую хитрую функцию обратного вызова
Она нужна для того, чтобы при вызове функции выполнения транзакции с модулем SPI мы могли передавать значение уровня ножки DC.
Вернёмся в функцию app_main, объявим там и сразу проинициализируем переменную типа структуры устройства
В начале функции объявим переменную типа указателя для устройства
Присоединим устройство к модулю и посмотрим возвращённый результат кода ошибки
В файле spi_ili9341.c добавим функцию инициализации контроллера дисплея, в которой объявим небольшой массив, зададим направление работы дополнительных ножек, а также включим подсветку
Объявим прототип данной функции в заголовочном файле и вызовем её в функции app_main файла main.c
Код, находящийся ниже данной строки до бесконечного цикла удалим.
Из бесконечного цикла также удалим всё ненужное, оставим только задержку, несколько увеличив её продолжительность
В файле spi_ili9341.c выше функции TFT9341_ini добавим функцию перезагрузки контроллера дисплея, в которой сначала опустим, а затем поднимем соответствующую ножку
Вызовем данную функцию в функции TFT9341_ini
Выше функции TFT9341_reset добавим функцию отправки команды в шину
Здесь мы как раз воспользовались функцией обратного вызова, передав в параметре уровень ножки DC.
Ниже добавим аналогичную функцию для отправки данных
Здесь мы уже указываем высокий уровень для данной ножки, а также получаем размер данных, передаваемых в шину.
Вернёмся в функцию TFT9341_ini и теперь перезагрузим контроллер дисплея программно
Далее идёт инициализация различных параметров дисплея, которая у нас уже выработана многими уроками и в принципе сильно не менялась
Выведем дисплей из спящего режима и включим его
В файле spi_ili9341.h объявим две глобальные переменные для хранения высоты и ширины дисплея
Вернёмся в файл spi_ili9341.c в функцию TFT9341_ini и присвоим данным переменным значения из входящих параметров
В следующей части урока мы начнём писать тесты для проверки работы дисплея, добавляя при этом дополнительные служебные функции.
Всем спасибо за внимание!
Оригинал статьи находится здесь.
<<Предыдущий урок | Следующая часть>>
Недорогие отладочные платы ESP32 можно купить здесь: Недорогие отладочные платы ESP32
Дисплей 2,8 дюймов 240×320 SPI TFT LCD
Логический анализатор 16 каналов можно приобрести здесь
Многофункциональный переходник CJMCU FT232H USB к JTAG UART FIFO SPI I2C
Видео в RuTube
Видео в Дзен
Видео в Youtube