16-bit parallel - ILI9325C Display and STM32F401RET6
Hello,
I am trying to connect an ILI9325C display to an STM32F401RET6 microcontroller Yes this is related to my previous post. After writing the code correctly and connecting the display, it doesn't respond and only has the backlight on (from the power supply). I think my code is correct I compare it to the documentation of my display. Any advice appreciate it.
Display: https://www.waveshare.com/wiki/3.2inch_320x240_Touch_LCD_(C)
My code LCD.C for 16bit-Parrarel
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_spi.h"
#include "lcd.h"
SPI_HandleTypeDef hspi1; // SPI do dotyku
// Ustawienie danych na pinach D0–D15
void LCD_SetDataPins(uint16_t data)
{
// Maska: PB0–PB10, PB12–PB15 (bez PB11 = D11, bo ten jest na PA11)
uint16_t mask = 0b1111011111111111; // 0xF7FF
// Najpierw wyczyść i ustaw dane na GPIOB
GPIOB->ODR = (GPIOB->ODR & ~mask) | (data & mask);
// Osobno ustaw PA11 (D11)
if (data & (1 << 11)) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
}
}
// Wysłanie komendy do LCD
void LCD_WriteCommand(uint16_t cmd) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET); // RS = 0
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); // CS = 0
LCD_SetDataPins(cmd);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); // WR = 0
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); // WR = 1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); // CS = 1
}
// Wysłanie danych do LCD
void LCD_WriteData(uint16_t data) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET); // RS = 1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); // CS = 0
LCD_SetDataPins(data);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); // WR = 0
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); // WR = 1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); // CS = 1
}
// Inicjalizacja wyświetlacza LCD
void LCD_Init(void) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); // RST = 0
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET); // RST = 1
HAL_Delay(10);
LCD_WriteCommand(0x01); // Soft Reset
HAL_Delay(10);
LCD_WriteCommand(0x28); // Display OFF
HAL_Delay(10);
LCD_WriteCommand(0xCF); // Power control
LCD_WriteData(0x00);
LCD_WriteData(0xC1);
LCD_WriteData(0x30);
}
// Inicjalizacja SPI1 (dla dotyku)
void SPI_Init(void) {
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi1);
}
// Odczyt danych z kontrolera dotyku
uint16_t Touch_ReadData(uint8_t cmd) {
uint16_t result = 0;
uint8_t recv[2] = {0};
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); // TP_CS = 0
HAL_SPI_Transmit(&hspi1, &cmd, 1, 1000);
HAL_SPI_Receive(&hspi1, recv, 2, 1000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // TP_CS = 1
result = ((recv[0] << | recv[1]) >> 4;
return result;
}
// Wypełnianie całego ekranu kolorem
void LCD_FillScreen(uint16_t color) {
uint32_t i;
LCD_WriteCommand(0x2A); // Column address set
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0xEF); // 240 columns
LCD_WriteCommand(0x2B); // Page address set
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x01);
LCD_WriteData(0x3F); // 320 rows
LCD_WriteCommand(0x2C); // Memory write
for (i = 0; i < 320 * 240; i++) {
LCD_WriteData(color >> 8); // High byte
LCD_WriteData(color & 0xFF); // Low byte
}
}3. And my pin connection:
display -- stm
5v-in -- 5v
gnd -- gnd
d0 -- pb0
d1 -- pb1
d2 -- pb2
d3 -- pb3
d4 -- pb4
d5 -- pb5
d6 -- pb6
d7 -- pb7
d8 -- pb8
d9 -- pb9
d10 -- pb10
d11 -- pa11
d12 -- pb12
d13 -- pb13
d14 -- pb14
d15 -- pb15
lcd-cs -- pc0
rs -- pc1
wr -- pc2
rd -- vdd
rst -- pc3
bl-vcc -- 3v
gnd -- gnd
bl-ctrl -- pa5
tp-irq -- pa9
tp-cs -- pa8
tp-sck -- pc10
tp-sdi -- pc12
tp-sdo -- pc11
Thank you in advance!
