Характеристики дисплея:
Screen Size : 2.8(inch)
Resolution: 320*240 (Pixel)
Способ передачи данных: SPI
Выполнен на драйвере 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
Изображение из Datasheet из примеров по отсылке команд.
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 стрелка вверх
Я похоже не тот Datasheet изучал.
Сотрите его пожалуйста, в первом сообщении.
Он для другого типа подключения, параллельная шина.
И первый вопрос получается тоже отпадает, для параллельной шины есть пины RD, WR
Для этого дисплея даташит в первом посте.
У меня другой дисплей
Для установки курсора необходимо 4 цифры:
start column (SC), end column (EC), start page (SP), and end page (EP).
Я нашёл в интернете такой код, где из этих четырёх цифр (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 }
HEX Номера команд из Datasheet в первом посте подходят и на мой дисплей тоже.
Это уже очень хорошо.
(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
?
То есть чтоб друг за другом отсылать данные по 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.
Пиксель 0,0 расположен в верхнем левом углу ЖК-дисплея.
Красный квадрат расположен в точке (318,1), а синий квадрат — в точке (1,239).
Примечание. Ориентацию пикселя (0,0) можно настроить в программном обеспечении.
Хорошая информация
https://ece353.engr.wisc.edu/external-devices/ili9341/
Последовательность заполнение пикселей цветами:
Хотелось бы ещё знать какие размеры занимает каждый пиксель.
Но это практическим путём потом проверить можно будет.
Получается рисование на дисплее это не такое простое дело.
Видел где то программы для дисплея, которые создают массив из рисунка.
Про инициализацию дисплея интересно было бы ещё узнать.
В инициализации дисплея всегда стандартный набор команд?
@stm Практически да. Ради интереса можно ими поиграть.
Это ещё зависит от типа матрицы TFT.
Что бы не напороться на плохой, лучше купить у поставщика, который даёт и примеры к своим дисплеям. Правда это немного дороже.
Не понимаю это предложение отсюда:
https://ece353.engr.wisc.edu/external-devices/ili9341/
Биты 15:11 используются для установки интенсивности красного пикселя, биты 10:5 используются для установки интенсивности зеленого пикселя, а биты 4:0 используются для установки интенсивности синего пикселя.
----------------------------------------
Что вообще означают цифры 15:11?
15 это цвет, а 11 это интенсивность цвета?
Какими командами можно менять эти параметры?