JZ2440 第14章 ADC和触摸屏接口

本章目标:

    了解S3C2410/S3C2440和触摸屏的结构;
    了解电阻触摸屏的工作原理和等效电路图;
    了解S3C2410/S3C2440触摸屏控制器的多种工作模式;
    掌握S3C2410/S3C2440 ADC和触摸屏的编程方法;

14.1 ADC和触摸屏硬件介绍及使用

14.1.1 S3C2410/S3C2440 

    S3C2410/S3C2440  的ADC可以接收8个通道的模拟信号输入,并将它们转换
为10位的二进制数据。在2.5MHz的A/D转换时钟下,最大的转化速率可达500K
SPS(SPS:samples per second,每秒的采样次数)。
    S3C2410/S3C2440   都提供触摸屏的接口,不过它们有所不同。S3C2410的
触摸屏接口向外提供4个控制信号引脚(nYPON、YMON、nXPON、XMON)和2
个模拟信号输入引脚(AIN[7]、AIN[5]),这6个引脚通过4个晶体管与触摸屏的4个
引脚相连。而S3C2440提供了与触摸屏直接连接的4个引脚,不需要外接晶体管。
    S3C2410/S3C2440 ADC和触摸屏接口有如下特性:
        ·分辨率:10位;
        ·微分线性度误差:±1.0LSB;
        ·积分线性度误差:±2.0LSB;
        ·最大转换速率    :500KSPS;
        ·低功耗;
        ·供电电压            :3.3V;
        ·输入模拟电压范围:0~3.3V;
        ·片上采样保持功能;
        ·普通转换模式;
        ·分离的x/y轴坐标转换模式;
        ·自动(连续)x/y轴坐标转换模式;
        ·等待中断模式。
    ADC和触摸屏接口结构如图14.1、14.2所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
     从图14.1、14.2可知,ADC和触摸屏接口只有一个ADC转换器,可以通过设置寄存器来选择对
哪路模拟信号(多大8路)进行采样。图中有两个中断信号:INT_ADC、INT_TC,前者表示A/D转换
器已经转换完毕,后者表示触摸屏被按下了。
    对于S3C2410,在使用触摸屏时,AIN[7]和AIN[5]被用来测量XP、YP的电平,只剩下AIN[6]、
AIN[4:0]共6个引脚用于一般的ADC输入。
    对于S3C2440,在使用触摸屏时,引脚XP、XM、YP、YM被用于和触摸屏直接相连,只剩下
AIN[3:0]共4个引脚用于一般的ADC输入。
    当不使用触摸屏时,XP、XM、YP、YM这4个引脚也可以用于一般的ADC输入。
    S3C2410与触摸屏的连接比S3C2440复杂,需要增加几个外接晶体管,如图14.3所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
14.1.2 S3C2410/S3C2440 ADC接口的使用方法
    ADC的启动方式有两种:手工启动、读结果时就自动地启动下一次转换。也有两种方法获
知当前转换是否结束:查询状态位、转换结束时发出中断。
    ADC的操作只涉及到3个寄存器:ADCCON、ADCTSC、ADCDAT0。下面介绍它们的用
法,有关触摸屏的数据位将在14.1.3小节介绍。
    这两个寄存器的格式如表14.1、14.2所示。
JZ2440 第14章 ADC和触摸屏接口
 JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口JZ2440 第14章 ADC和触摸屏接口
     ADC的使用分为4个步骤:
(1)设置ADCCON寄存器,选择输入信号通道,设置A/D转换器的时钟。
    使能A/D转换器时钟的预分频功能时,A/D时钟的计算公式如下:
        A/D时钟 = PCLK / (PRSCVL + 1);
    注意:A/D时钟最大为2.5MHz,并且应该小于PCLK的1/5.
(2)设置ADCTSC寄存器,使用设为普通转换模式,不使用触摸屏功能。
    ADCTSC寄存器多用于触摸屏,对于普通ADC,使用它的默认值即可,或设置其位[2]
为0。ADCTSC寄存器的格式在14.13小节介绍。
(3)设置ADCCON寄存器,启动A/D转换。
    如果设置READ_START位,则读转换数据(读ADCDAT0寄存器)时即启动下一次
转换;否则,可以通过设置ENABLE_START位来启动AD转换。
(4)转换结束时,读取ADCDAT0寄存器获得数值。
    如果使用查询方式,则可以不断读取ADCCON寄存器的ECFLG位来确定转换是否结束;
否则可以使用INT_ADC中断,发生INT_ADC中断时表示转换结束。

