从上节内容可以知道,检测触摸屏按下和计算触点坐标是通过S1到S5五个开关来完成的,通过控制五个开关在不同时候的关断与闭合就可以得到触点的XY坐标。
通过2440的芯片手册来查看触摸屏是怎么工作的。
首先,通过8:1的多路选择器我们可以选择控制哪路通道。
然后是触摸屏的接口模式:
- 正常转换模式。用于常规的ADC转换,通过设置ADCCON来初始化ADC,通过读写ADCDAT0来完成转换。
- 分离的X/Y转换模式。逐个测量X/Y坐标,X坐标保存在ADCDAT0,并且会产生中断,Y坐标保存在ADCDAT1中,同样也会产生一个中断。
- 自动的X/Y转换模式。不需要单独的读取X/Y坐标,可以一次性的测量X/Y坐标然后一起读取,只需要产生一次中断。
- 等待中断模式。等待按下或者松开,等待Xp从高电平变为低电平,或者从低电平变为高电平。
编程要点
- ADC转换数据可以通过中断或者轮询方式获取。中断模式下,ADC转换数据的获取会有一点延时,这是因为中断的进入和退出会有一些额外的开销;在轮询方式下,可以通过查询ADCCON[15]来确定数据是否转换完成。
- 推荐使用的是另一个方式。在ADCCON[1]被设为1后,当转换数据被读取后,自动开始下一次转换。
之后就是寄存器的操作,通过ADCTSC寄存器来控制S1-S5开关的关断和闭合。
除了寄存器方面的配置,还有中断方面的配置。
ADC/触摸屏会产生中断,这些中断会发给中断控制器,再由中断控制器发给CPU。其中,中断控制器有寄存器使能/禁止中断的功能。
下图是2440芯片手册中关于中断的流程图。
查看芯片手册,发现ADC和触摸屏共用同一个中断源。
查看SRCPND,第31位表示是否有ADC中断请求,根据上一个图的描述可知,发生触摸屏中断时这一位也会被置1,即触摸屏中断和ADC中断共用同一个中断源向量。
还有INTMOD寄存器,这是选择快中断还是普通模式的中断。
INTMSK寄存器。根据中断的执行框图,在普通中断模式下,发生某个中断时,SRCPND中对应的位会被置1,通过设置INTMSK寄存器,可以选择是否屏蔽该中断的请求。而在快中断模式下,INTMSK寄存器不起作用。
INTPND控制器,表明正在处理某个中断,同样的,该寄存器只在IRQ模式下起作用,在FIQ模式下不起作用。
SUBSRCPND寄存器,bit10表示ADC中断,bit9表示触摸屏中断。
INTSUBMSK寄存器,bit10和bit9分别是ADC中断和触摸屏中断的屏蔽位。
通过SUBSRCPND和INTSUBMSK,我们就可以分辨出是ADC中断还是触摸屏中断了。
总结一下,在IRQ模式下,ADC中断和触摸屏中断会一起发出,可以通过SUBSRCPND来分辨,通过INTSUBMSK来屏蔽,然后发给SRCPND,再通过INTMSK和INTMOD发给CPU。
那么,怎么写程序呢?
- 初始化ADC/TS接口;
- 设置TS处于等待中断模式;
- 设置中断:INTSUBMSK和INTMSK,防止被屏蔽不发给CPU;
- 按下,进入TS中断:a.进入自动采集模式;b.启动ADC;
- ADC中断:a.读数据;b.再次进入“等待中断模式”;c.启动定时器;
- 定时器中断:a.若松开,结束;b.若按下,跳到4.b进行循环。