各种小显示屏对玩单片机的人总是有吸引力的。现在网上可以淘到的各种屏(模块),比如LCD、OLED、ePaper,跟十几年前的液晶屏价格比起来就是白菜价了。而且网上有那种没有资料的“研究价”的电子玩意儿卖,价格低得离谱。玩没有资料的东西,就是乱折腾了(折腾之前慎重考虑是否值得花这个时间)。
我买过很多屏,买的时候想是屯着后面用(而且早些年即使不很贵的屏和现在比也贵了)……结果就是多年过去了也没做出几个带屏的东西来。
虽然我近两年淡出了DIY圈子,偶尔还是止不住收破烂的习惯复发。这次分享的是一块单色没有背光的LCD屏的逆向工作。我买过的屏当中这块尺寸是第二大的,不需要背光,估计对比度会不错。因为没有资料,买就是风险自担,我就当它是块高分辨率的图形液晶来搞了,买三块还不到五元,搞不定也损失不大。
屏的接口是26脚的FPC,而且上面的丝印还给了提示,第1脚和第26脚的功能就知道了。这种屏用COG封装,控制器芯片就在玻璃表面上(而不是在PCB上),背后由黑胶盖住。可以揭掉屏正面玻璃上那块黑胶布看到芯片的引脚。
要把这样的屏用起来,最关键的是要知道它的控制器芯片是什么型号。而识别控制器芯片的有效办法就是根据它的尺寸(裸片的长、宽)和印脚排布,去跟可能符合的控制芯片手册里的描述比对。我是没有见识过多少驱动控制器的,没有经验可循。
(见前一张图)从控制芯片将连出液晶的行列驱动线,这些线会在玻璃表面走,连到液晶像素矩阵去。从某些角度可以看到这些线的走向,但因为线很密集,需要用放大镜甚至显微镜才能区分其中每条线。我家没有体视显微镜,就动用了生物显微镜来凑合看。我数出来通往左或右边的行驱动线是80条,无疑这是一块 ???x160 规格的点阵屏,是值得搞一搞的。
于是上网查了一下160 行的常用驱动器型号,我运气不错,没费多少时间就找到一个吻合的:
余下的事情就是把FPC的引脚对应到芯片上去了。因为芯片周围——就是照片上黄色的矩形区域——我在显微镜下也看不出来走线,所以这部分只能猜了。因为玻璃上面只能走一层线,这里不会有交叉线的情况,所以按照芯片引脚的顺序理,难度不会很大。
已知26脚(最左边)是D7, 根据UC1611s的图,挨着的就必然是D6到D0了(设计使用8-bit并行总线接口),D15~D8就没有引出。
排线最右边是VB0+这个脚,所以看一下可以猜出相邻的都是升压电容的脚。
和FPC对照,可以确认这部分了。
电源和地的走线因为电流相对大,在芯片上用的脚比较多,所以FPC这边和玻璃上的线路连接点也会多些。FPC上的两面走线是容易分析的,根据左右顺序可以区别VSS和VDD.
于是容易判断的就整理出来了:
1…8 |
D7…D0 |
9 |
? |
10 |
? |
11 |
? |
12 |
? |
13 |
? |
14 |
VSS |
15 |
GND (FPC丝印) |
16 |
VDD |
17 |
? |
18 |
VLCD |
19 |
VA0- |
20 |
VA1- |
21 |
VA1+ |
22 |
VA0+ |
23 |
VB0- |
24 |
VB1- |
25 |
VB1+ |
26 |
VB0+ |
VDD和VLCD之间还有一个脚,从图上看觉得奇怪。我后来注意到是Recommended COG Layout图上是这么连的,把VLCD_OUT和VLCD_IN接在了一起。这块屏则像是把VLCD_IN, VLCD_OUT都引出来了。
剩下就5个引脚了,起控制作用。但是芯片的D0到VSS之间可比这还多了,就需要判断这5个是其中哪5个了,非得上电进行逻辑测试不可。
于是逆向工作告一段落,我需要弄块FPC转接板才能测试。
过了一段时间之后……(多久没做PCB了,这次还是自己画的)
接上屏,首先用万用表发现了14和15脚是相通的:很正常。然后通电测试了VDD和VSS没有问题。下面主要任务就是识别那5个待定的脚了。
给屏接了3.3V电压后,D7~D0这八个数据脚用万用表量并不是浮空的,这出乎我意料。而那五个待定脚都是浮空的——作为输入脚不带上下拉。下面就要控制这五个脚,观察数据脚的变动。我把它们接到Analog Discovery2 上面。
用Analog Discovery2的数字IO直接控制和观察,在电脑上操作比较方便。我手上没有更方便的工具了,如果用MCU或FPGA这些的话需要自己再开发一下。
UC1611s支持多种接口形式,这块屏可能只支持8位并行数据了。8080/6800模式都可能。
芯片上从D0到VSS间的引脚,按顺序有:
RST |
CS0 |
CD |
WR0 |
WR1 |
BM1 |
BM0 |
ID0 |
ID1 |
待定引脚是其中的5个,用排列组合法去试?没有必要穷举。怎么判断猜测是否正确?如果写一个UC1611s的驱动去让屏幕显示,根据是否能显示判断控制信号接得对不对,又引入可能出问题的其它环节了。
因为控制器是有“读”动作的,如果读正确,可以看到D7~D0的输出。
我就以“Get Status”操作,去试读取控制器的状态,看D7~D0上是否变化,输出数据是否吻合,来判断猜的对不对。
……这个过程中我犯了一个错误。因为已经隔了一断时间了,我电脑上PDF软件历史记录里面最近的是UC1698的手册,我误把控制器当成了UC1698去猜,虽然读到了Status字节,但内容怎么都对不上,跟芯片引脚也不完全对上,蹊跷了……耽误了些时间
发觉了错误并用回了UC1611s的手册之后,问题得以解决了。
发现的映射关系是:
RST |
CS0 |
CD |
WR0 |
WR1 |
BM1 |
BM0 |
ID0 |
ID1 |
9 |
|
10 |
11 |
12 |
|
|
13 |
|
这个屏没有把CS0引出,是我没有预计到的。
余下的事情就是把升压电荷泵用的电容接上,用STM32来进行驱动测试了。
设置基本驱动参数,用Set all pixel on命令让屏有反应:
最后,生成一些pattern的数据显示,验证完成。
通过这个显示内容确定了屏的分辨率是256x160像素。不是很高,也不要随便跟TFT比嘛,有时像素点不需要太小。
/************* THE END ***************/