Top.Mail.Ru
Уведомления
Очистить все

[Решено] TFT дисплей ILI9341. SPI

Страница 1 / 6
 stm
(@stm)
Level 4
tft

Характеристики дисплея:
Screen Size : 2.8(inch)
Resolution: 320*240 (Pixel)
Способ передачи данных: SPI
Выполнен на драйвере ILI9341

Спойлер
Datasheet на драйвер ILI9341

Подключил так:
(STM32)PA2 -------- (ILI9341)RESET
(STM32)PA3 -------- (ILI9341DC, Data / Command
(STM32)PA4 -------- (ILI9341)CS, Chip Select
(STM32)PA5 -------- (ILI9341)SCK, serial clock (SP1)
(STM32)PA6 -------- (ILI9341)SDO, MISO (SP1)
(STM32)PA7 -------- (ILI9341)SDI, MOSI (SP1)

(STM32)3 Volt -------- (ILI9341)LED
(STM32)5 Volt -------- (ILI9341)VCC
(STM32)GND   -------- (ILI9341)GND

connect
Цитата
Создатель темы Размещено : 07.10.2023 15:08
 stm
(@stm)
Level 4

Изображение из Datasheet из примеров по отсылке команд.

2

D /CX ----------- Data/Command select bit

Это наверное пин DC?
(STM32)PA3 -------- (ILI9341) DC, Data / Command
DC==0 передаётся команда
DC==1 передаются данные
--------------------------
RDX
Если RDX установлен в 1, то идёт чтение?
А если 0 установлен, то чтение просто отключено?
Потому что для записи есть свой бит WRX.
--------------------------
D /CX понятно как устанавливать, GPIO пином микроконтроллера, а как управлять битами RDX, WRX?
-----------------------------------------------
Биты от D0 до D17 заполняются через SPI по порядку?
То есть я отсылаю 18 бит через SPI, указав нужную команду и биты от D0 до D17 заполняются по порядку?
-----------------------------------------------
Что означают стрелочки вверх в значениях бит? Например WRX стрелка вверх

ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 15:53
 stm
(@stm)
Level 4

Я похоже не тот Datasheet изучал.
Сотрите его пожалуйста, в первом сообщении.
Он для другого типа подключения, параллельная шина.
И первый вопрос получается тоже отпадает, для параллельной шины есть пины RD, WR

Для этого дисплея даташит в первом посте.

 

0cf0a3 1939fdf0dace4d4297d94500a80743c4~mv2

У меня другой дисплей

ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 16:11
 stm
(@stm)
Level 4
Спойлер
Нашёл правильный даташит для своего дисплея, но в нём очень мало информации.
ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 16:37
 stm
(@stm)
Level 4

Для установки курсора необходимо 4 цифры:
start column (SC), end column (EC), start page (SP), and end page (EP).

3

Я нашёл в интернете такой код, где из этих четырёх цифр (SC), (EC), (SP), (EP), делается 8 цифр для установки курсора.
Зачем это делается?
В ВЫЗОВАХ этой функции LCD_SendData
https://blablacode.ru/mikrokontrollery/490

void LCD_SendData(u8 data) {
TFT_DC_SET;
TFT_CS_RESET;
spi1_send(data);
TFT_CS_SET;
}


void LCD_SetCursorPosition(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
LCD_SendCommand(ILI9341_COLUMN_ADDR);
LCD_SendData(x1 >> 8); //1
LCD_SendData(x1 & 0xFF); //2
LCD_SendData(x2 >> 8); //3
LCD_SendData(x2 & 0xFF); //4

LCD_SendCommand(ILI9341_PAGE_ADDR);
LCD_SendData(y1 >> 8); //5
LCD_SendData(y1 & 0xFF); //6
LCD_SendData(y2 >> 8); //7
LCD_SendData(y2 & 0xFF); //8
}
ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 18:31
(@eduard)
Level 5 Moderator

@stm В статье распишу.

ОтветитьЦитата
Размещено : 07.10.2023 18:33
 stm
(@stm)
Level 4

HEX Номера команд из Datasheet в первом посте подходят и на мой дисплей тоже.

Это уже очень хорошо.

ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 19:05
 stm
(@stm)
Level 4

(SC), (EC), (SP), (EP) наверное 16 битные параметры, а отправка данных через SPI идёт 8 битными переменными.
Значит если друг за другом записывать данные по команде ILI9341_COLUMN_ADDR, то биты друг за другом будут сохраняться, то есть автоматически инкремент адресов происходит в памяти ILI9341?

Эти 4 восьмибитных цифры это 2 шестнадцатибитных цифры разделённые на 4 восьмибитных для отправки по SPI

uint8_t *pData

HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

LCD_SendData(x1 >> 8); //1
LCD_SendData(x1 & 0xFF); //2
LCD_SendData(x2 >> 8); //3
LCD_SendData(x2 & 0xFF); //4

---------------------------------------------------
Такой порядок записи x1, x2, y1, y2 обязателен?
То есть в ILI9341_COLUMN_ADDR сначала надо записать x1
потом x2
В ILI9341_PAGE_ADDR сначала надо записать y1
потом y2
?

ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 20:37
 stm
(@stm)
Level 4

То есть чтоб друг за другом отсылать данные по SPI я раньше в функции HAL_SPI_Transmit вводил количество байт предназначенных для отправки.
А здесь несколько раз надо вызывать HAL_SPI_Transmit.
Ок для демонстрации принципа работы этот код очень нагляден, но в реале после каждого вызова HAL_SPI_Transmit надо дёргать Chip Select.
Например:

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,Reg4,2,1000);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);

