由于原来用的320*240的屏厂家不再生产,推出了一款同样的新屏,这周一直在调试屏的驱动。
屏的时序和寄存器和原来完全相同,但换上去后,上下不停的闪,初步怀疑为帧同步不对。MCU用的是ADI的BF531,与LCD之间通过SPI配置寄存器,PPI传输数据,行同步和帧同步分别为time1和time2中断,尝试修改了timer2的脉宽和周期,效果不大。
查看屏的文档和相关寄存器,时序和寄存器还是和原来无区别。原来的代码里只配置了R02和R0E寄存器,R02寄存器为Operation Control Register, 这个不配置会导致红屏,但配置默认值也可以,如果不配就是不行; R0E寄存器VCOMDC Level Control Registe,主要是配置VCOMDC的电压,配置的为5V,如果不配置会白屏。详细查看了别的寄存器,也没看出个所以然来。
这时硬件部老大过来查看进度,问询了相关情况后,定义为“不一定是软件问题,可能硬件时序存在问题”,LCD的时序一直未测过,可能时序并不是特别充裕,先量下时序看看,是否满足LCD文档中的要求。
今天量了下屏的相关时序,初步定义为数据和时钟的时序不对应,数据应该在上升沿采样,下降沿切换数据,但实际的时序却相反,准备修改时序。查阅了一下午的BF531的手册,跟PPI相关的也就那么几个寄存器,只有PPI_DELAY,PPI_COUNTER, PPI_CONTROL, PPI_STATE, PPI_FRAME,根本没有跟时序相关的,没有配置上升下降沿,甚至连一个配置PPI_CLK的都没有,只好继续求助硬件。
所有的外围器件都是通过CPLD来进行管理,在CPLD里对SPI的CLK进行反向,大工告成,屏可不闪了。
可重新开机后,屏还是会有时颜色不对,有时比较蒙,看来明天还得继续。
总结:
写这篇文章的主要目的,并不是为了记录什么高深的学问,主要体现一种思想----软硬结合,当遇到问题是,软件不能一味的改代码,应该认真分析问题,在无果时及时找硬件和其他相关人员,进行研讨,考虑各种可能性,软件,硬件,CPLD,FPGA等一起查找,这样才能快速准确的定位并解决问题。
再举一例,上半年的一个产品:
公司原来的产品MCU都是DSP,准备切换到ARM,运行Linux,在一款新产品上进行试验。在调试过程中遇到一个严重但随机的问题,放在那,动不动就死机,可整死个人,查了整整两个多月,整个产品完全延期。先查驱动,只跑系统,完全没有问题,但跑上层软件后就会死机。怀疑上层应用,一块一块代码的屏蔽,把屏幕部分屏蔽就好了,基本不死机。继续怀疑代码在上层部分,查屏的Buffer操作是否有问题,又尝试了好久,无果。将代码跑到相关的开发板上,程序能正常运行,不会死机,但ARM部分电路完全同开发板。请厂家,技术支持,硬件查电路图,看代码,还是无果。BOSS出马了,召集所有人,硬件,软件,所有的老大,分析问题,查问每个现象,把每种可能分下去,一一排查。硬件那边灵感来了,查看PCB时,发现LCD和DDR之间用几根线离得比较近,可能会相互影响。把LCD那几根线断开,跑程序,经过长时间的测试,高低温测试,不存在问题。终于把问题给定位出来了,这也算一例软硬结合的完美案例。