14.1.3 触摸屏原理及接口

1. 电阻触摸屏原理
    触摸屏的种类有很多,比如超声波触摸屏、红外触摸屏、电容触摸屏、电阻触摸屏等。
电阻触摸屏由于造价低廉,在电气上可以直接接入用户的系统中而得到大量使用。电阻
触摸屏有几种类型,比如“四线”、“五线”和“八线”。线越多,精度就越高,温度漂移也越
少,但基本的操作是一样的。它本质上是个电阻分压器,将矩形区域中触摸点(x、y)的物
理位置转换为代表x坐标和y坐标的电压。
    S3C2410/S3C2440 的触摸屏接口可以驱动四线电阻触摸屏,四线电阻触摸屏的等效
电路如图14.4所示。图中粗线表示相互绝缘的两层导电层,当按压时,它们在触电处相连;
不同的触点在x、y方向上的分压值不同,将这两个分压值经过A/D转换后即可得到x、y坐标。
    下面根据其等效电路说明触摸屏的工作过程。
(1)平时触摸屏没有被按下时,等效电路如图14.5所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
     S4、S5闭合,S1、S2、S3断开,即YM接地、XP上拉、XP和YP作为模拟输入(对CPU而
言)、XM高阻。
    平时触摸屏没有按下时,由于上拉电阻的关系,Y_ADC为高电平:当x轴和y轴受挤压而接触
导通后,Y_ADC的电压由于连通道y轴接地而变为低电平,此低电平可作为中断触发信号来通知
CPU发生“Pen Down”事件,在S3C2410/S3C2440中,称为等待中断模式。
(2)采样X_ADC电压,得到x坐标,等效电路如图14.6所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
     S1、S3闭合,S2、S4、S5断开,即XP接上电源、XM接地、YP作为模拟输入(对CPU
而言)、YM高阻、XP禁止上拉。这时,YP即X_ADC就是x轴的分压点,进行AD转换后
就得到x坐标。
(3)采样Y_ADC电压,得到y坐标,等效电路如图14.7所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
     S2、S4闭合,S1、S3、S5断开,即YP接电源、YM接地、XP作为模拟输入(对CPU
而言)、XM高阻、XP禁止上拉。这时,XP即Y_ADC就是y轴的分压点,进行AD转换后
就得到y坐标。
2.S3C2410/S3C2440触摸屏接口
    与上面描述的触摸屏工作过程的3个步骤对应,触摸屏控制器也有4种工作模式。
(1)等待中断模式(Waiting for Interrupt Mode)
    设置ADCTSC寄存器位0xD3即可令触摸屏控制器处于这种模式。这时,它在等待触摸
屏被按下。当触摸屏被按下时,触摸屏控制器将发出INT_TC中断信号,此时触摸屏控制
器要转入以下两种工作模式中的一种,以读取x、y坐标。
    对于S3C2410,当触摸屏被按下或松开时,都产生INT_TC中断信号。
    对于S3C2440,可以设置ADCTSC寄存器的位[8]为0或1,表示等待按下中断或松开中断。
(2)分离的x/y轴坐标转换模式(Separate X/Y Position Conversion Mode)
    这分别对应上述触摸屏工作过程的第2、3步骤。设置ADCTSC寄存器为0x69进入x轴
坐标转换模式,x坐标值转换完毕后被写入ADCDAT0,然后发出INT_ADC中断;相似地,
设置ADCTSC寄存器位0x9a进入y轴坐标转换模式,y坐标值转换完毕后被写入ADCDAT1,
然后发出INT_ADC中断。
 (3)自动(连续)x/y轴坐标转换模式
    上述触摸屏的工作过程2、3可以合并成一个步骤,设置ADCTSC寄存器为0x0C,进入
自动x/y轴坐标转换模式,触摸屏控制器就会自动转换触摸点的x、y坐标值,并分别写入
ADCDAT0、ADCDAT1寄存器中,然后发出INT_ADC中断。
(4)普通转换模式
    不使用触摸屏时,触摸屏控制器处于这种模式。在这种模式下,可以通过设置ADCCON
寄存器启动普通的A/D转换,转换完成时数据被写入ADCDAT0寄存器中。
    14.1.2小节讲述ADC接口就是工作于这种模式。
    ADCTSC寄存器被用来选择触摸屏的工作模式,它的格式如表14.3所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
     注意:① 处于等待中断模式时,XP_SEN必须设为1(XP接模拟输入)、PULL_UP必须设为0(使能上拉)。
                 ② AUTO_PST设为1时,必须处于自动x/y轴坐标转换模式下。
    对于S3C2410,当触摸屏控制器处于等待中断模式时,触摸屏被按下时可以不断发出INT_TC
