前言:
这个芯片的数据手册链接放在这里:xpt2046芯片手册
为了满足多种需要,目前国内外各半导体器件生产厂家设计并生产出了多种多样的ADC芯片。从性能上讲,它们有的精度高、速度快,有的则价格低廉。从功能上讲,有的不仅具有A/D转换的基本功能,还包括内部放大器和三态输出锁存器;有的甚至还包括多路开关、采样保持器等,已发展为一个单片的小型数据采集系统。
我这次选择的芯片是XPT2046芯片,XPT2046是一种典型的逐次逼近型模数转换器(SARADC),包含了采样/保持、模数转换、串口数据输出等功能。同时芯片集成有一个2.5V的内部参考电压源、温度检测电路,工作时使用外部时钟。 XPT2046可以单电源供电,电源电压范围为2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入1V~VCC范围内的参考电压(要求外部参考电压源输出阻抗低)。X、Y、Z、VBAT、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,作为ADC应用时,可以配置为单端或差分模式。选择VBAT、Temp和AUX时可以配置为单端模式;作为触摸屏应用时,可以配置为差分模式,这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换准确度。总之可以检测触摸屏上的压力,可以作为辅助输入、温度测量和电池监测等用处。
如果按照原理图这样接,将这个芯片作为A/D转换的话,有4个引脚接模拟信号输出设备,分别为:AIN0、AIN1、AIN2、AIN3。
限于篇幅,上面列举的只是芯片手册中的冰山一角,关于**芯片手册的链接我会放于文章最前面**,想要搞懂原理的可以看看芯片手册,毕竟会看芯片手册这都是基本操作。当我们对芯片手册有了大致的了解后,我们就可以着手编程,开始操作它,从而达到我们想要的效果了。
那么如何用mcu对芯片操作呢?
首先mcu按照芯片指定的时序图,发送一系列控制字命令(芯片不同,命令格式不同,有的会含有地址数据啥的),当芯片收到一系列控制字命令后就知道mcu的目的了,然后就会做一些处理取得mcu想要的数据,最后按照时序图给muc发过去就可以了。
mcu想要从另一边的芯片里获得想要的数据,这里可以做一个比喻:就好比我想向另一个地方的人询问消息,那是不是我们可以把想要问的东西写在纸上呀?好比写信,开头先来一句——某某某你好,然后就是我找你干什么呀?——即对应一系列的控制字命令。当然写信也不是随便写的,起码你写的内容对方要看得懂是吧。就要写对方看得懂的语言——即严格遵守控制字命令格式。然后就按照一定的路线图将纸条给人带过去——即遵守时序图规则。只有这样,对方才能正确接收到,并正确的进行解读信息,最后达到你的目的。
而这一系列操,即我们在开发中所遇到的最大问题,一般都可以在芯片手册中找到答案。
下面就来一一解读上面的难题
控制字命令由芯片DIN引脚输入,这个芯片的控制字命令格式如下: 控制字命令各位描述如下:
-
起始位——第一位,即 S 位。控制字的首位必须是 1,即 S= 1。在 XPT2046 的 DIN 引脚检测到起始位前,所有的输入将被忽略。
-
地址——接下来的 3 位( A2、 A1 和 A0)选择多路选择器的现行通道,触摸屏驱动和参考源输入。下面图就介绍了哪些引脚作为输入口时,与之对应的通道地址。
-
MODE——模式选择位,用于设置 ADC 的分辨率。 MODE= 0,下一次的转换将是 12 位模式;MODE= 1,下一次的转换将是 8 位模式。
-
SER/DFR非 位控制参考源模式,选择单端模式( SER/DFR非 = 1),或者差分模式( SER/DFR非 = 0),两个模式作用不同,差分模式用于触摸压力测量中;而单端模式用于其它测量中。(具体可看芯片手册)
-
PD0 和 PD1——低功率模式选择。
综上我们就相当于把信的写好了,接下来我们主要了解如何将信传递给对方了(芯片)
上时序图: XPT2046 数据接口是串行接口,处理器和芯片之间的的通信需要 8 个时钟周期,可采用 SPI、 SSI 和Microwire 等同步串行接口。一次完整的转换需要 24 个串行同步时钟( DCLK)来完成。大致流程:
1、前 8 个时钟用来通过DIN引脚输入控制字节——即完成我要找谁,我要让它干什么?的事情。 2、芯片接收命令后,进入采样模式。 3、接下来的12 个时钟周期将完成真正的模数转换。因为这里选择的是12位模式,当然也可以选择8位模式,区别只是8位模式比12位模式的分辨率小,分辨率越大,测量得越精细。 其它剩余的4个时钟周期,就填充无效数据(填充零比特)。
从时序图中知道,我们主要用到四个引脚,分别时:cs非(片选使能)、DCLK(提供时钟信号)、DIN(输入数据)、DOUT(输出数据).
1.对引脚初始化
上代码:
2.发送8位控制字命令
我们这里选择12位的模式、单端模式、选择低功耗。参照我们的原理图,通道地址(A2 、A1 、A0)为110,选择图如下。所以最终的控制命令字为:1110 0100——0xE4
上代码:
!!!注意:芯片接收到命令后,需要等待一定的时间让它测量数据,有的芯片手册会明确告诉我们等待的时间是多少,但这个芯片手册里貌似没有明说,但问题不大。我们从时序图中也可以知道这个等待时间是一个时钟周期。
3.接收对方的测量数据
这里的数据位数为12位。如果是16位的话,我们可以写一个函数,一次用于接收8位数据,然后连续接收两次就可以了,最后把数据合并。(最后多接收的4位数据反正也是0,不会影响数据大小的)
这里12位同理也可以采用这种方法。这里我采用另外一种方法:一次就把12位数据接收完。 上代码:
4.打包函数,一次性获得测量值
上代码: