TSC2046
- 1> 项目概述
- 2> 硬件设计
- 3> TSC2046
- 3.1> TSC2046功能
- 3.2> TSC2046控制命令
- 3.3> 控制命令总结
- 3.4> SPI协议
- 3.5> 数据转换
- 4> 软件编程
- 4.1> 实现功能
- 4.2> 编程思路
- 4.3> SPI驱动
- 4.4> TSC2046驱动
- 5> 联调测试
- 5.1> VBAT的1/4分压
- 5.2> MOSI波形测试
- 5.2> MISO波形测试
- 6> 复盘总结
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数据输出;