中断信号以便进入自动x/y轴坐标转换模式转换x、y坐标。发出中断信号的间隔可以通过ADCDLY
寄存器来设置。
    对于S3C2440,当CPU处于休眠模式时,触摸屏被按下时可以不断发出INT_TC中断信号以唤
醒CPU。发出中断信号的间隔可以通过ADCDLY寄存器来设置。
    另外,对于普通转换模式、分离的x/y轴坐标转换模式、自动x/y轴坐标转换模式,都可以通过
ADCDLY寄存器来设置采样的延时时间。
    ADCDLY寄存器格式如表14.4所示,在等待中断模式时,延时时钟为X-tal(3.68MHz),其他情况
为PCLK,可以如图14.8所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口JZ2440 第14章 ADC和触摸屏接口
     ADCDAT1寄存器的格式如表14.5所示。它与ADCDAT0寄存器格式相似,ADCDAT1
寄存器中保存y坐标值;而ADCDAT0中保存x坐标值或普通AD转换值。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口

14.2 ADC和触摸屏操作实例

14.2.1 硬件设计

    本开发板中,模拟输入引脚AIN0、AIN1外接可调电阻器,电路图如图14.9所示。
JZ2440 第14章 ADC和触摸屏接口
JZ2440 第14章 ADC和触摸屏接口
     图中两个电阻可调,程序将通过AIN0、AIN1这两个通道采集、转换电压值。
    触摸屏的接口是标准的,它的电路图如图14.4所示。

14.2.2 程序设计

    本实例程序将提供一个菜单,可以从中选择测试ADC或触摸屏。当测试ADC是,程序
不断测量AIN0、1的电压,并在串口上显示出来。当测试触摸屏时,只是测试触笔按下、
松开的事件,并且把按下时的采集到的x,y坐标打印出来,它们只是原始的数据。
    本实例的源码在/work/hardware/adc_ts目录下,主要文件为adc_ts.c。main.c文件
通过串口输出两个菜单共用户选择是测试ADC还是触摸屏,它们分别对应adc_ts.c中的
Test_ADC、Test_Ts函数。

14.2.3 测试ADC的代码详解

1.ADC主入口函数Test_Adc
    ADC测试函数Test_Adc代码如下:
    第106、107行先调用ReadAdc函数发起AD转换,返回10位转换数值(最大为1023);
然后计算实际的电压值。
2.ReadAdc函数:设置、启动ADC,获取转换结果
    ADC操作核心函数ReadAdc,代码如下:
1
68 /*
2
69行  *使用查询方式读取AD转换值
3
70行  *输入参数:
4
71行  *    ch:模拟信号通道,取值为0~7
5
72行  */
6
73 static int ReadAdc(int ch)
7
74 {
8
75    //选择模拟通道,使能预分频功能,设置AD转换器时钟 = PCLK/(49+1)
9
76    ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);
10
77
11
78    //清除位[2],设为普通转换模式
12
79    ADCTSC &= ~(1 << 2);
13
80    
14
81    //设置位[0]为1,启动AD转换
15
82    ADCCON |= ADC_START;
16
83
17
84    //当AD转换真正开始时,位[0]会自动清0
18
85    while(ADCCON & ADC_START)
19
86
20
87    //检测位[15],当它为1时表示转换结束
21
88    while(!(ADCCON & ADC_ENDCVT));
22
89
23
90    //读取数据
24
91    return (ADCDAT0 & 0x3ff);
25
92 }
    程序与前面介绍的ADC的4个步骤一一对应。
    (1)第76行选择模拟通道,使能预分频功能,设置AD转换器的时钟。
    本程序中,PCLK为50MHz,所以AD转换器的时钟为50MHz/(49+1) = 1MHz,小于
最大AD时钟2.5MHz。
    (2)第79行参考ADCTSC寄存器格式表14.3。
    (3)ADC的启动方式有两种,如果使用“读启动”(此时ADCCON寄存器位[1]被设为
1),则读一下ADCDAT0寄存器即可启动;如果使用手动方式,设置ADCCON寄存器位[0]即可
启动。
    (4)第88行循环检测方式,也可以使用中断方式,当AD转换结束时,ADC会发出
INT_ADC中断信号。
    (5)最后,第91行读取ADCDAT0即可得到转换的数据(低10位有效数据)。

