OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8379|回复: 13

Alientek 2.8寸 TFTLCD 颜色显示问题

[复制链接]

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
发表于 2015-11-17 10:52:08 | 显示全部楼层 |阅读模式
5金钱
问题现象:在测试程序中我要显示的是蓝色(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]

最佳答案

查看完整内容[请看2#楼]

找到了问题的症结所在了:TFTLCD初始化过程中,在设置ILI9341的扫描方式,即配置Memory Access Control (36h)寄存器时,不仅需要设置MY、MX和MV这些位,还需要将BGR位置为1,这样配置出来的才是RGB模式。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2015-11-17 10:52:09 | 显示全部楼层
找到了问题的症结所在了:TFTLCD初始化过程中,在设置ILI9341的扫描方式,即配置Memory Access Control (36h)寄存器时,不仅需要设置MY、MX和MV这些位,还需要将BGR位置为1,这样配置出来的才是RGB模式。


回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-11-17 13:14:43 | 显示全部楼层
设置显示红色,结果显示蓝色,或者设置显示蓝色但是显示红色,说明你的颜色值的RGB顺序反了成了BGR了
开往春天的手扶拖拉机
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2015-11-17 14:59:12 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
按照战舰V3视频资料"第37讲 LCD-TFTLCD原理与配置介绍-M3"里面讲的,2.8 TFTLCD的驱动IC是ILI9341,我的TFTLCD关于ILI9341初始化序列部分的代码也是从战舰V3"实验13 TFTLCD显示实验"里直接复制过来的,难道你们初始化时不是设置成RGB模式吗?
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2015-11-17 15:44:02 | 显示全部楼层
ILI9341初始化序列部分貌似有点问题,我现在改成如图所示了,问题还是没有解决,我想把它设置成RGB565模式。



ILI9341数据手册部分如下。

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-11-17 22:19:07 | 显示全部楼层
你用的不是我们的模块么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2015-11-18 11:23:51 | 显示全部楼层
是啊,就是你们公司的啊,ILI9341的初始化代码也是从你们战舰V3板的例程里COPY过来的......囧



ILI9341的初始化代码就是从这里COPY过来的。



这是我设置LCD扫描方式的代码,也是从你们公司战舰V3板的例程里抠出来的。我觉得这部分的作用除了设置扫描方式外,还将LCD颜色显示模式从初始化时的BGR模式转变成RGB模式的,可是实际却没有效果。

[mw_shl_code=c,true]//设置扫描方式 //dir:0~7,详细定义见ILI9341.h void LCD_Scan_Mode(u8 dir) { u16 regval=0x00; u16 temp=0x00; //竖屏时,L2R_U2D就是L2R_U2D //横屏时,L2R_U2D对应的是竖屏时的D2U_L2R //选用其他方式会导致显示不正常,默认为从左到右,从上到下方式 if(lcddev.dir == 1) { switch(dir)//方向转换 { // case 0:dir=6;break; // case 1:dir=7;break; // case 2:dir=4;break; // case 3:dir=5;break; // case 4:dir=1;break; // case 5:dir=0;break; // case 6:dir=3;break; // case 7:dir=2;break; case 0:dir=5;break; // case 1:dir=7;break; // case 2:dir=4;break; // case 3:dir=5;break; // case 4:dir=1;break; // case 5:dir=0;break; // case 6:dir=3;break; // case 7:dir=2;break; } } switch(dir) { case L2R_U2D://从左到右,从上到下 regval|=(0<<7)|(0<<6)|(0<<5); break; case L2R_D2U://从左到右,从下到上 regval|=(1<<7)|(0<<6)|(0<<5); break; case R2L_U2D://从右到左,从上到下 regval|=(0<<7)|(1<<6)|(0<<5); break; case R2L_D2U://从右到左,从下到上 regval|=(1<<7)|(1<<6)|(0<<5); break; case U2D_L2R://从上到下,从左到右 regval|=(0<<7)|(0<<6)|(1<<5); break; case U2D_R2L://从上到下,从右到左 regval|=(0<<7)|(1<<6)|(1<<5); break; case D2U_L2R://从下到上,从左到右 regval|=(1<<7)|(0<<6)|(1<<5); break; case D2U_R2L://从下到上,从右到左 regval|=(1<<7)|(1<<6)|(1<<5); break; } //写入设置值 LCD_WriteCMD(lcddev.setscanmodecmd); LCD_WriteDAT(regval); //坐标范围处理 if(regval&0x20)//此时对应着从竖屏转变成横屏的情况 { if(lcddev.width<lcddev.height) { temp=lcddev.width; lcddev.width=lcddev.height; lcddev.height=temp; } } else//此时对应着从横屏转变成竖屏的情况 { if(lcddev.width>lcddev.height) { temp=lcddev.width; lcddev.width=lcddev.height; lcddev.height=temp; } } //重新设置x,y坐标的范围 LCD_WriteCMD(lcddev.setxcmd); LCD_WriteDAT(0); LCD_WriteDAT(0); LCD_WriteDAT((lcddev.width-1)>>8); LCD_WriteDAT((lcddev.width-1)&0x00FF); LCD_WriteCMD(lcddev.setycmd); LCD_WriteDAT(0); LCD_WriteDAT(0); LCD_WriteDAT((lcddev.height-1)>>8); LCD_WriteDAT((lcddev.height-1)&0x00FF); } //设置LCD的显示方式 //dir:0,竖屏;1,横屏 void LCD_Display_Dir(u8 dir) { if(dir == 0) { lcddev.dir=0; LCD_Scan_Mode(DFT_SCAN_MODE); } if(dir == 1) { lcddev.dir=1; LCD_Scan_Mode(DFT_SCAN_MODE); } } [/mw_shl_code]












































回复

使用道具 举报

3

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-4-18
在线时间
8 小时
发表于 2015-11-18 18:03:09 | 显示全部楼层
你这情形我遇到过,我用的是SSD1289,当时我只是修改了BGR的值即可。这个肯定是因为RGB与BGR反过来了,黑色白色那些跟这个顺序没关系。
回复

使用道具 举报

3

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-4-18
在线时间
8 小时
发表于 2015-11-18 18:58:04 | 显示全部楼层
解决了没?在线仿真调试,跟踪送入显示屏的值。就能知道程序哪个地方出问题了。
回复

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
330
金钱
330
注册时间
2015-12-18
在线时间
32 小时
发表于 2015-12-30 14:32:59 | 显示全部楼层
刚刚也遇到同样的问题,受教了~
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2016-5-21 22:13:19 | 显示全部楼层
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2016-5-29 02:37:50 | 显示全部楼层
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-18
在线时间
18 小时
 楼主| 发表于 2016-7-27 20:50:44 | 显示全部楼层
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-8-3
在线时间
16 小时
发表于 2016-9-19 16:50:02 | 显示全部楼层
解决了没有啊?  到底是哪儿出问题了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 08:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表