Урок 37
Часть 2
Дисплей TFT 240×320 8bit
В прошлой части данного урока мы практически завершили первоначальные настройки для работы с дисплеем.
Теперь начнём писать функции.
Первым делом напишем функцию для передачи команды дисплею
while (micros—);
}
//—————————————————————
void TFT9341_SendCommand(unsigned char cmd)
{
ADDR_CMD = cmd;
}
//—————————————————————
Данная функция получилась такой простой благодаря технологии FSMC.
Подобная функция будет для передачи данных в память контроллера дисплея
void TFT9341_SendData(unsigned char dt)
{
ADDR_DATA = dt;
TFT9341_Delay(1);
}
//—————————————————————
Ещё добавим функцию для чтения регистра из котроллера дисплея (многие вещи подглядываем в даташите, в видеоверсии, прикрепленной к уроку снизу, это нагляднее)
uint32_t TFT9341_ReadReg(uint8_t r)
{
uint32_t id;
uint8_t x;
TFT9341_SendCommand(r);
DelayMicro(50);
x=ADDR_DATA;
id=x;
id<<=8;
DelayMicro(1);
x=ADDR_DATA;
id|=x;
id<<=8;
DelayMicro(1);
x=ADDR_DATA;
id|=x;
id<<=8;
DelayMicro(1);
x=ADDR_DATA;
id|=x;
if(r==0xEF)
{
id<<=8;
DelayMicro(5);
x=ADDR_DATA;
id|=x;
}
DelayMicro(150);//stabilization time
return id;
}
//—————————————————————
Добавим две переменные в файле ili9341.c
#include «ili9341.h»
//—————————————————————
uint16_t X_SIZE = 0;
uint16_t Y_SIZE = 0;
//—————————————————————
Напишем функцию ориентации дисплея
void TFT9341_SetRotation(unsigned char r)
{
TFT9341_SendCommand(0x36);
switch(r)
{
case 0:
TFT9341_SendData(0x48);
X_SIZE = 240;
Y_SIZE = 320;
break;
case 1:
TFT9341_SendData(0x28);
X_SIZE = 320;
Y_SIZE = 240;
break;
case 2:
TFT9341_SendData(0x88);
X_SIZE = 240;
Y_SIZE = 320;
break;
case 3:
TFT9341_SendData(0xE8);
X_SIZE = 320;
Y_SIZE = 240;
break;
}
}
//—————————————————————
Напишем на данную функцию прототип, он нам потребуется позже.
Напишем функцию перезагрузки дисплея
void TFT9341_reset(void)
{
RESET_ACTIVE;
HAL_Delay(2);
RESET_IDLE;
TFT9341_SendCommand(0x01); //Software Reset
for (uint8_t i=0;i<3;i++) TFT9341_SendData(0xFF);
}
//—————————————————————
Добавим ещё одну переменную
uint16_t Y_SIZE = 0;
uint32_t dtt=0;
Начнем писать инициализацию дисплея и попробуем считать его идентификатор
void TFT9341_ini(void)
{
char str[10];
TFT9341_reset();
HAL_Delay(1000);
dtt = TFT9341_ReadReg(0xD3);
LCD_Clear();
LCD_SetPos(0,0);
sprintf(str,»0x%08lX»,(unsigned long)dtt);
LCD_String(str);
Скомпилируем код, прошьём контроллер и посмотрим результат считывания идентификатора на символьном дисплее.
Идентификатор считан, значит подключено всё правильно и с дисплеем мы уже общаемся.
В следующей части занятия мы продолжим инициализацию дисплея.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на контроллер дисплея
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Где приобрести именно такой дисплей TFT 240×320, написать затрудняюсь, так как может прийти не всегда именно такой дисплей, какой заявлен в продаже. Либо придет подключаемый по SPI, либо с другим контроллером. Поэтому все тонкости уточняйте у продавца.
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Возвращает D3D3D3D3, было такое же с AVR — победил, уменьшив тактовую частоту AVR. А здесь не получается — при установке в CubeMx max(168) выдает D183A4. Понятно, по даташиту у ili9341 max обмен 45MHz. Cнизил частоту тактирования шины до 16MHz результат D3D3D3D3. Подскажите куда копать.
Михаил, а Вы просто уменьшили частоту изменив константу в проекте и поставили другой кварц ?
Странно, у меня так же выдает D3D3D3D3, уже по вставлял небольшие задержки в подпрограммах сброса и чтения идентификатора
very god
very tanks
you are my teacher
I'm from Iran