2. 触摸屏硬件接口:I2C、SPI、USB触摸屏协议解析、硬件设计注意事项
各位工程师朋友,咱们接着聊。上一章我们把触摸屏的物理原理和选型讲透了,这一章要深入到底层通信了。说白了,触摸屏就是个外设,它得跟主控芯片“说话”。怎么说话?就是通过I2C、SPI、USB这些接口。
我个人习惯,在设计初期就把接口选型定死。为什么?因为接口直接决定了你的PCB走线、主控资源占用、甚至抗干扰能力。你想想看,一个电容屏用I2C,一个电阻屏用SPI,背后的设计思路完全不一样。
2.1 I2C接口:最常用的“两线制”
I2C在工业HMI里用得最多。为什么?因为它简单。两根线:SCL(时钟)和SDA(数据),就能挂一堆设备。我见过很多新手工程师,觉得I2C简单就随便画,结果调试时死活读不到数据。
核心要点:I2C是半双工,主从模式。触摸屏通常作为从设备,地址一般是0x38或0x39(7位地址)。
咱们看一个典型的I2C触摸屏初始化流程:
// 伪代码:I2C触摸屏初始化
uint8_t touch_addr = 0x38 << 1; // 7位地址左移,留出R/W位
// 1. 复位触摸芯片
I2C_WriteByte(touch_addr, 0x00, 0x01); // 写寄存器0x00,复位
delay_ms(10);
// 2. 配置采样率
I2C_WriteByte(touch_addr, 0x02, 0x0A); // 设置采样率为10ms
// 3. 读取设备ID确认通信
uint8_t id = I2C_ReadByte(touch_addr, 0x03);
if(id != 0x5A) {
// 通信失败,检查硬件
printf("Touch IC not found!\n");
}
嗯,这里要注意。I2C的速率在工业环境里通常设成100kHz或400kHz。我试过用1MHz,结果在长线缆(超过30cm)时波形严重畸变。为什么?因为I2C是开漏输出,上拉电阻和线缆电容会形成RC低通滤波。你想想看,频率越高,信号衰减越厉害。
实战技巧:上拉电阻选4.7kΩ还是2.2kΩ?我一般这样选:如果线长小于10cm,用4.7kΩ;如果线长超过20cm,用2.2kΩ。但别小于1kΩ,否则功耗太大。
2.2 SPI接口:高速传输的首选
SPI比I2C快得多。全双工,四线制(SCK、MOSI、MISO、CS)。工业HMI里,如果触摸屏需要上报多点触控数据(比如10点以上),或者刷新率要求高(>200Hz),我建议用SPI。
我曾经在一个项目里,客户要求触摸屏支持10点触控,采样率100Hz。用I2C,每次读数据要发几十个字节,400kHz下根本跑不动。换成SPI,10MHz轻松搞定。
SPI触摸屏的典型时序:
// SPI读取触摸坐标(假设使用Wacom协议)
uint8_t spi_read_touch(uint8_t reg) {
uint8_t data;
CS_LOW(); // 片选拉低
SPI_ExchangeByte(reg); // 发送寄存器地址
data = SPI_ExchangeByte(0); // 读取数据
CS_HIGH(); // 片选拉高
return data;
}
// 批量读取多点数据
void spi_read_multi_touch(touch_point_t *points) {
CS_LOW();
SPI_ExchangeByte(0x80); // 读命令,最高位置1
for(int i = 0; i < MAX_TOUCH_POINTS; i++) {
points[i].x = SPI_ExchangeByte(0) << 8 | SPI_ExchangeByte(0);
points[i].y = SPI_ExchangeByte(0) << 8 | SPI_ExchangeByte(0);
points[i].status = SPI_ExchangeByte(0);
}
CS_HIGH();
}
避坑指南:我曾经遇到过SPI通信偶尔丢包的问题。排查了三天,最后发现是CS片选信号没有做去毛刺处理。触摸屏的CS引脚如果受到干扰,会误触发片选。解决方案:在CS引脚上加一个10nF电容到地,或者软件上做CS电平的多次采样确认。
2.3 USB接口:即插即用的便利
USB触摸屏在工业HMI里相对少见,但也不是没有。比如一些外接的触摸显示器,或者需要热插拔的场景。USB触摸屏通常遵循HID协议,系统会自动识别为“触摸屏”设备。
USB协议比I2C/SPI复杂得多。它需要枚举、描述符、端点配置。我一般不建议在资源紧张的MCU上直接做USB触摸屏,除非你用了带USB OTG的高性能芯片。
USB触摸屏的数据格式(HID报告描述符示例):
// HID报告描述符(简化版)
0x05, 0x0D, // Usage Page (Digitizers)
0x09, 0x04, // Usage (Touch Screen)
0xA1, 0x01, // Collection (Application)
0x09, 0x20, // Usage (Stylus)
0xA1, 0x00, // Collection (Physical)
0x09, 0x32, // Usage (In Range)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0x81, 0x02, // Input (Data,Var,Abs)
0x09, 0x30, // Usage (Tip Pressure)
0x15, 0x00, // Logical Minimum (0)
0x25, 0xFF, // Logical Maximum (255)
0x75, 0x08, // Report Size (8)
0x95, 0x01, // Report Count (1)
0x81, 0x02, // Input (Data,Var,Abs)
0xC0, // End Collection
0xC0 // End Collection
说实话,USB协议栈的代码量很大。我建议直接用现成的USB库,比如STM32的USB Device库或者TinyUSB。自己从头写?除非你想被折磨。
2.4 硬件设计注意事项
这部分是重点中的重点。我踩过的坑,你们就别再踩了。
2.4.1 走线布局
- 差分对?不需要。 I2C和SPI都是单端信号,但SCL和SDA要尽量靠近走,减少环路面积。
- 远离高频噪声源。 触摸屏接口线不要跟电源、PWM信号、电机驱动线平行走。我见过一个案例,触摸屏线跟逆变器线走了30cm平行线,结果触摸完全失灵。
- 长度控制。 SPI时钟线(SCK)和数据线(MOSI/MISO)长度差不要超过5mm。否则高速时会出现时序偏移。
2.4.2 电源与滤波
| 接口类型 | 供电电压 | 推荐滤波电容 | 注意事项 |
|---|---|---|---|
| I2C | 1.8V / 3.3V | 100nF + 10μF | 上拉电阻接VCC |
| SPI | 3.3V / 5V | 100nF + 4.7μF | CS引脚加10nF去毛刺 |
| USB | 5V (VBUS) | 1μF + 10μF | D+/D-加ESD保护 |
重要提醒:触摸屏的VCC和GND之间,一定要加一个100nF的陶瓷电容,而且要尽量靠近触摸芯片的引脚。我见过有人把电容放在5cm之外,结果纹波噪声直接导致触摸坐标抖动。
2.4.3 ESD保护
工业环境里,静电放电是家常便饭。触摸屏是直接暴露在外的,ESD防护必须到位。
- I2C/SPI接口: 在SCL、SDA、CS等引脚上,加TVS管(比如PESD5V0S1UB)。注意TVS管的结电容要小于5pF,否则会影响信号上升沿。
- USB接口: D+/D-必须加ESD保护二极管,推荐NUP2105L。VBUS上也要加TVS管。
- 外壳接地: 触摸屏的金属边框要接到系统地,而不是浮空。我遇到过一台设备,触摸屏边框没接地,人一碰就死机。
2.4.4 线缆与连接器
如果触摸屏和主板是分离的(比如通过FPC排线连接),要注意:
- FPC排线长度: 不要超过15cm。超过这个长度,I2C信号会严重衰减。如果必须长距离,用SPI或者转成差分信号(比如RS-422)。
- 屏蔽: 如果排线经过强干扰区域(比如变频器附近),用带屏蔽层的FPC,或者套磁环。
- 连接器选型: 工业环境推荐用带锁扣的FPC连接器,防止振动导致接触不良。我吃过这个亏,客户现场振动大,触摸屏时好时坏,最后发现是FPC松了。
2.5 协议解析:读懂触摸屏的“语言”
不同厂家的触摸屏,协议略有不同。但万变不离其宗,核心数据就是:坐标、压力、触点状态。
以最常见的I2C电容屏为例,数据包格式一般是:
// 典型I2C触摸屏数据包(5字节)
Byte 0: 状态字节
Bit 7: 触摸有效标志 (1=有效)
Bit 6: 保留
Bit 5-0: 触点数量
Byte 1: X坐标高8位
Byte 2: X坐标低8位
Byte 3: Y坐标高8位
Byte 4: Y坐标低8位
// 多点触控时,后续字节重复上述格式
嗯,这里有个坑。有些触摸屏的坐标原点在左上角,有些在左下角。我建议在驱动层做一次坐标映射,而不是在上层应用里处理。这样换触摸屏时,只需要改驱动。
我的习惯: 在驱动初始化时,读取触摸屏的配置寄存器,获取X/Y方向的最大值和原点位置。然后统一转换成左上角为原点的坐标系。这样上层应用永远不用关心硬件细节。
好了,这一章的内容就到这里。接口选型、硬件布局、ESD防护、协议解析,这些都是实打实的经验。下一章我们讲软件滤波和校准算法,那才是真正让触摸屏“好用”的关键。
记住一句话:硬件设计决定了触摸屏能不能工作,软件设计决定了它工作得好不好。
公众号:蓝海资料掘金营,微信deep3321