Найти в Дзене
narod stream

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

На данном уроке мы попробуем к контроллеру ESP32 подключить дисплей TFT разрешением 240×320 по интерфейсу SPI.

С подобным дисплеем мы уже работали неоднократно с применением других контроллеров. Мы подключали его и по 8-разрядной, и по 16-разрядной параллельным шинам. Работали мы с ним и с использованием интерфейса SPI, подключая его к контроллеру STM32 вот в этом уроке.

Поэтому нет смысла заново рассказывать о характеристиках данного дисплея. Я лишь напомню, что подключен он с использованием контроллера дисплея ILI9341, который позволяет подключать подобные дисплеи по различным шинам.

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

Вот так выглядит данный дисплей

-2

У меня дисплей размером диагонали 2,8 дюймов, могут быть другие размеры, главное, чтобы разрешение было 320×240 и контроллер чтобы был такой же.

Верхние 5 ножек относятся к работе с сенсорной панелью (TouchScreen), поэтому мы их использовать не будем, следующая 6 ножка — MISO тоже не будет нами использована, так как нам нет смысла ничего читать из дисплея, мы знаем, что у нас именно ILI9341, да и не совсем корректно контроллер работает с MISO.

Подключим к нашей отладочной плате только нижние следующим образом

-3

Для мониторинга передачи данных по шине 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

Программирование МК ESP32 Урок 11 SPI Дисплей TFT 240×320 Часть 1

Видео в Дзен

Видео в Youtube