问题现象:在测试程序中我要显示的是蓝色(0x001F(RGB565 驱动IC为ILI9341)),结果LCD显示的却是红色。要显示红色(0xF800),结果却是蓝色。只有绿色、白色和黑色的显示都是对的(我只测试了这几个比较简单的)。我用万用表测过TFTLCD接口的D15~D0是对应连接的FSMC_D15~FSMC_D0。而且,在要显示蓝色(0x001F)实际却显示红色的时候,TFTLCD液晶模块引脚测得的电压(D15~D0)也显示传输的数据是0x001F,但就是实际现实的不是我要的蓝色。我用战舰V3板在同样的测试代码情况下,该TFTLCD液晶模块在显示数据是蓝色(0x001F)的时候确实显示的是蓝色,就在我自己的板子上不能正确的显示为蓝色。求神们帮忙找找问题所在啊?!
PS:问题描述的比较拗口,请多多见谅╮(╯_╰)╭。
一、先上自己的板子LCD接口电路和正点原子(战舰V3)LCD接口电路对比图。
二、我的TFTLCD初始化代码。
[mw_shl_code=c,true]//LCD初始化
void TFTLCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
FSMC_NORSRAMTimingInitTypeDef writeTiming;
//使能FSMC时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
//使能PORTB,D,E,G以及AFIO复用功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);
//PB1背光
//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//PORTD复用推挽输出(FSMC_D0~D3,D13~D15) PD4(FSMC_NOE) PD5(FSMC_NWE)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//PORTE复用推挽输出(FSMC_D4~D12) LCD和DM9000选择线PE3(FSMC_A19)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//PORTF0复用推挽输出(RS信号FSMC_A0)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
//PORTG12复用推挽输出(FSMC_NE4)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0x0F; // 数据保存时间为25个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快。
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK
writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A
writeTiming.FSMC_DataSetupTime = 0x02; ////数据保存时间为3个HCLK
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// 这里我们使用NE4 ,也就对应BTCR[6],[7]。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存储器写使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1
delay_ms(50); // delay 50 ms
//开始初始化序列
LCD_WriteCMD(0xCF);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0xC1);
LCD_WriteDAT(0X30);
LCD_WriteCMD(0xED);
LCD_WriteDAT(0x64);
LCD_WriteDAT(0x03);
LCD_WriteDAT(0X12);
LCD_WriteDAT(0X81);
LCD_WriteCMD(0xE8);
LCD_WriteDAT(0x85);
LCD_WriteDAT(0x10);
LCD_WriteDAT(0x7A);
LCD_WriteCMD(0xCB);
LCD_WriteDAT(0x39);
LCD_WriteDAT(0x2C);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x34);
LCD_WriteDAT(0x02);
LCD_WriteCMD(0xF7);
LCD_WriteDAT(0x20);
LCD_WriteCMD(0xEA);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x00);
LCD_WriteCMD(0xC0); //Power control
LCD_WriteDAT(0x1B); //VRH[5:0]
LCD_WriteCMD(0xC1); //Power control
LCD_WriteDAT(0x01); //SAP[2:0];BT[3:0]
LCD_WriteCMD(0xC5); //VCM control
LCD_WriteDAT(0x30); //3F
LCD_WriteDAT(0x30); //3C
LCD_WriteCMD(0xC7); //VCM control2
LCD_WriteDAT(0XB7);
LCD_WriteCMD(0x36); // Memory Access Control
LCD_WriteDAT(0x48);
LCD_WriteCMD(0x3A);
LCD_WriteDAT(0x55);
LCD_WriteCMD(0xB1);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x1A);
LCD_WriteCMD(0xB6); // Display Function Control
LCD_WriteDAT(0x0A);
LCD_WriteDAT(0xA2);
LCD_WriteCMD(0xF2); // 3Gamma Function Disable
LCD_WriteDAT(0x00);
LCD_WriteCMD(0x26); //Gamma curve selected
LCD_WriteDAT(0x01);
LCD_WriteCMD(0xE0); //Set Gamma
LCD_WriteDAT(0x0F);
LCD_WriteDAT(0x2A);
LCD_WriteDAT(0x28);
LCD_WriteDAT(0x08);
LCD_WriteDAT(0x0E);
LCD_WriteDAT(0x08);
LCD_WriteDAT(0x54);
LCD_WriteDAT(0XA9);
LCD_WriteDAT(0x43);
LCD_WriteDAT(0x0A);
LCD_WriteDAT(0x0F);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x00);
LCD_WriteCMD(0XE1); //Set Gamma
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x15);
LCD_WriteDAT(0x17);
LCD_WriteDAT(0x07);
LCD_WriteDAT(0x11);
LCD_WriteDAT(0x06);
LCD_WriteDAT(0x2B);
LCD_WriteDAT(0x56);
LCD_WriteDAT(0x3C);
LCD_WriteDAT(0x05);
LCD_WriteDAT(0x10);
LCD_WriteDAT(0x0F);
LCD_WriteDAT(0x3F);
LCD_WriteDAT(0x3F);
LCD_WriteDAT(0x0F);
LCD_WriteCMD(0x2B);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x01);
LCD_WriteDAT(0x3f);
LCD_WriteCMD(0x2A);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0x00);
LCD_WriteDAT(0xef);
LCD_WriteCMD(0x11); //Exit Sleep
delay_ms(120);
LCD_WriteCMD(0x29); //display on
LCD_Display_Dir(1);//默认为横屏
GPIO_SetBits(GPIOB,GPIO_Pin_1);//点亮背光
LCD_Clear(WHITE);
}
[/mw_shl_code]
三、我的TFTLCD的FSMC控制接口。
[mw_shl_code=c,true]//LCD写命令、读写数据地址定义
#define TFTLCD_CMD (*((vu16*)0x6C000000))
#define TFTLCD_DAT (*((vu16*)0x6C000002)) [/mw_shl_code]
四、我的TFTLCD测试代码,是根据问题特别写的。
[mw_shl_code=c,true]int main()
{
delay_init();
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);
uart_init(115200);
TFTLCD_Init();
POINT_COLOR=BLACK;
BACK_COLOR=WHITE;
LCD_Clear(WHITE);
LCD_ShowString(20,20,100,100,24,"LXP");
delay_ms(1864);
LCD_SetCursor(0,0);
TFTLCD_CMD=lcddev.wgramcmd;
while(1)
{
TFTLCD_DAT=0x001F;
}
}[/mw_shl_code]
|