Удобнее будет разделить 16 битные переменные координат на 8 битные переменные заранее и указывать количество байт массива, который надо передать по SPI.

ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 20:49
 stm
(@stm)
Level 4
Спойлер
Здесь есть интересная информация по алгоритму действий.
ОтветитьЦитата
Создатель темы Размещено : 07.10.2023 22:59
 stm
(@stm)
Level 4
PixelLayout2 974x1024

Пиксель 0,0 расположен в верхнем левом углу ЖК-дисплея.

Красный квадрат расположен в точке (318,1), а синий квадрат — в точке (1,239).
Примечание. Ориентацию пикселя (0,0) можно настроить в программном обеспечении.

ОтветитьЦитата
Создатель темы Размещено : 08.10.2023 12:18
 stm
(@stm)
Level 4

Хорошая информация
https://ece353.engr.wisc.edu/external-devices/ili9341/
Последовательность заполнение пикселей цветами:

draw image numbered1 1024x916

Хотелось бы ещё знать какие размеры занимает каждый пиксель.
Но это практическим путём потом проверить можно будет.
Получается рисование на дисплее это не такое простое дело.

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

ОтветитьЦитата
Создатель темы Размещено : 08.10.2023 12:19
 stm
(@stm)
Level 4

Про инициализацию дисплея интересно было бы ещё узнать.
В инициализации дисплея всегда стандартный набор команд?

ОтветитьЦитата
Создатель темы Размещено : 08.10.2023 13:04
(@eduard)
Level 5 Moderator

@stm Практически да. Ради интереса можно ими поиграть.

Это ещё зависит от типа матрицы TFT.

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

 

ОтветитьЦитата
Размещено : 08.10.2023 13:18
 stm
(@stm)
Level 4

Не понимаю это предложение отсюда:
https://ece353.engr.wisc.edu/external-devices/ili9341/
Биты 15:11 используются для установки интенсивности красного пикселя, биты 10:5 используются для установки интенсивности зеленого пикселя, а биты 4:0 используются для установки интенсивности синего пикселя.
----------------------------------------
Что вообще означают цифры 15:11?
15 это цвет, а 11 это интенсивность цвета?
Какими командами можно менять эти параметры?

ОтветитьЦитата
Создатель темы Размещено : 08.10.2023 18:29
Страница 1 / 6
Поделиться: