Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
 Аватар для TIRECS
2 / 2 / 0
Регистрация: 16.07.2012
Сообщений: 38

Экран на ili9481 через SPI

17.10.2021, 17:51. Показов 7158. Ответов 40

Студворк — интернет-сервис помощи студентам
Недавно пришёл с алика сенсорный экранчик на ili9481. Пробую отрисовать на нём что-либо, но ничего не выходит.
Проект создан в CubeIDE, для платы Nucleo-F446RE. К экрану пытаюсь достучаться по SPI2 на ногах PB13-15.
За основу брал статью со стороннего ресурса о работе схожего экрана, т.к системы команд у них схожи.

Подключал так (контроллер -> экран):
3,3V -> VDD
GND -> GND
GND -> CS
3,3V -> BL (подсветка)
PB13(SCLK) -> SCK
PB14(MISO) -> SDI
PB15(MOSI) -> SDO
PB1 -> D/C

Функции которыми пытался достучаться:
Кликните здесь для просмотра всего текста

Основная, отправка байта:
C
1
2
3
4
5
void SPI2_SendByte(uint8_t sendData)
{
  while(!(SPI2->SR & SPI_SR_TXE));
  SPI2->DR = sendData;
}
Пересылка команды и данных, с ногодрыгом пина D/C экрана
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void SendCommand(uint8_t Dat)//DC=0
{
    if( HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 1 )
    {
        while((SPI2->SR & SPI_SR_BSY));
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,0);
    }
    SPI2_SendByte(Dat);
}
 
void SendDat(uint8_t Dat)//DC=1
{
    if( HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0 )
    {
        while((SPI2->SR & SPI_SR_BSY));
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,1);
    }
    SPI2_SendByte(Dat);
}
 
void Send2Dat(uint16_t Dat)//DC=1
{
    if( HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0 )
    {
        while((SPI2->SR & SPI_SR_BSY));
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,1);
    }
    SPI2_SendByte(Dat>>8);
    SPI2_SendByte(Dat);
}
Ну и пользовательские функции для включения и отрисовки
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void SoftReset(void)
{
    SendCommand(SOFTRESET);
    HAL_Delay(120);
}
 
void ili9481_init(void)
{
    SoftReset();
    SendCommand(COLMOD);
    SendDat(COLMOD_PARAMETR);
    SendCommand(MADCTL);
    SendDat(MADCTL_PARAMETR);
    SendCommand(SLEEPOUT);
    HAL_Delay(120);
    SendCommand(DISPLAYON);
    HAL_Delay(120);
}
 
void draw_pixel(int16_t x, int16_t y, uint16_t color)
{
    SendCommand(COLADDRSET);
    SendDat(x>>8); SendDat(x);
    SendDat(x>>8); SendDat(x);
    SendCommand(PAGEADDRSET);
    SendDat(y>>8); SendDat(y);
    SendDat(y>>8); SendDat(y);
    SendCommand(MEMORYWRITE);
    Send2Dat(color);
}
 
void draw_FulRect(int16_t x, int16_t y, int16_t x2, int16_t y2, uint16_t color)
{
    uint16_t k=(x2-x)*(y2-y);
    SendCommand(COLADDRSET);
    SendDat(x>>8); SendDat(x);
    SendDat(x2>>8); SendDat(x2);
    SendCommand(PAGEADDRSET);
    SendDat(y>>8); SendDat(y);
    SendDat(y2>>8); SendDat(y2);
    SendCommand(MEMORYWRITE);
    while(k--)
        Send2Dat(color);
}
Используемая система команд
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define BLACK                       0x0000
#define BLUE                        0x001F
#define RED                         0xF800
#define GREEN                       0x07E0
#define CYAN                        0x07FF
#define MAGENTA                     0xF81F
#define YELLOW                      0xFFE0
#define WHITE                       0xFFFF
 
#define SOFTRESET           0x01
#define SLEEPOUT            0x11
#define DISPLAYON           0x29
#define COLADDRSET          0x2A
#define PAGEADDRSET         0x2B
#define MEMORYWRITE         0x2C
#define MADCTL              0x36
  #define MADCTL_MY               0x80
  #define MADCTL_MX               0x40
  #define MADCTL_MV               0x20
  #define MADCTL_BGR              0x08
  #define MADCTL_RGB              0x00
#define COLMOD              0x3A
  #define COLMOD_PARAMETR           0x55
#define READ_ID4            0xD3
 
#define ROTATION                    2
#if ROTATION == 1
  #define MADCTL_PARAMETR           MADCTL_MX | MADCTL_BGR
  #define ILI9341_TFTWIDTH          320
  #define ILI9341_TFTHEIGHT         480
