藏经阁(九)触摸屏驱动芯片XPT2046 解析


一、前言

XPT2046可以作为12位的4通道输入的ADC来使用,也可以作为4线电阻触摸屏的驱动芯片来使用。下面介绍作为触摸屏驱动的使用原理及方法。
首先简单介绍一下4线电阻触摸屏的驱动原理。(详细介绍

电阻触摸屏内部结构:
在这里插入图片描述
当按下触摸屏时RX-、RX+、RY-、RY+的阻值会发生变化,测量到他们的阻值,就得到了按下的位置。
要得到X坐标,就在X+电极施加驱动电压V,X-接地,然后通过Y+或Y-测量电压值,就可以得到RX+、RX-的阻值关系了。
要得到Y坐标,就在Y+电极施加驱动电压V,Y-接地,然后通过X+或X-测量电压值,就可以得到RY+、RY-的阻值关系了。


二、XPT2046的介绍

XPT2046是一款4线制电阻式触摸屏控制器,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器。XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。 在2.7V的典型工作状态下,关闭参考电压,功耗可小于0.75mW。

XPT2046可以单电源供电,电源电压范围为2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入1V到VCC范围内的参考电压(要求外部参考电压源输出阻抗低)。

XPT2046没有内部时钟,因此它的动作全部受外部时钟控制,外部时钟由DCLK(16脚)输入。

X、Y、VBAT、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式。选择转换VBAT(7脚)、Temp(内部温度传感器)和AUX(8脚)时配置为单端模式;作为触摸屏应用时,配置为差分模式,这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换准确度。

1、先看其内部框图:

在这里插入图片描述

可以看到有一个多路选择器,负责选择哪一路送入后面的ADC进行采样。多路选择器的输入有:XPT2046的内部温度传感器,可以用来测量它自身的温度;VBAT引脚的输入经过R1和R2分压后的电压值,可以用来测量外部电池的电压值;AUX引脚的电压值;X-、X+、Y-、Y+引脚的电压值。

X-、X+、Y-、Y+引脚后面连接着MOS管,控制逻辑可以打开MOS管3和4把X-、Y-接地。也可以打开MOS管1和2把X+、Y+接VCC。

要测量X坐标时,就把MOS管1和3打开,然后多路选择器选择Y-或Y+进行采样。

2、引脚图和应用原理图

在这里插入图片描述
VBAT: 电池电源监控脚,不用悬空即可。

IN: ADC辅助通道,不用悬空即可。

VREF: 参考电压的输入引脚,当使用外部参考电压时连接参考电压到该脚,不用悬空即可。

PENIRQ: 笔触中断信号,当设置了笔触中断信号有效时,每当触摸屏被按下,该引脚被拉为低电平。当主控检测到该信号后,可以通过发控制信号来禁止笔触中断,从而避免在转换过程中误触发控制器中断。该引脚内部连接了一个50K的上拉电阻。

CS: 芯片选中信号,当CS_N被拉低时,用来控制转换时序并使能串行输入/输出寄存器以移出或移入数据。当该引脚为高电平时,芯片(ADC)进入掉电模式。

DCLK: 外部时钟输入,该时钟用来驱动SARADC的转换进程并驱动数字IO上的串行数据传输。

DIN: 芯片的数据串行输入脚,当CS为低电平时,数据在串行时钟DCLK的上升沿被锁存到片上的寄存器。

DOUT: 串行数据输出,在串行时钟DCLK的下降沿数据从此引脚上移出,当CS_N引脚为高电平时,该引脚为高阻态。

BUSY: 忙输出信号,当芯片接收完命令并开始转换时,该引脚产生一个DCLK周期的高电平。当该引脚由高点平变为低电平的时刻,转换结果的最高位数据呈现在DOUT引脚上,主控可以读取DOUT的值。当CS引脚为高电平时,BUSY引脚为高阻态。

3、参考电压

+REF和-REF之间的电压差决定了模拟输入的电压范围。在12位分辨率下,数据结果最小值为VREF/4096。

4、通信时序

在这里插入图片描述
通信的过程很简单,首先主机向XPT2046写入8个字节的控制字节,然后从XPT2046中读出转换数据即可,读出来的数据有16位,只有高12位是有效数据。控制字节的含义如下:

在这里插入图片描述
1)通道选择
在这里插入图片描述
2)、单端模式或差分模式的区别:
在这里插入图片描述
单端模式简单,在采样过程完成后,转换过程中可以关闭驱动开关,降低功耗。但这种模式的缺点是精度直接受参考电压源的精度限制,同时由于内部驱动开关的导通电阻存在,导通电阻与触摸屏电阻的分压作用,也会带来测量误差。

