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几,自行计算通道。