#elif ROTATION == 2
  #define MADCTL_PARAMETR           MADCTL_MV | MADCTL_BGR
  #define ILI9341_TFTWIDTH          480
  #define ILI9341_TFTHEIGHT         320
#elif ROTATION == 3
  #define MADCTL_PARAMETR           MADCTL_MY | MADCTL_BGR
  #define ILI9341_TFTWIDTH          320
  #define ILI9341_TFTHEIGHT         480
#elif ROTATION == 4
  #define MADCTL_PARAMETR           MADCTL_MX | MADCTL_MY| MADCTL_MV | MADCTL_BGR
  #define ILI9341_TFTWIDTH          480
  #define ILI9341_TFTHEIGHT         320
#endif


Подрубался логическим анализатором, пытался закрасить пиксель с координатами 5,5 в жёлтый, сигнал красивый но толку ноль.

Еще напрягают неизвестные шумы на пине MISO во время передачи данных, в простое их не наблюдается
Миниатюры
Экран на ili9481 через SPI   Экран на ili9481 через SPI  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.10.2021, 17:51
Ответы с готовыми решениями:

LCD Ili9481 + Coocox
Здравствуйте! Помогите пожалйста разобраться. Есть отладочная платка на stm32f103VET6. Есть дисплей ILI9481 3,5 дюйма 480х320 режим...

MCP2515 через SPI
Всем доброго времени суток. Недавно начал изучение программирования на AVR, задача - связаться через SPI с CAN. Хотя бы просто связаться,...

Spi через регистры
пишу в truestudio использую hal * USER CODE BEGIN WHILE */ while (1) { HAL_UART_Transmit(&huart1,(uint8_t*)buf, 3,...

40
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
03.01.2022, 18:02
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TIRECS Посмотреть сообщение
У меня так и не вышло не то что пиксель закрасить но даже получить какой-либо ответ от дисплея. Пробовал и самописный код через stm32, и библиотеки через ардуино - результат никакой...
помоему вы неправильно данные отправляете по SPI...
эксперименты с CS были ? (а то я не увидел код)

Добавлено через 6 минут
TIRECS, попробуйте процедуры отправки сделать по примеру ниже, только StdLib на CMSIS поменяйте (это я из какого то древнего исходника своего выдрал, там другой дисплей, но этот код отправки данных у меня работает стабильно с любыми SPI дисплеями)


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// передача данных на дисплей
void SPI2_SendByte(uint8_t sendData)
{
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  SPI_I2S_SendData(SPI2, sendData);
}
 
 
// отправка команды на дисплей
void ili9341c_CMD(uint8_t sendData)
{
  GPIO_ResetBits(GPIOB, GPIO_Pin_11); // CS=0;
 
  GPIO_ResetBits(GPIOB, GPIO_Pin_12);   // DC=0;
  SPI2_SendByte(sendData);
  while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
 
  GPIO_SetBits(GPIOB, GPIO_Pin_11);   // CS=1;
}
 
 
// отправка данных на дисплей
void ili9341c_DATA(uint8_t sendData)
{
  GPIO_ResetBits(GPIOB, GPIO_Pin_11); // CS=0;
 
  GPIO_SetBits(GPIOB, GPIO_Pin_12);     // DC=1;
  SPI2_SendByte(sendData);
  while (SPI_I2S_GetFlagStatus(SPI2,SPI_FLAG_BSY)!=RESET);
 
  GPIO_SetBits(GPIOB, GPIO_Pin_11);   // CS=1;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2022, 18:02

MSP430G2553 через SPI к CC110L
Есть МК (MSP430G2553) и есть трансмиттер Anaren LR09A на чипе CC110L всё управление чипом производиться посредством команд SPI. (Посылаем...

spi через длинные провода в автомобиле
Нужно управлять одним spi устройством, можно на очень малых скоростях (1 кГц). Между контроллером и устройством метров 5, в автомобиле. Что...

Проблемы с fatfs через spi [решено].
Возникала такая проблема с fatfs через spi. Система монтируется, файлы открываются, и даже создаются пустые файлы, но их не возможно...

Соединение STM32 + Cubieboard через SPI
Добрый день! Соединяю платы STM32 и Cubieboard2 через SPI. Скорость 10МГц. Может ли длинна проводов между платами достигать 10-20 см?

Передача данных через SPI ATmega8
Не передаются данные через шину, не понимаю почему. Передаю массив данных, который содержит в себе картинку 8 на 8 пикселей. По схеме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru