ESP32 Урок 11. SPI. Дисплей TFT 240×320. Часть 1



На данном уроке мы попробуем к контроллеру 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.

Сразу изменим содержимое данных файлов:

 

 

 

 

В файле 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 можно купить здесь: Недорогие отладочные платы ESP32

Дисплей 2,8 дюймов 240×320 SPI TFT LCD

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

Многофункциональный переходник CJMCU FT232H USB к JTAG UART FIFO SPI I2C

 

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

ESP32 SPI. Дисплей TFT 240×320

 

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

ESP32 SPI. Дисплей TFT 240×320

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

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

*