1.1.ADC知識
ADC(AnalogtoDigitalConverter),可以接收8個通道的模擬信號輸入,并將它們轉(zhuǎn)換為10位的二進制。在2.5MHz的A/D轉(zhuǎn)換時鐘下,最大轉(zhuǎn)化速率可達500KSPS(SPS:samplespersecond,每秒采樣次數(shù))。
1.2.觸摸屏硬件知識
觸摸屏是當今最流行的一種人機交互接口,它被廣泛地應用于手機等消費類電子產(chǎn)品中,目前這種技術(shù)有向PC機方向發(fā)展的趨勢。基于原理的不同,觸摸屏可以分為電阻式、電容式、表面聲波式等。電阻式是應用較廣的一種觸摸屏,它的原理是通過測量橫向和縱向的電阻值來獲得觸點的坐標。
1.3.電阻式觸摸屏工作原理原理
觸摸屏附著在顯示器的表面,與顯示器相配合使用,如果能測量出觸摸點在屏幕上的坐標位置,則可根據(jù)顯示屏上對應坐標點的顯示內(nèi)容或圖符獲知觸摸者的意圖。觸摸屏按其技術(shù)原理可分為五類:矢量壓力傳感式、電阻式、電容式、紅外線式、表面聲波式,其中電阻式觸摸屏在嵌入式系統(tǒng)中用的較多。電阻觸摸屏是一塊4層的透明的復合薄膜屏,如圖2所示,最下面是玻璃或有機玻璃構(gòu)成的基層,最上面是一層外表面經(jīng)過硬化處理從而光滑防刮的塑料層,中間是兩層金屬導電層,分別在基層之上和塑料層內(nèi)表面,在兩導電層之間有許多細小的透明隔離點把它們隔開。當手指觸摸屏幕時,兩導電層在觸摸點處接觸。
觸摸屏的兩個金屬導電層是觸摸屏的兩個工作面,在每個工作面的兩端各涂有一條銀膠,稱為該工作面的一對電極,若在一個工作面的電極對上施加電壓,則在該工作面上就會形成均勻連續(xù)的平行電壓分布。如圖4所示,當在X方向的電極對上施加一確定的電壓,而Y方向電極對上不加電壓時,在X平行電壓場中,觸點處的電壓值可以在Y+(或Y-)電極上反映出來,通過測量Y+電極對地的電壓大小,便可得知觸點的X坐標值。同理,當在Y電極對上加電壓,而X電極對上不加電壓時,通過測量X+電極的電壓,便可得知觸點的Y坐標。電阻式觸摸屏有四線和五線兩種。四線式觸摸屏的X工作面和Y工作面分別加在兩個導電層上,共有四根引出線,分別連到觸摸屏的X電極對和Y電極對上。五線式觸摸屏把X工作面和Y工作面都加在玻璃基層的導電涂層上,但工作時,仍是分時加電壓的,即讓兩個方向的電壓場分時工作在同一工作面上,而外導電層則僅僅用來充當導體和電壓測量電極。因此,五線式觸摸屏的引出線需為5根。
1.4.S3C2440觸摸屏接口
SOCS3C2440的觸摸屏接口是與ADC接口結(jié)合在一起的,框圖如下:
轉(zhuǎn)換速率:當PCLK=50MHz時,分頻設為49,則10位的轉(zhuǎn)換計算如下:
WhentheGCLKfrequencyis50MHzandtheprescalervalueis49,
A/Dconverterfreq.=50MHz/(49+1)=1MHz
Conversiontime=1/(1MHz/5cycles)=1/200KHz=5us
ThisA/Dconverterwasdesignedtooperateatmaximum2.5MHzclock,sotheconversionratecangoupto500KSPS.
觸摸屏接口的模式有以下幾種:
普通ADC轉(zhuǎn)換模式
獨立X/Y位置轉(zhuǎn)換模式
自動X/Y位置轉(zhuǎn)換模式
等待中斷模式
我們主要接受觸摸屏接口的等待中斷模式和自動X/Y位置轉(zhuǎn)換模式(驅(qū)動程序中會用到):
自動轉(zhuǎn)換模式操作流程如下:觸摸屏控制器自動轉(zhuǎn)換X,Y的觸摸位置,當轉(zhuǎn)換完畢后將數(shù)據(jù)分別存放在寄存器ADCDAT0和ADCDAT1.并產(chǎn)生INT_ADC中斷通知轉(zhuǎn)換完畢。
等待中斷模式:
TouchScreenControllergeneratesinterrupt(INT_TC)signalwhentheStylusisdown.WaitingforInterruptModesettingvalueisrADCTSC=0xd3;//XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En.
當觸摸后,觸摸屏控制器產(chǎn)生INT_TC中斷,四個引腳設置應該為:
引腳
XP
XM
YP
YM
狀態(tài)
PULLUP/XPDisable
Disable(初始值即是)
Disable
Enable
設置
1
0
1
1
當中斷產(chǎn)生后,X/Y的位置數(shù)據(jù)可以選擇獨立X/Y位置轉(zhuǎn)換模式,和自動X/Y位置轉(zhuǎn)換模式進行讀取,采用自動X/Y位置轉(zhuǎn)換模式進行讀取需要對我們已經(jīng)設置的TSC寄存器進行更改,在原有的基礎上或上S3C2410_ADCTSC_PULL_UP_DISABLE|S3C2410_ADCTSC_AUTO_PST|S3C2410_ADCTSC_XY_PST(0)。
數(shù)據(jù)轉(zhuǎn)換完畢后,也會產(chǎn)生中斷。
2.芯片手冊
3.mini2440電路圖
4.S3C2440寄存器
ADCCONADC控制寄存器
主要設置分頻,通道選擇,有8路(AIN0~AIN3YMYPXMXP),啟動A/D轉(zhuǎn)換等。
ADCTSC觸摸屏控制寄存器
設置工作模式,普通ADC轉(zhuǎn)換模式、獨立X/Y位置轉(zhuǎn)換模式、自動X/Y位置轉(zhuǎn)換模式、等待中斷模式。
ADCDLY延遲寄存器
可以設置開始中斷到真正開始A/D轉(zhuǎn)換這段時間的延時長度,它的時鐘源頻率為3.68MHz。
ADCDAT0/ADCDAT1
X軸坐標值寫入寄存器ADCDAT0的低10位中,Y軸坐標寫入寄存器ADCDAT1的低10位中。
ADCUPDN抬起/落下
觸筆抬起/落下中斷狀態(tài)寄存器ADCUPDN的低2位能夠判斷觸筆在何種狀態(tài)下引起的中斷。
touch.h
[cpp]view plaincopy
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:touch.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:觸摸屏驅(qū)動(中斷方式).
*FunctionList:
*History:
******************************************************************/
#ifndef__TOUCH_H__
#define__TOUCH_H__
#defineADC_FREQ2500000//==ADC轉(zhuǎn)換頻率2.5M
#defineADC_PRS(50000000/ADC_FREQ-1)//==ADC預分頻值
#defineADC_DELAY50000//==(1/50M)*50000=1ms
#defineDBG_TOUCH_LEVEL1
/*函數(shù)聲明*/
voidTouchInit(void);
#endif
touch.c
[cpp]view plaincopy
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:touch.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:觸摸屏驅(qū)動(中斷方式).
*FunctionList:
*History:
******************************************************************/
#include"common.h"
#include"core.h"
#include"touch.h"
intxdata,ydata;//==坐標數(shù)據(jù)
/********************************************************************
函數(shù)功能:觸摸屏中斷函數(shù)。
入口參數(shù):無。
返回:無。
備注:無。
********************************************************************/
staticvoid__irqTouchIntHandler(void)
{
staticunsignedlongulSaveAdcdly;
rSRCPND|=BIT_ADC;//清除這兩個中斷才能產(chǎn)生新的中斷
rINTPND|=BIT_ADC;
/*轉(zhuǎn)換完成中斷*/
if(rSUBSRCPND&BIT_SUB_ADC)
{
rSUBSRCPND|=BIT_SUB_ADC;//清除子中斷
while(!(rADCCON&0x8000));//checkifEC(EndofConversion)flagishigh,Thislineisnecessary~!!
xdata=(rADCDAT0&0x3ff);
ydata=(rADCDAT1&0x3ff);//[0..9]做轉(zhuǎn)換后的數(shù)據(jù)A
DbgPrintX(DBG_TOUCH_LEVEL,"rx:%d;y:%dn",xdata,ydata);
rADCTSC=0xd3;//Waitingforinterrupt
rADCTSC=rADCTSC|(1<<8);//Detectstylusupinterruptsignal.
}
/*筆按下中斷*/
if( r