同事在开发板上接了一块7寸显示屏,为了省事,他没接背光灯。因为他在开发板上找不到高于9V的电源,而TFT显示屏说明书上说背光灯需要9V的电源。
调试过程中,LCD无论如何都点不亮,查阅了相关资料,TFT需要背光LCD提供光源,然后通过偏振光片,液晶分子,和滤光片来控制红绿蓝三种不同色彩通过的亮度,就可以显示不同的色彩。所以背光LCD是必须的,这家伙,真是坑爹。
背光灯的电源接上了,但LCD仍然是不亮。他找了了可调电源,慢慢地加电源,一直加到18V,背光灯才亮起来。说明书说9V是瞎说,又一个坑爹的家伙。
现在LCD显示一片空白,我们调试参驱动程序的参数,LCD是800x480的,按每秒刷60次算,我们给到26.6Mhz的时钟频率,用示波器测量,帧同步信号是60.6hz, 行同步信号是32khz左右,数据使能信号与行同步信号同步,其它的水平back porch, front porch, 都在预期范围内,但LCD仍然一片空白,同事拿起lcd左看看,右看看,忽然看到一个色块闪了一下,随即消失,那个色块正是我们用程序显示的色块,怀疑是lcd排线接触不好,重新拿了一块LCD,把排线用胶带纸粘牢,固定在Lcd背面,这一次可以看到色块了。
但是色块在不断闪动,而且垂直方向显示错位,大约每显示八行,就会整体向右移动大约32个点,整个色块显示成了锯齿状斜块,而且还在不断抖动。
但是如果跑一个死循环程序 while(1);,就可以正确显示,因为此程序几乎100%占用了CPU,使cpu没有时间做其它事情,因此也就没有机会干扰lcd控制器通过dma通道从内存中抓数据,因此显示正常,但当cpu做其它事情时,就会干扰dma读取数据。
我怀疑是dma抓数据的速度不够快,造成dma fifo枯竭,此时就会产生dma underflow 中断,lcd控制器读不到数据,就会显示空白,随后dma fifo中有了数据,等lcd控制器从中读到数据并且把它显示到显示屏上时,已经产生了向右的错位。
在中断服务程序中加上debug信息,果然,dma underflow 中断产生的频率太高了,大约每秒5万个,这当然会让显示产生扭曲。试着把lcd的刷新频率降到50hz, 显示正常了。但是一般lcd的刷新率都是60-72hz, 我们用50hz行不行呢,暂时这么着吧。快累死了。