14.2.4 测试触摸屏代码详解

    触摸屏的操作稍微复杂,下面将流程图和控制状态转换图合并一起(14.10),以便
后面的代码分析。
JZ2440 第14章 ADC和触摸屏接口JZ2440 第14章 ADC和触摸屏接口 
1.触摸屏的主入口函数Test_Ts
    Test_Ts函数进行初始化、开启ADC中断之后,就不再参与触摸屏的操作,这都通过中
断服务程序来完成。代码如下:
    第192行设置ADC中断处理函数。
    本程序中,PCLK为50MHz,所以AD转换器的时钟为50MHz/(49+1) = 1MHz,小于最大AD转换时钟2.5MHz。
    第205行调用宏wait_down_int(),令触摸屏控制器进入“等待中断模式”,等待触摸屏被按下。
    wait_down_int()、wait_up_int()、mode_auto_xy()都是宏定义,用于设置触摸屏进入
“等待Pen Down中断模式”、“等待Pen Up中断模式”、“自动x/y轴坐标转换模式”。读者可
以参考14.1.3节的“S3C2410/S3C2440触摸屏接口”理解这些代码。
    需要注意以下几点:
    (1)对于S3C2410,ADCTSC的位[8]属于保留位,只能设为0;
            当处于“等待中断模式”时,无论“Pend Down”中断还是“Pen Up”中断都可以检测到。
    (2)对于S3C2440,ADCTSC的位[8]为0、1时分别表示等待Pen Down中断或Pen Up
中断。
    (3)要进入“自动x/y轴坐标转换模式”,XP、XM、YP、YM的状态不必理会,触摸屏在
采样时会自动控制它们。
    这些宏的定义如下:
1
/*设置进入等待中断模式,XP_PU、XP_Dis、XM_Dis、YP_Dis、YM_En
2
 *(1)对于S3C2410,位[8]只能为0,所以只能使用下面的wait_down_int;
3
 *    它既等待Pen Down中断,也等待Pen Up中断。
4
 *(2)对于S3C2440,位[8]为0、1时分别表示等待Pen Down中断或Pen Up中断
5
 */
6
/*进入“等待中断模式”,等待触摸屏被按下*/
7
#define wait_down_int()    { ADCTSC = DOWN_INT | XP_PULL_UP_EN | \
8
                                      XP_AIN | XM_HIZ | YP_AIN | YM_GND | \
9
                                      XP_PST(WAIT_INT_MODE); }
10
/*进入“等待中断模式”,等待触摸屏被松开*/
11
#define wait_up_int()      { ADCTSC = UP_INT   | XP_PULL_UP_EN | \
12
                                      XP_AIN | XM_HIZ | YP_AIN | YM_GND | \
13
                                      XP_PST(WAIT_INT_MODE); }
14
15
/*进入自动x/y轴坐标转换模式*/
16
#define mode_auto_xy()     { ADCTSC = CONVERT_AUTO | XP_PULL_UP_DIS | \
17
                                      XP_PST(NOP_MODE); }
    然后,程序就在第208行等待串口输入,以退出等待。等待期间,完全通过中断来驱
动触摸屏的操作。
    最后,退出时,第211~213行屏蔽ADC中断。
2.触摸屏中断处理函数:转换触摸屏的工作模式
    从图14.10可知,执行Test_Ts函数之后,触摸屏控制器处于“等待Pen Down中断模
式”。这时,如果按下触摸屏,则发生INT_TC中断,进入AdcTsIntHandle中断处理函数。
它很简单,只是判断当前中断是否是INT_TC还是INT_ADC,然后分别调用它们的中断
服务程序,代码如下:
    INT_TC的中断服务程序Isr_Tc代码如下:
