在做触摸屏实验,其中读取XPT2046触摸芯片的函数不是很懂。程序如下:
static uint16_t TSC2046_ReadAdc(uint8_t _ucCh)
{
uint16_t usAdc;
TSC2046_CS_0(); /* 使能TS2046的片选 */
/*
TSC2046 控制字(8Bit)
Bit7 = S 起始位,必须是1
Bit6:4 = A2-A0 模拟输入通道选择A2-A0; 共有6个通道。
Bit3 = MODE ADC位数选择,0 表示12Bit;1表示8Bit
Bit2 = SER/DFR 模拟输入形式, 1表示单端输入;0表示差分输入
Bit1:0 = PD1-PD0 掉电模式选择位
*/
SPI_ShiftByte((1 << 7) | (_ucCh << 4)); /* 选择通道1, 测量X位置 */
/* 读ADC结果, 12位ADC值的高位先传,前12bit有效,最后4bit填0 */
usAdc = SPI_ShiftByte(0x00); /* 发送的0x00可以为任意值,无意义 */
usAdc <<= 8;
usAdc += SPI_ShiftByte(0x00); /* 获得12位的ADC采样值 */
usAdc >>= 3; /* c */
TSC2046_CS_1(); /* 禁能片选 */
return (usAdc);
}
如上,背景颜色为黄部分语句不是很懂:
疑问1:从ADC采样出来的值是12位,先读出高8位数据,然后再读出低4位数据,其中第二次读取的低字节数据最后4位为0.那为什么最后要usAdc >>= 3; 而不是向右移位4呢,不是有4个0位吗
疑问2:第一次发送数据SPI_ShiftByte((1 << 7) | (_ucCh << 4)); 是不是数据发送完,SPI的接受缓存器就已经收到了这12位 AD采样值了,而后面两次SPI_ShiftByte(0x00); 作用就是分别读高位字节和地位字节而已? |