Hoy estuve trabajando en esta TFT LCD y no sé por qué no funciona.
EsteLCDesunTFTde2.2"con controlador de LCD ILI9225 y está conectado a mi STM32F1. Aquí está la hoja de datos del controlador de LCD:
Y código de ejemplo:
Y aquí hay otras fuentes que he leído:
Software
Para el software, aquí está el código que he usado para iniciar la pantalla LCD:
void TM_ILI9225_Init(void)
{
ILI9225_RST_RESET;
TM_ILI9225_Delay(20000);
ILI9225_RST_SET;
TM_ILI9225_Delay(200000);
ILI9225_RST_RESET;
TM_ILI9225_Delay(400000);
TM_ILI9225_SendCommand(0x28);
TM_ILI9225_SendData(0x00CE);
TM_ILI9225_SendCommand(0x10);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x11);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x12);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x13);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x14);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_Delay(400000);
TM_ILI9225_SendCommand(0x11);
TM_ILI9225_SendData(0x103B);//0x0018
TM_ILI9225_SendCommand(0x12);
TM_ILI9225_SendData(0x6121);
TM_ILI9225_SendCommand(0x13);
TM_ILI9225_SendData(0x006F);
TM_ILI9225_SendCommand(0x14);
TM_ILI9225_SendData(0x495F);
TM_ILI9225_SendCommand(0x10);
TM_ILI9225_SendData(0x0A00);
TM_ILI9225_Delay(400000);
TM_ILI9225_SendCommand(0x11);
TM_ILI9225_SendData(0x1000);
TM_ILI9225_Delay(400000);
TM_ILI9225_SendCommand(0x01);
TM_ILI9225_SendData(0x011C);
TM_ILI9225_SendCommand(0x02);
TM_ILI9225_SendData(0x0100);//0x0100
TM_ILI9225_SendCommand(0x03);
TM_ILI9225_SendData(0x1030);
TM_ILI9225_SendCommand(0x07);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x08);
TM_ILI9225_SendData(0x0808);
TM_ILI9225_SendCommand(0x0B);
TM_ILI9225_SendData(0x1100);
TM_ILI9225_SendCommand(0x0C);
TM_ILI9225_SendData(0x0111);//0x0000
TM_ILI9225_SendCommand(0x0F);
TM_ILI9225_SendData(0x0F01);//
TM_ILI9225_SendCommand(0x20);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x21);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x30);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x31);
TM_ILI9225_SendData(0x00DB);
TM_ILI9225_SendCommand(0x32);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x33);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x34);
TM_ILI9225_SendData(0x00DB);
TM_ILI9225_SendCommand(0x35);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x36);
TM_ILI9225_SendData(0x00AF);
TM_ILI9225_SendCommand(0x37);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x38);
TM_ILI9225_SendData(0x00DB);
TM_ILI9225_SendCommand(0x39);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x50);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x51);
TM_ILI9225_SendData(0x0808);
TM_ILI9225_SendCommand(0x52);
TM_ILI9225_SendData(0x080A);
TM_ILI9225_SendCommand(0x53);
TM_ILI9225_SendData(0x000A);
TM_ILI9225_SendCommand(0x54);
TM_ILI9225_SendData(0x0A08);
TM_ILI9225_SendCommand(0x55);
TM_ILI9225_SendData(0x0808);
TM_ILI9225_SendCommand(0x56);
TM_ILI9225_SendData(0x0000);
TM_ILI9225_SendCommand(0x57);
TM_ILI9225_SendData(0x0A00);
TM_ILI9225_SendCommand(0x58);
TM_ILI9225_SendData(0x0710);
TM_ILI9225_SendCommand(0x59);
TM_ILI9225_SendData(0x0710);
TM_ILI9225_SendCommand(0x07);
TM_ILI9225_SendData(0x0012);
TM_ILI9225_Delay(400000);
TM_ILI9225_SendCommand(0x07);
TM_ILI9225_SendData(0x1017);
}
Y aquí están las funciones:
void TM_ILI9225_Delay(volatile unsigned int delay) {
for (; delay != 0; delay--);
}
void TM_ILI9225_SendCommand(uint16_t data) {
ILI9225_WRX_RESET;
a = 3;
while(a){
a--;
}
GPIOA->BRR = GPIO_Pin_4;
a = 3;
while(a){
a--;
}
SPI1->DR = data;
a = 3;
while(a){
a--;
}
GPIOA->BSRR = GPIO_Pin_4; //setbit
}
void TM_ILI9225_SendData(uint16_t data) {
ILI9225_WRX_SET;
a = 3;
while(a){
a--;
}
GPIOA->BRR = GPIO_Pin_4;
a = 3;
while(a){
a--;
}
SPI1->DR = data;
a = 3;
while(a){
a--;
}
GPIOA->BSRR = GPIO_Pin_4;
}
void TM_ILI9225_SetCursorPosition(uint16_t x1, uint16_t y1) {
TM_ILI9225_SendCommand(0x20);
TM_ILI9225_SendData(x1);
TM_ILI9225_SendCommand(0x21);
TM_ILI9225_SendData(y1);
}
void TM_ILI9225_Fill(uint16_t color) {
unsigned int n, i, j;
i = color >> 8;
j = color & 0xFF;
TM_ILI9225_SetCursorPosition(0, 0);
TM_ILI9225_SendCommand(0x22);
for (n = 0; n < ILI9225_PIXEL; n++) {
TM_ILI9225_SendData(i);
TM_ILI9225_SendData(j);
}
Y Macros:
#define ILI9225_RST_SET GPIO_SetBits( GPIOA , GPIO_Pin_3)
#define ILI9225_RST_RESET GPIO_ResetBits(GPIOA, GPIO_Pin_3)
#define ILI9225_WRX_SET GPIO_SetBits(GPIOA, GPIO_Pin_2)
#define ILI9225_WRX_RESET GPIO_ResetBits(GPIOA, GPIO_Pin_2)
#define ILI9225_WIDTH 220
#define ILI9225_HEIGHT 176
#define ILI9225_PIXEL 38720
Y este es el código que utilizo para cambiar el color de la pantalla LCD.
TM_ILI9225_Init();
TM_ILI9225_Fill(0xfb20);
No voy a poner otras partes del código (como la inicialización de SPI y etc.) porque el resto del código está probado y funciona muy bien.
Hardware
Aquí está la conexión de los pines:
MCU -------- LCD
PIN-3A ---- > RST
PIN-2A ---- > RS
NSS ------- > CS
MOSI ------ > SDI
CLK ------- > CLK
3v3 ------- > LED
Vcc ------- > Vcc
GND ------- > GND
He comprobado el cableado con mi analizador lógico y funcionan muy bien.
¿Qué he hecho hasta ahora?
Este módulo LCD tiene un IC 74HC245 y pensé que podría ser posible que este IC no pueda manejar SPI de alta velocidad, luego reduje y aumente la velocidad de la interfaz, lo comprobé con mi analizador lógico y no cambió nada. Manipulé el código de inicialización y especialmente esta parte:
TM_ILI9225_SendCommand(0x0C);
TM_ILI9225_SendData(0x0000);
A esto:
TM_ILI9225_SendCommand(0x0C);
TM_ILI9225_SendData(0x0111);
Pero nada ha pasado. Creo que muchos códigos en la red utilizan incorrectamente el valor 0x0000
para el registro 0x0c
.
Cualquier idea sería apreciada