AD数模转化

AD数模转化笔记

SPI_Write(cmd);
cmd 就是command的意思 命令!
表示spi 通信

代码

#include"XPT2046.h"

/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/

void SPI_Write(uchar dat)
{
	uchar i;
	CLK = 0;
	for(i=0; i<8; i++)
	{
		DIN = dat >> 7;  	//放置最高位
		dat <<= 1;
		CLK = 0;			//上升沿放置数据

		CLK = 1;

	}
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/

uint SPI_Read(void)
{
	uint i, dat=0;
	CLK = 0;
	for(i=0; i<12; i++)		//接收12位数据
	{
		dat <<= 1;

		CLK = 1;
		CLK = 0;//下降沿输出数据

		dat |= DOUT;

	}
	return dat;	
}

/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
	uchar i;
	uint AD_Value;
	CLK = 0;
	CS  = 0;
	SPI_Write(cmd);
	for( i=6; i>0; i--); 	//延时等待转换结果
	CLK = 1;	  //发送一个时钟周期,清除BUSY,跟着时序图来
	_nop_();
	_nop_();
	CLK = 0;
	_nop_();
	_nop_();
	AD_Value=SPI_Read();
	CS = 1;
	return AD_Value;	
}

注意事项

1.write 过程中,先DIN接收数据再上升沿锁存进去。(由于是模拟SPI通信,所以并不是很标准的SPI模式,这里必须要先输入数据再上升沿才不会出错)(而实际SPI通信中数据输入与上升沿是同时进行的)
2. read 过程中,是数据在DCLK下降沿时移出,即此(模拟IO口)时是先下降沿,再移出数据
3. 针对上述两个时序问题我们得出一个让口诀:先写上,再下输。
4. 这里着重一下,XP2046.C中最后一个读取AD转换值的程序中,先DCLK=0;再CS=0;严格按照时序图中来不可换顺序,否则会出现AD转换值不准确的后果。
5. 时序图在这里插入图片描述

CLK = 0;
for(i=0; i<12; i++)		//接收12位数据
{
	dat <<= 1;

	CLK = 1;
	CLK = 0;//下降沿输出数据

	dat |= DOUT;

}

6.控制字节的第0位和1位就是通道选择位,00,01,10,11代表0~3一共四个通道AIN0,AIN1,AIN2,AIN3
即PCF8591的控制字节。0x0几,自行计算通道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值