1
115 /*
2
116行  *INT_TC的中断服务程序
3
117行  *按下时,进入自动x/y轴坐标转换模式
4
118行  *松开始,进入等待中断模式,再次等待INT_TC中断
5
119行  */
6
120 static void Isr_Tc(void)
7
121 {
8
122    if(ADCDAT0 & 0x8000)                //松开中断
9
123    {
10
124        printf("\nStylus Up!!\n");
11
125        wait_down_int();                /*进入“等待中断模式”,等待按下*/
12
126    }
13
127    else                                //按下中断
14
128    {
15
129        printf("\nStylus Down: ");
16
130
17
131        mode_auto_xy();                /*进入自动x/y轴坐标转换模式*/
18
132
19
133        /*设置位[0]为1,启动AD转换
20
134行         *注意:ADCDLY为50000,PCLK = 50MHz
21
135行         *     要经过(1/50MHz) * 50000 = 1ms之后才开始转换x坐标
22
136行         *     再经过1ms之后才开始转换y坐标
23
137行         */
24
138        ADCCON |= ADC_START;
25
139    }
26
140
27
141    //清除INT_TC中断
28
142    SUBSRCPND |= BIT_SUB_TC;
29
143    SRCPND    |= BIT_ADC;
30
144    INTPND    |= BIT_ADC;
31
145 }
    第122行首先判断是按下还是松开中断,如果是松开中断,表示触碰完成。
    第125行中通过wait_down_int()宏令触摸屏控制器进入“等待Pen Down
中断模式”,等待下一次操作。
    如果是按下中断,则在131行通过mode_auto_xy()宏令触摸屏控制器进入
“自动x/y轴坐标转换模式”,然后在138行启动AD转换。也可以使用“分离的x/y
轴坐标转换模式”手动地分别转换x、y坐标。
3. 在ADC中断处理函数中获取x、y坐标
    在“自动x/y轴坐标转换模式”下,x、y坐标都转换完毕之后,产生INT_ADC
中断,进入AdcTsIntHandle中断处理函数,它进而调用INT_ADC的中断服务
程序Isr_Adc,代码如下:
1
148 /*
2
149行  *INT_ADC的中断服务程序
3
150行  *AD转换结束时发生中断
4
151行  *先读取x\y坐标值,再进入等待中断模式
5
152行  */
6
153 static void Isr_Adc(void)
7
154 {
8
155    //打印x、y坐标值
9
156    printf("xdata = %4d, ydata = %4d\r\n", (int)(ADCDAT0 & 0x3ff), (int)(ADCDAT1 & 0x3ff));
10
157    
11
158    /*判断是2410还是2440*/
12
159    if((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
13
160    {    //S3C2410
14
161        wait_down_int();    /*进入“等待中断模式”,等待触摸屏松开*/
15
162    }
16
163    else
17
164    {    //S3C2440
18
165        wait_up_int();       /*进入“等待中断模式”,等待触摸屏松开*/
19
166    }
20
167
21
168    //清除INT_ADC中断
22
169    SUBSRCPND |= BIT_SUB_ADC;
23
170    SRCPND    |= BIT_ADC;
24
171    INTPND    |= BIT_ADC;
25
172 }
    首先,第156行从ADCDAT0、ADCDAT1寄存器中读出x、y坐标值,并打印出来。
    然后,通过第161或165行(对于S3C2410)或158行(对于S3C2440)令触摸屏控制器
进入“等待Pen Up中断模式”,等待触摸屏松开。
    S3C2410的触摸屏控制器既等待PenDown中断,也等待Pen Up中断;
    S3C2440触摸屏中断器可以分开设置:等待按下或等待松开。

14.2.5 实例测试

    本程序在main函数中通过串口输出一个菜单,用于选择测试ADC或触摸屏。操作步骤
如下:
    (1)使用串口将开发板的COM0和PC的串口相连,打开PC上的串口工具 并设置其波
特率为115200、8N1。
    (2)生成可执行程序,adc_ts_2410或adc_ts_2440,烧入NAND Flash后运行。
               在ADC_TS目录下执行“make”命令,生成adc_ts.bin。
    (3)在PC上串口工具可以看到如下菜单:
        #### Test ADC and Touch Screem ####
        [A] Test ADC
        [B] Test Touch Screen
        Enter your selection:
    (4)输入"A"以测试ADC,可以看到如下字样:
        Measuring the voltage of AIN0 and AIN1,press any key to exit
        AIN0 = 1.102V    AIN1 = 1.108V
        然后使用螺丝刀调整可变电阻ADJ0、ADJ1,可以在串口工具上看到它们的电压值不断变化。
        最后,按任意键退回选择菜单。
    (5)输入“T”以测试触摸屏,可以看到如下字样:
        Touch the screem to test, press any key to exit
        点击触摸屏可以在串口工具上看到触点坐标,可以看到类似下面字样:
        Stylus Down: xdata = 489, ydata =516
        松开触摸屏时可以看到如下提示:
        Stylus Up!!
        最后按任意键返回选择菜单。
        注意:触摸屏的实际使用中还要考虑初始校正、去抖动、拖曳等功能。
附:代码:
链接: https://pan.baidu.com/s/1kV24a9L 密码: tfab