C51 - SPI_AD转换
TSC2046
1> 项目概述
51单片机模拟SPI总线,读取AD转换芯片TSC2046的4路转换值,通过串口发送到PC;
2> 硬件设计
MCU部分:
ADC部分:
3> TSC2046
3.1> TSC2046功能
TSC2046 有2个功能:
1》连接触摸屏(差分模式);
2》4路AD转换(单端模式);
3.2> TSC2046控制命令
3.3> 控制命令总结
XP引脚输入: 0b' 1001 0100; // 0x94;
YP引脚输入: 0b' 1101 0100; // 0xD4;
VBAT引脚输入:0b' 1010 0100; // 0xA4;
AUX引脚输入: 0b' 1110 0100; // 0xE4;
3.4> SPI协议
概述:
SPI(Serial Peripheral Interface)串行外设接口;
传输格式:
空闲态:
/CS = 1; - CLK = 0;- MOSI = 0;- MISO = 1;
起始位: CS拉低;
停止位:CS拉高;
写时序:MOSI放数据,然后 主机在CLK↑上升沿发送数据,循环8次;
BUSY信号:第9个CLK时产生忙信号,告诉主机正在转换数据;
读时序:第10个CLK↓下降沿,从机在MISO上发送数据,循环12次;
总结规律:
1> 主机在CLK上升沿,发送数据在MOSI上;
2> 从机在CLK下降沿,发送数据在MISO上;
时序参数:
3.5> 数据转换
因为TSC2046的分辨率为12位,所以2^12 = 4096;
4> 软件编程
4.1> 实现功能
51单片机模拟SPI总线,读取AD转换芯片TSC2046的4路转换值,通过串口发送到PC;
4.2> 编程思路
模块化,分层思路,使SPI驱动模块方便的被所以SPI设备调用,如TSC2046,DS1302等等
4.3> SPI驱动
/* @brief SPI write 1 byte* @param dat,8bit* @retval None*/
void SPI_WriteByte(uchar8_t dat)
{uchar8_t i = 0;for (i = 0; i < 8; i++) {ADC_SPI_MOSI = dat >> 7;dat <<= 1;ADC_SPI_CLK = 1;ADC_SPI_CLK = 0;}
}/* @brief SPI Read 1 byte* @param None* @retval data*/
uchar8_t SPI_ReadByte(void)
{uchar8_t i = 0;uchar8_t val = 0;for (i = 0; i < 8; i++) {ADC_SPI_CLK = 1;ADC_SPI_CLK = 0;val <<= 1;val |= ADC_SPI_MISO; } return val;
}
4.4> TSC2046驱动
ushort16_t TSC2046_ReadAD(uchar8_t chanel)
{ushort16_t val = 0; ADC_SPI_CLK = 0;ADC_SPI_MOSI = 0;ADC_SPI_CS = 0;SPI_WriteByte(chanel);Delay_5us();val = SPI_ReadByte();val <<= 8;val |= SPI_ReadByte();val >>= 4;ADC_SPI_CS = 1;return val;
}
5> 联调测试
5.1> VBAT的1/4分压
实验过程中发现VBAT引脚采样电压错误,阅读手册后发现VBAT引脚有1/4分压电路
5.2> MOSI波形测试
写VBAT通道
5.2> MISO波形测试
1》 CS拉低后,从机会拉低MISO;
2》后四位补0;
3》从机最后拉高MISO,释放其总线;
4》CLK下降沿,MISO数据输出;