在这里插入图片描述
差分模式的优点是:+REF和-REF的输入分别直接接到YP、YN上,可消除由于驱动开关的导通电阻引入的坐标测量误差。缺点是:无论是采样还是转换过程中,驱动开关都需要接通,相对单端模式而言,功耗增加了。

3)、电源模式:
ADC的内部参考电压可以单独关闭或者打开,但是,在转换前,需要额外的时间让内部参考电压稳定到最终稳定值;如果内部参考源处于掉电状态,还要确保有足够的唤醒时间。ADC要求是即时使用,无唤醒时间的。另外还得注意,当BUSY是高电平的时候,内部参考源禁止进入掉电模式。XPT2046的通道改变后,如果要关闭参考源,则要重新对XPT2046写入命令。
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xpt2046触摸屏是一种常见的电容式触摸屏,可以通过SPI接口与单片机或嵌入式系统进行通信。在Linux系统中,可以通过编写驱动程序实现对xpt2046触摸屏的控制和数据读取。 以下是一个简单的xpt2046触摸屏Linux驱动的示例代码: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/spi/spi.h> #define XPT2046_CMD_X 0xD0 #define XPT2046_CMD_Y 0x90 #define XPT2046_MAX_X 4095 #define XPT2046_MAX_Y 4095 static struct spi_device *xpt2046_spi_dev; static int xpt2046_read_adc(u8 cmd) { u8 tx_buf[3] = {cmd, 0, 0}; u8 rx_buf[3] = {0, 0, 0}; struct spi_transfer transfer = { .tx_buf = tx_buf, .rx_buf = rx_buf, .len = 3, }; spi_sync_transfer(xpt2046_spi_dev, &transfer, 1); return ((rx_buf[1] << 8) | rx_buf[2]) >> 3; } static int xpt2046_read_touch(int *x, int *y) { int x_raw, y_raw; x_raw = xpt2046_read_adc(XPT2046_CMD_X); y_raw = xpt2046_read_adc(XPT2046_CMD_Y); *x = (x_raw * XPT2046_MAX_X) / 4096; *y = (y_raw * XPT2046_MAX_Y) / 4096; return 0; } static int xpt2046_probe(struct spi_device *spi_dev) { xpt2046_spi_dev = spi_dev; return 0; } static int xpt2046_remove(struct spi_device *spi_dev) { xpt2046_spi_dev = NULL; return 0; } static struct spi_driver xpt2046_spi_driver = { .driver = { .name = "xpt2046", .owner = THIS_MODULE, }, .probe = xpt2046_probe, .remove = xpt2046_remove, }; static int __init xpt2046_init(void) { return spi_register_driver(&xpt2046_spi_driver); } static void __exit xpt2046_exit(void) { spi_unregister_driver(&xpt2046_spi_driver); } module_init(xpt2046_init); module_exit(xpt2046_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("XPT2046 Touchscreen Driver"); ``` 此示例代码实现了一个简单的xpt2046触摸屏Linux驱动,可以通过SPI接口读取触摸坐标。在驱动程序中,首先定义了xpt2046触摸屏的命令码和最大坐标值。然后通过spi_sync_transfer()函数实现了SPI数据传输,读取x和y坐标。最后定义了驱动程序的初始化和退出函数,并注册到Linux内核中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值