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

 

 

 

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

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

 

 

Заполнять экран мы будем блоками максимального размера, который мы определили при инициализации модуля SPI.

Поэтому объявим указатель на блок памяти и запросим её у кучи

 

 

Поменяем байты в цвете и заполним значениями цвета весь блок

 

 

Выше добавим функцию отправки данных всего блока в шину

 

 

В данной функции объявим переменную для кода ошибки, ещё одну целочисленную переменную и массив переменных типа структуры транзакии

 

 

Произведём начальную инициализацию полей транзакций

 

 

Здесь также мы в транзакциях для данных устанавливаем высокий уровень ножке, а в транзакциях для команд — низкий.

Проинициализируем остальные поля

 

 

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

Вызовем функцию передачи данных команд в шину в цикле

 

 

Ниже добавим функцию для ожидания окончания передачи данных

 

 

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

 

 

Освободим память, а то её хватит ненадолго

 

 

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

 

 

В функции app_main файла main.c окрасим весь экран сначала в чёрный, а потом в красный цвет

 

 

Подключим контроллер и анализатор к ПК, соберём код, зальём его в плату и посмотрим результат

 

 

 

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

Вот так, например, отправляется самая первая команда программной перезагрузки контроллера дисплея

 

 

Посмотрим, как идёт процесс заливки цветом экрана

 

 

И вот собственно сами данные (чёрный цвет)

 

 

И красный цвет

 

 

Мы видим, что данные передаются непрерывно. Также и между блоками практически нет пауз

 

 

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

 

TFT9341_FillScreen(spi, TFT9341_RED);

 

Объявим две локальные переменные

 

 

В бесконечном цикле напишем небольшой тест с заливкой экрана в случайные цвета

 

 

Прошьём контроллер и посмотрим результат

 

 

Всё работает.

 

 

В файле spi_ili9341.h добавим обмен значений между переменными

 

 

Перейдём в файл spi_ili9341.c и выше функции TFT9341_ini добавим функцию заливки одним цветом прямоугольной области экрана с заданными координатами

 

 

Выйдем из функции, если значение координат будет за областью экрана

 

 

Поменяем координаты местами, если левая будет правее правой, а верхняя — ниже нижней

 

 

Объявим и проинициализируем переменные, в которых будет ширина и высота прямоугольной области

 

 

Объявим указатель данных для блока

 

 

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

 

 

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

 

 

Запросим память для блока

 

 

Поменяем местами байты цвета

 

 

Объявим и проинициализируем переменную для объёма всей заливаемой области, а также объявим переменную для текущего блока

 

 

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

 

 

Из размера вычтем размер, который мы вычислили, для следующего цикла

 

 

Узнаем количество полных линий, которые мы можем закрасить, не превышая максимальный размер блока

 

 

Заполним блок значениями цвета

 

 

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

Добавим такую функцию выше функции send_block_finish. Начало функции такое же

 

 

Далее будут небольшие отличия в координатах, принцип такой же

 

 

Вернёмся в функцию TFT9341_FillRect и отправим блок в дисплей

 

 

Сдвинем вертикальную координату на высоту уже отправленного блока

 

 

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

 

 

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

 

 

Не забываем про освобождение памяти

 

 

Объявим прототип на данную функцию в заголовочном файле и в функции app_main фала main.c в бесконечном цикле добавим ещё один тест

 

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

 

 

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

 

 

Проверим, как оно работает

 

 

Всё работает.

Вернёмся в файл spi_ili9341.c и и выше функции TFT9341_ini добавим функцию отправки буфера в шину

 

 

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

 

 

Ниже добавим вывода точки на экран

 

 

Здесь обычный вывод прямоугольника единичной ширины и высоты.

Объявим прототип на данную функцию в заголовочном файле и добавим в бесконечном цикле в функции app_main файла main.c ещё один тест по выводу точек в случайные места экрана

 

 

Проверим работу теста

 

 

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

 

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

 

Предыдущая часть Программирование МК 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

2 комментария на “ESP32 Урок 11. SPI. Дисплей TFT 240×320. Часть 2
  1. Андрей:

    Добрый день, спасибо за урок, что-то не нашел исходный код к уроку?

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

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

*