WINCE6.0+ILI9806E驱动IC显示屏调试总结
显示屏部分原理图如下:
图1
显示屏采用的驱动IC是ILI9806E_IDT,支持多种分辨率,但此显示屏只支持480*800。显示屏VCC(30)引脚接到驱动IC的VCI引脚,VCI的供电范围是2.5V ~ 3.6V,IOVCC(31)引脚接到驱动IC的IOVCC,IOVCC的供电范围是1.65V ~ 3.6V。
我们暂时是在之前也是RGB接口的硬件平台上飞线调试的,在调试过程中遇到下面一些问题,总结如下:
1. 显示深度偏白
整个图像严重深度偏白,但如果斜视显示屏就比较接近实际的图像颜色,显示图像如下:
图2
我们在设计VCC采用2.8V,IOVCC采用1.8V的,设计测试的时候IOVCC确实2.283V左右,这是因为CPU这边的GPIO是3.3V的,和IOVCC的1.8V有较大的压差,引起了电流倒灌,就导致了图2中显示不正常的现象,把VCC和IOVCC都接到2.8V就OK了。
3.276
2.792
2. 显示偏色
IOVCC问题解决后,虽然可以看到图像了,但还是偏色,如下图:
图3
很奇怪啊,我们目前已有的产品CPU显示控制器硬件上是用RGB666(但CPU这边软件上是采用RGB565,也就是一个像素16位的)来连接显示屏的RGB666,现在的接法也一样,为什么之前的可以正常显示,现在的显示屏就偏色呢?因为之前调试显示屏的时候也遇到过偏色问题,是因为CPU和显示屏的RGB没有对应后引起的,所以也就朝这个方向来努力,果然问题就在这里。
先来看下为什么之前的显示屏就可以正常显示
(1) 驱动IC引脚和RGB数据对应关系
原来的显示屏是TFT1N5676,驱动IC是HX8347-D_DS_T,此驱动IC把下面这些RGB数据接口作为显示屏接口引出去:
图4
此驱动IC支持6-/16-/18-bit RGB 接口,RGB数据位和引出的数据引脚如下图:
图5
可知R和B都是最高位对齐。
(2) CPU和显示屏的原理图
接着我们来看原理图部分:
图6
CPU显示控制器虽然用RGB666的连接方式,但CPU软件上采用的是RGB565,驱动IC选择的是RGB666,结合图5来看,就算CPU软件采用RGB565,驱动IC采用RGB666,那么系统这边送过来的R[4:0]还是可以送到驱动IC对应的R[5:1],B[4:0]还是可以送到驱动IC对应的R[5:1]最高位到最低位,而驱动IC的R0和B0是采用默认是随机值,因为都是最低位,所以对R和B颜色的影响非常小,不影响使用。其中CPU和驱动IC的RGB对应关系如下
RGB数据-------CP引脚-------连接符号-------显示屏引脚--------显示屏符号--------驱动IC RGB数据
R[5:0]----------GPD[15:10]----------VD[17:12]--------10:15----------DB[17:12]------------R[5:0]
R实际只有5位,这样CPU这边还是能够把R最高位送到驱动IC R的最高位
R4(最高位)-----------GPD15------------------VD17-------------10----------------DB17------R5(最高位)
R3-----------------------GPD14------------------VD16-------------11----------------DB16------R4
R2-----------------------GPD13------------------VD15-------------12----------------DB15------R3
R1-----------------------GPD12------------------VD14-------------13----------------DB14------R2
R0(最低位)-----------GPD11------------------VD13-------------14----------------DB13------R1
-----------------------GPD10------------------VD12-------------15----------------DB12------R0(最低位)
G[5:0]----------GPD[7:2]----------VD[11:6]--------16:21----------DB[11:6]------------G[5:0]
G5(最高位)-----------GPD7------------------VD11-------------16----------------DB11------G5(最高位)
G4-----------------------GPD6------------------VD10-------------17----------------DB10------G4
G3-----------------------GPD5------------------VD9---------------18----------------DB9-------G3
G2-----------------------GPD4------------------VD8---------------19----------------DB8-------G2
G1-----------------------GPD3------------------VD7---------------20----------------DB7-------G1
G0(最低位)---------- GPD2------------------VD6---------------21----------------DB6-------G0(最低位)
B[5:0]----------GPC[15:10]----------VD[5:0]--------22:27----------DB[5:0]------------B[5:0]
B实际只有5位,这样CPU这边还是能够把B最高位送到驱动IC B的最高位
B4(最高位)-----------GPC15------------------VD5-------------22----------------DB5------B5(最高位)
B3-----------------------GPC14------------------VD4-------------23----------------DB4------B4
B2-----------------------GPC13------------------VD3-------------24----------------DB3------B3
B1-----------------------GPC12------------------VD2-------------25----------------DB2------B2
B0(最低位)-----------GPC11------------------VD1-------------26----------------DB1------B1
-----------------------GPC10------------------VD0-------------27----------------DB0------B0(最低位)
接下来看我们新驱动ILI9806E_IDT为什么会出现显示偏色
(1) 驱动IC引脚和RGB数据对应关系
图7
可以看到此驱动IC支持16/18/24bit,都是最低位对齐,恰好和之前的驱动IC最高位对齐相反
(2) CPU和显示屏的原理图
显示屏厂家给的初始化代码默认也是选择18bit的,因为之前的OK,所以也就没有修改这里,我们CPU硬件连接还是采用之前的RGB666,CPU软件采用RGB565,原理图如下:
图8
RGB数据-------CP引脚-------连接符号-------显示屏引脚--------显示屏符号--------驱动IC RGB引脚
R[5:0]----------GPD[15:10]----------VD[17:12]--------19:14----------DB[21:16]------------R[5:0]
R实际只有5位,根据原理图设计,CPU这边还是能够把R最高位送到驱动IC R的最高位
R4(最高位)-----------GPD15------------------VD17-------------19----------------DB21------R5(最高位)
R3-----------------------GPD14------------------VD16-------------18----------------DB20------R4
R2-----------------------GPD13------------------VD15-------------17----------------DB19------R3
R1-----------------------GPD12------------------VD14-------------16----------------DB18------R2
R0(最低位)-----------GPD11------------------VD13-------------15----------------DB17------R1
-----------------------GPD10------------------VD12-------------14----------------DB16------R0(最低位)
G[5:0]----------GPD[7:2]----------VD[11:6]--------13:8----------DB[13:8]------------G[5:0]
G5(最高位)-----------GPD7------------------VD11-------------13----------------DB13------G5(最高位)
G4-----------------------GPD6------------------VD10-------------12----------------DB12------G4
G3-----------------------GPD5------------------VD9---------------11----------------DB11-------G3
G2-----------------------GPD4------------------VD8---------------10----------------DB10-------G2
G1-----------------------GPD3------------------VD7---------------9------------------DB9-------G1
G0(最低位)---------- GPD2------------------VD6---------------8------------------DB8-------G0(最低位)
B[5:0]----------GPC[15:10]----------VD[5:0]--------7:2----------DB[5:0]------------B[5:0]
B实际只有5位,这样CPU这边还是能够把B最高位送到驱动IC B的最高位
B4(最高位)-----------GPC15------------------VD5-------------22----------------DB5------B5(最高位)
B3-----------------------GPC14------------------VD4-------------23----------------DB4------B4
B2-----------------------GPC13------------------VD3-------------24----------------DB3------B3
B1-----------------------GPC12------------------VD2-------------25----------------DB2------B2
B0(最低位)-----------GPC11------------------VD1-------------26----------------DB1------B1
-----------------------GPC10------------------VD0-------------27----------------DB0------B0(最低位)
如果CPU显示控制器这边采用RGB565,显示屏驱动IC这边必须要选择为18bit的,如果选择为16bit的就偏色,但如果驱动IC这边一定要选择16bit,那么CPU和显示屏这边就一定要都是两边RGB完全对应起来。
3. 开机logo上面部分没有显示
如下图:
图9
原因是为480*800的bmp logo分配Flash的block少了,我们采用的Flash一个block=64page=64*2112Bytes,解析此图片的时候大小为1152054,需要1152054/(64*2112)=8.5blocks,之前分配的是6个blocks。
4. 刷机后可以启动,重启不能正常启动
读取9个bolck的logo数据=9*64*2112=0x129000,0x32000000+0x129000=0x32129000,而0x80300000+0x1d3f800=0x8203F800,恰好logo占用的空间和OS的有重叠
为什么刷机可以正常启动呢?是因为刷机是先读取logo再读取OS的,而正常启动是先读取OS再读取logo,所以存在这个差别。
5. 系统启动白屏、黑屏和显示倒过来
Eboot阶段显示正常,在开机后进入进入WINCE开机界面(还没有看到)就白屏(此概率很高,但也偶尔能够可以正常看到WINCE界面),很奇怪,要么全部开机之后都是白屏,刚开始怀疑是硬件问题,但发现白屏的时候就是加载显示驱动的时候,进过排查,原来是
S3C2450Disp() --->DevInitialize()--->DevOutputEnableRGBIF()--->
IOCTL_SVE_FIMD_SET_OUTPUT_RGBIF--->Disp_initialize_port_RGBIF()
此函数下面把LCD_CS配置成为输入引起了此问题,但奇怪的是之前的产品为什么就不存在这个问题。