XPT2046程序例程(STM32F103C8T6)

一、前言

        本例程是使用XPT2046 AD转换IC采集电位器的数值,并通过串口调试助手打印数据。所使用的是库函数进行编写。

二、XPT2046 概述

(一)功能说明

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

(二)主要特性

  • 工作电压范围为1.5V~5.2V
  • 支持1.5V~5.2V的数字I/O口
  • 内建2.5V参考电压源
  • 电源电压测量(0V~6V)
  • 内建结温测量功能
  • 触摸压力测量
  • 采用3线制SPI通信接口
  • 具有自动省电功能

(三)引脚功能描述

引脚号名称说明
1BUSY忙时信号线。当CS#为高电平时为高阻态
2DIN

串行数据输入端。当CS#为低电平时,数据在DCLK上升沿锁存

3CS#片选信号。控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电
4DCLK外部时钟信号输入
5VCC电源输入端
6XPXP位置输入端
7YPYP位置输入端
8XNXN位置输入端
9YNYN位置输入端
10GND接地
11VBAT电池监视输入端
12AUXADC辅助输入端
13VREF参考电压输入端
14IOVDD数字电源输入端
15PENIRQ#笔接触中断引脚
16DOUT串行数据输出端。数据在DCLK的下降沿移出,当CS#高电平为高阻态

(四)基本原理

        XPT2046是一种典型的逐渐逼近模数转换器,包含了采样、保持模数转换、串口数据输出等功能。同时芯片集成有一个2.5V的内部参考电压源、温度检测电路,工作时使用外部时钟。XPT2046可以单电源供电,电源电压范围为2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入1V~VCC范围内的参考电压(要求外部参考电压源输出阻抗低)。X、Y、Z、Vbat、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式。选择Vbat、Temp和AUX时应该配置为单端模式;作为触摸屏应用时,应该配置为差分模式,这可以在效消除由于驱动开关的寄生电阻及外部干扰带来的测量误差,提高转换精度。

(五)时序

        XPT2046数据接口是串行接口,其典型工作时序如下图所示,图中展示的信号来自带有基本串行接口单片机或数据信号处理器。处理器和转换器之间的通信需要8个时钟周期,可采用SPI、SSI和Microwire等同步串行接口。一次完整的转换需要24个串行同步时钟(DCLK)来完成。数据高位先发。

         控制字节由DIN输入控制,它用来启动转换,寻址,设置ADC分辨率,配置以及进行掉电控制。

        起始位:第一位,即S位。控制字的首位必须是1,即S=1。在XPT2046的DIN引脚检测到起始位前,所有的输入将被忽略。

        地址:接下来的3位(A2  A1 A0)选择现行通道,触摸屏驱动和参考源输入。

        MODE:模式选择位,用于设置ADC的分辨率。MODE=0,下一次的转换将是12位模式;MODE=1,下一次转换将是8位模式。

        SER/DFR: SER/DFR位控制参考源模式,选择单端模式( SER/DFR=1),或者差分模式( SER/DFR=0)。

        PD0和PD1:展示了掉电和内部参考电压配置的关系。

(六)控制命令  ​​​​​

 三、硬件设计

 四、程序

1、引脚初始

void XPT2046_Pin_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

	//打开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

2、XPT2046写函数

void XPT2046_Write(u8 dat) 
{
	u8 i = 0;

	DCLK = 0;
	for (i = 0; i < 8; i++)
	{
		DIN = dat >> 7;  	//放置最高位
		dat <<= 1;
		DCLK = 0;
		DCLK = 1;
	}
}

3、XPT2046读函数

uint16_t XPT2046_Read(void)
{
	uint16_t i = 0, val = 0;
	
	DCLK = 0;
	for (i = 0; i < 12; i++)
	{
		val <<= 1;
		
		DCLK = 1;
		DCLK = 0;
		val |= DOUT;
	}
	
	return val;
}

4、XPT2046读数据函数

uint16_t XPT2046_Read_Date(u8 cmd)
{
	uint16_t value = 0;
	
	DCLK = 0;
	CS = 0;
	XPT2046_Write(cmd);
	delay_us(10);
	DCLK = 1;
	delay_us(5);
	DCLK = 0;
	delay_us(5);
	value = XPT2046_Read();
	CS = 1;
	
	return value;
}

5、主函数

int main(void)
{
	XPT2046_Pin_Init();
	Sys_Delay_Init();
	Usart1_Pin_Init(115200);
	printf("初始化成功\r\n");
	
	while(1)
	{
//		控制命令
//      AIN0     0x94 0xB4
//		AIN1     0xD4
//		AIN2     0xA4
//		AIN3     0xE4
		printf("电位器的值 = %d\r\n",XPT2046_Read_Date(0x94));
		delay_ms(500);
	}
}

五、实验结果

相关程序和资料,有需要者自行下载

网盘链接:

        链接:https://pan.baidu.com/s/1o3nnESh-Gzm9KvhAreXfXw 
        提取码:6ixw

 如有什么问题欢迎指出来,有什么模块可以联系博主,博主会查询资料分享出来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员超庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值