1.1. ADC知识
ADC(Analog to Digital Converter),可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制。在2.5MHz的A/D转换时钟下,最大转化速率可达500KSPS(SPS:samples per second,每秒采样次数)。
1.2. 触摸屏硬件知识
触摸屏是当今最流行的一种人机交互接口,它被广泛地应用于手机等消费类电子产品中,目前这种技术有向PC机方向发展的趋势。基于原理的不同,触摸屏可以分为电阻式、电容式、表面声波式等。电阻式是应用较广的一种触摸屏,它的原理是通过测量横向和纵向的电阻值来获得触点的坐标。
1.3. 电阻式触摸屏工作原理原理
触摸屏附着在显示器的表面,与显示器相配合使用,如果能测量出触摸点在屏幕上的坐标位置,则可根据显示屏上对应坐标点的显示内容或图符获知触摸者的意图。触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式、表面声波式,其中电阻式触摸屏在嵌入式系统中用的较多。电阻触摸屏是一块4层的透明的复合薄膜屏,如图2所示,最下面是玻璃或有机玻璃构成的基层,最上面是一层外表面经过硬化处理从而光滑防刮的塑料层,中间是两层金属导电层,分别在基层之上和塑料层内表面,在两导电层之间有许多细小的透明隔离点把它们隔开。当手指触摸屏幕时,两导电层在触摸点处接触。
触摸屏的两个金属导电层是触摸屏的两个工作面,在每个工作面的两端各涂有一条银胶,称为该工作面的一对电极,若在一个工作面的电极对上施加电压,则在该工作面上就会形成均匀连续的平行电压分布。如图4所示,当在X方向的电极对上施加一确定的电压,而Y方向电极对上不加电压时,在X平行电压场中,触点处的电压值可以在Y+(或Y-)电极上反映出来,通过测量Y+电极对地的电压大小,便可得知触点的X坐标值。同理,当在Y电极对上加电压,而X电极对上不加电压时,通过测量X+电极的电压,便可得知触点的Y坐标。电阻式触摸屏有四线和五线两种。四线式触摸屏的X工作面和Y工作面分别加在两个导电层上,共有四根引出线,分别连到触摸屏的X电极对和Y电极对上。五线式触摸屏把X工作面和Y工作面都加在玻璃基层的导电涂层上,但工作时,仍是分时加电压的,即让两个方向的电压场分时工作在同一工作面上,而外导电层则仅仅用来充当导体和电压测量电极。因此,五线式触摸屏的引出线需为5根。
1.4. S3C2440触摸屏接口
SOC S3C2440的触摸屏接口是与ADC接口结合在一起的,框图如下:
转换速率:当PCLK=50MHz时,分频设为49,则10位的转换计算如下:
When the GCLK frequency is 50MHz and the prescaler value is 49,
A/D converter freq. = 50MHz/(49+1) = 1MHz
Conversion time = 1/(1MHz / 5cycles) = 1/200KHz = 5 us
This A/D converter was designed to operate at maximum 2.5MHz clock, so the conversion rate can go up to 500 KSPS.
触摸屏接口的模式有以下几种:
普通ADC转换模式
独立X/Y位置转换模式
自动X/Y位置转换模式
等待中断模式
我们主要接受触摸屏接口的等待中断模式和自动X/Y位置转换模式(驱动程序中会用到):
自动转换模式操作流程如下:触摸屏控制器自动转换X,Y的触摸位置,当转换完毕后将数据分别存放在寄存器ADCDAT0和ADCDAT1.并产生INT_ADC中断通知转换完毕。
等待中断模式:
Touch Screen Controller generates interrupt (INT_TC) signal when the Stylus is down. Waiting for Interrupt Modesetting value is rADCTSC=0xd3; // XP_PU, XP_Dis, XM_Dis, YP_Dis, YM_En.
当触摸后,触摸屏控制器产生INT_TC中断,四个引脚设置应该为:
引脚 | XP | XM | YP | YM |
状态 | PULL UP/XP Disable | Disable (初始值即是) | Disable | Enable |
设置 | 1 | 0 | 1 | 1 |
当中断产生后,X/Y的位置数据可以选择独立X/Y位置转换模式,和自动X/Y位置转换模式进行读取,采用自动X/Y位置转换模式进行读取需要对我们已经设置的TSC寄存器进行更改,在原有的基础上或上S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0)。
数据转换完毕后,也会产生中断。
2. 芯片手册
3. mini2440电路图
4. S3C2440寄存器
ADCCON ADC控制寄存器
主要设置分频,通道选择,有8路(AIN0~AIN3 YM YP XM XP),启动A/D转换等。
ADCTSC 触摸屏控制寄存器
设置工作模式,普通ADC转换模式、独立X/Y位置转换模式、自动X/Y位置转换模式、等待中断模式。
ADCDLY 延迟寄存器
可以设置开始中断到真正开始A/D转换这段时间的延时长度,它的时钟源频率为3.68MHz。
ADCDAT0/ADCDAT1
X轴坐标值写入寄存器ADCDAT0的低10位中,Y轴坐标写入寄存器ADCDAT1的低10位中。
ADCUPDN 抬起/落下
触笔抬起/落下中断状态寄存器ADCUPDN的低2位能够判断触笔在何种状态下引起的中断。
touch.h
/*******************************************************************
* Copyright (C),2011-2012, XXX.
* FileName: touch.c
* Author:HuangYinqing
* Version:1.0
* Date::2012-04-22
* Description:触摸屏驱动(中断方式).
* Function List:
* History:
******************************************************************/
#ifndef __TOUCH_H__
#define __TOUCH_H__
#define ADC_FREQ 2500000 //==ADC转换频率2.5M
#define ADC_PRS (50000000/ADC_FREQ-1) //==ADC预分频值
#define ADC_DELAY 50000 //==(1/50M)*50000=1 ms
#define DBG_TOUCH_LEVEL 1
/*函数声明*/
void TouchInit(void);
#endif
touch.c
/*******************************************************************
* Copyright (C),2011-2012, XXX.
* FileName: touch.c
* Author:HuangYinqing
* Version:1.0
* Date::2012-04-22
* Description:触摸屏驱动(中断方式).
* Function List:
* History:
******************************************************************/
#include "common.h"
#include "core.h"
#include "touch.h"
int xdata, ydata; //==坐标数据
/********************************************************************
函数功能:触摸屏中断函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
static void __irq TouchIntHandler(void)
{
static unsigned long ulSaveAdcdly;
rSRCPND |= BIT_ADC; //清除这两个中断才能产生新的中断
rINTPND |= BIT_ADC;
/*转换完成中断*/
if( rSUBSRCPND & BIT_SUB_ADC)
{
rSUBSRCPND |= BIT_SUB_ADC;//清除子中断
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
xdata = (rADCDAT0 & 0x3ff);
ydata = (rADCDAT1 & 0x3ff); //[0..9]做转换后的数据A
DbgPrintX( DBG_TOUCH_LEVEL, "\rx:%d;y:%d\n", xdata, ydata );
rADCTSC = 0xd3; //Waiting for interrupt
rADCTSC = rADCTSC|(1<<8); // Detect stylus up interrupt signal.
}
/*笔按下中断*/
if( rSUBSRCPND & (BIT_SUB_TC) )
{
rSUBSRCPND |= BIT_SUB_TC;//清除子中断
if( (!(rADCDAT0 & 0x8000)) && (!(rADCDAT1 & 0x8000)) )//笔是否按下
{
DbgPrintX( DBG_TOUCH_LEVEL, "\rStylus down\n" );
//自动连续X,Y坐标转换,xp不上拉
rADCTSC = (1<<3 ) | (1<<2);
ulSaveAdcdly = rADCDLY;
rADCDLY = 40000; //延时 (1/50M)*40000=0.8ms
//开始AD转换
rADCCON |= 0x1;
while( rADCCON & 0x1 ); //==检查启动是否完成
}
else
{
DbgPrintX( DBG_TOUCH_LEVEL, "\rStylus up\n" );
rADCDLY = ulSaveAdcdly;
//等待下次笔按下
//设置触摸屏为等待中断模式,等待触摸屏被按下
rADCTSC=0xd3;
}
}
}
/********************************************************************
函数功能:触摸屏初始化。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void TouchInit(void)
{
rADCDLY = ADC_DELAY; //==(1/50M)*50000=1 ms
rADCCON = ( ADC_PRS<<6 ) | (1<<14 ); //ADC频率2.5M
//==设置触摸屏为等待中断模式,等待触摸屏被按下
rADCTSC=0xd3;
pISR_ADC=(unsigned int)TouchIntHandler; //定义中断服务程序
rINTMSK &= ~(BIT_ADC);
rINTSUBMSK &= ~(BIT_SUB_TC);
rINTSUBMSK &= ~(BIT_SUB_ADC);
}