12.11.2017, 02:13
|
|
Прохожий
Регистрация: 12.11.2017
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Дисплей ILI9341 на STM32F429 по SPI
Всем привет. Прошу помочь разобраться с дисплеем ili9341 на плате STM32F429. Дисплей подключен через 8 битный SPI, но заставить его отобразить хоть что-нибудь никак не выходит. После инициализации экран просто покрывается серыми точками и темнеет.
Настройка SPI:
Код:
|
void SPI_Init(void)
{
/*
* CSX -› PC2
* DCX -› PD13
* SCL -› PF7
* MISO -› PF8
* SDA -› PF9
*/
RCC-›AHB1ENR |= RCC_AHB1ENR_GPIOFEN | RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOCEN;
/* DCX Output PP */
GPIOD-›MODER &= ~ GPIO_MODER_MODER13;
GPIOD-›MODER |= GPIO_MODER_MODER13_0;
/* CSX Output PP */
GPIOC-›MODER &= ~ GPIO_MODER_MODER2;
GPIOC-›MODER |= GPIO_MODER_MODER2_0;
/* SCK MOSI MISO AF5 PP PD */
GPIOF-›MODER &= ~(GPIO_MODER_MODER7 | GPIO_MODER_MODER8 | GPIO_MODER_MODER9);
GPIOF-›MODER |= (GPIO_MODER_MODER7_1 | GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1);
GPIOF-›PUPDR &= ~(GPIO_PUPDR_PUPDR7 | GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9);
GPIOF-›PUPDR |= (GPIO_PUPDR_PUPDR7_1 | GPIO_PUPDR_PUPDR8_1 | GPIO_PUPDR_PUPDR9_1);
GPIOF-›AFR[0] |= GPIO_AFRL_AFSEL7_0 | GPIO_AFRL_AFSEL7_2;
GPIOF-›AFR[1] |= GPIO_AFRH_AFSEL8_0 | GPIO_AFRH_AFSEL8_2;
GPIOF-›AFR[1] |= GPIO_AFRH_AFSEL9_0 | GPIO_AFRH_AFSEL9_2;
RCC-›APB2ENR |= RCC_APB2ENR_SPI5EN;
SPI5-›CR1 |= SPI_CR1_BR_0 | SPI_CR1_BR_1; // Baud rate: 5.6 Mbit
SPI5-›CR1 &= ~SPI_CR1_CPOL; // Clock polarity: low
SPI5-›CR1 &= ~SPI_CR1_CPHA; // Clock phase: rising edge
SPI5-›CR1 &= ~SPI_CR1_DFF; // Data frame: 8-bit
SPI5-›CR1 &= ~SPI_CR1_LSBFIRST; // Frame format: MSB first
SPI5-›CR1 |= SPI_CR1_SSI | SPI_CR1_SSM; // NSS software mode
SPI5-›CR1 |= SPI_CR1_MSTR; // Master configuration
SPI5-›CR1 |= SPI_CR1_SPE;
} |
Инициализация дисплея:
Код:
|
void LCD_Init(void)
{
LCD_WriteCommand(LCD_CMD_DISP_INV_OFF);
LCD_WriteCommand(0xCA);
LCD_WriteData(0xC3);
LCD_WriteData(0x08);
LCD_WriteData(0x50);
LCD_WriteCommand(LCD_POWERB);
LCD_WriteData(0x00);
LCD_WriteData(0xC1);
LCD_WriteData(0x30);
LCD_WriteCommand(LCD_POWER_SEQ);
LCD_WriteData(0x64);
LCD_WriteData(0x03);
LCD_WriteData(0x12);
LCD_WriteData(0x81);
LCD_WriteCommand(LCD_DTCA);
LCD_WriteData(0x85);
LCD_WriteData(0x00);
LCD_WriteData(0x78);
LCD_WriteCommand(LCD_POWERA);
LCD_WriteData(0x39);
LCD_WriteData(0x2C);
LCD_WriteData(0x00);
LCD_WriteData(0x34);
LCD_WriteData(0x02);
LCD_WriteCommand(LCD_PRC);
LCD_WriteData(0x20);
LCD_WriteCommand(LCD_DTCB);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteCommand(LCD_FRC);
LCD_WriteData(0x00);
LCD_WriteData(0x1B);
LCD_WriteCommand(LCD_DFC);
LCD_WriteData(0x0A);
LCD_WriteData(0xA2);
LCD_WriteCommand(LCD_POWER1);
LCD_WriteData(0x10);
LCD_WriteCommand(LCD_POWER2);
LCD_WriteData(0x10);
LCD_WriteCommand(LCD_VCOM1);
LCD_WriteData(0x45);
LCD_WriteData(0x15);
LCD_WriteCommand(LCD_VCOM2);
LCD_WriteData(0x90);
LCD_WriteCommand(LCD_MAC);
LCD_WriteData(0xC8);
//LCD_WriteData(0x48);
LCD_WriteCommand(LCD_3GAMMA_EN);
LCD_WriteData(0x00);
LCD_WriteCommand(LCD_RGB_INTERFACE);
LCD_WriteData(0xC2);
LCD_WriteCommand(LCD_DFC);
LCD_WriteData(0x0A);
LCD_WriteData(0xA7);
LCD_WriteData(0x27);
LCD_WriteData(0x04);
/* colomn address set */
LCD_WriteCommand(LCD_COLUMN_ADDR);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0xEF);
/* Page Address Set */
LCD_WriteCommand(LCD_PAGE_ADDR);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x01);
LCD_WriteData(0x3F);
LCD_WriteCommand(LCD_INTERFACE);
LCD_WriteData(0x01);
LCD_WriteData(0x00);
LCD_WriteData(0x06);
LCD_WriteCommand(LCD_GRAM);
HAL_Delay(200);
LCD_WriteCommand(LCD_SLEEP_OUT);
HAL_Delay(200);
LCD_WriteCommand(LCD_DISPLAY_ON);
/* GRAM start writing */
LCD_WriteCommand(LCD_GRAM);
}
void LCD_WriteCommand(uint8_t LCD_Reg)
{
DCX_LOW;
CSX_LOW;
SPI5-›DR = LCD_Reg;
while(!(SPI5-›SR & SPI_SR_RXNE)){}
SPI5-›DR;
CSX_HI;
}
void LCD_WriteData(uint8_t value)
{
DCX_HI;
CSX_LOW;
SPI5-›DR = value;
while(!(SPI5-›SR & SPI_SR_RXNE)){}
SPI5-›DR;
CSX_HI;
} |
Так я пытаюсь отобразить на экране красную линию:
Код:
|
uint8_t i = 0;
for (i = 0; i ‹ 200; ++i)
{
LCD_DrawPixel(i, i, 0xF800);
}
void LCD_SetColumn(uint16_t start, uint16_t end)
{
LCD_WriteCommand(LCD_CMD_COLUMN_ADDR);
LCD_WriteData(start ›› 8);
LCD_WriteData(start & 0xFF);
LCD_WriteData(end ›› 8);
LCD_WriteData(end & 0xFF);
}
void LCD_SetPage(uint16_t start, uint16_t end)
{
LCD_WriteCommand(LCD_CMD_PAGE_ADDR);
LCD_WriteData(start ›› 8);
LCD_WriteData(start & 0xFF);
LCD_WriteData(end ›› 8);
LCD_WriteData(end & 0xFF);
}
void LCD_SetXY(uint16_t x, uint16_t y)
{
LCD_SetColumn(x, x);
LCD_SetPage(y, y);
}
void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color)
{
LCD_SetXY(x, y);
LCD_WriteCommand(LCD_GRAM);
LCD_WriteData(color ›› 8);
LCD_WriteData(color & 0xFF);
} |
|
|
|
|
12.11.2017, 02:45
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,669
Сказал спасибо: 185
Сказали Спасибо 3,183 раз(а) в 2,063 сообщении(ях)
|
Re: Дисплей ILI9341 на STM32F429 по SPI
ну чудила...
зачем тебе этот гемор по спи когда у 429 есть прямой контроллер экранов с плюшками типа видеокарты уже!!!
__________________
кагмаподэ магмаподэ
|
|
|
|
12.11.2017, 04:13
|
|
Прохожий
Регистрация: 12.11.2017
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей ILI9341 на STM32F429 по SPI
Про LTDC знаю и через него все идет отлично, но его пины будут использоваться для других целей. А с SPI у меня опыта нету, так что считаю это хорошим поводом повозиться.
|
|
|
|
12.11.2017, 04:51
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Дисплей ILI9341 на STM32F429 по SPI
Конфигурация на IM3…IM0 правильная? VSS/VDDI-VDDI-VDDI-VSS
Используется 4-wire интерфейс?
Конфигурация сигналов и подтяжка соответствуют DS для выбранного типа интерфейса (I/II - IM3=VSS/VDDI)?
Тайминги инициализации и последовательность соответствуют DS?
Что происходит на линии данных на осциллографе, желательно вместе с тактовой. Правильно выбран режим D/C?
Что на линии CS?
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
12.11.2017, 05:55
|
|
Прохожий
Регистрация: 12.11.2017
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей ILI9341 на STM32F429 по SPI
У дисплея на этой плате IM контакты настроены на 4-wire 8-bit data serial interface I (0110), и тут ничего изменить нельзя.
С этой же инициализацией, но через LTDC все работатет, так что последовательность и тайминги должны соответсвовать, если я правильно понимаю. Раз инициализация проходит, то D/C тоже должен быть правильным.
Доступа к осциллографу пока что нет.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:47.
|
|