物理层信号特性:RS-232、TTL/CMOS 与眼图分析
做 UART 调试,第一关就是物理层。说白了,信号从芯片管脚出来,到对面芯片管脚收进去,中间这段路最容易出幺蛾子。我见过太多工程师拿着逻辑分析仪抓了半天波形,最后发现是电平标准搞错了——这种坑,踩一次就记住了。
RS-232 电平标准
RS-232 是串口通信的老祖宗。它用 ±3V ~ ±15V 来代表逻辑电平。具体来说:
- 逻辑 1(MARK):-3V ~ -15V
- 逻辑 0(SPACE):+3V ~ +15V
- 过渡区:-3V ~ +3V,这个区间信号状态不确定
我记得刚入行时,拿万用表量 RS-232 的 TX 引脚,测到 -9V 左右,心里还嘀咕“这电压怎么是负的”。后来才明白,RS-232 的设计初衷是为了抗干扰——用正负电压摆幅来对抗长线传输的噪声。
TTL/CMOS 电平标准
现在的嵌入式系统,绝大多数用 TTL 或 CMOS 电平。跟 RS-232 完全反着来:
| 标准 | 逻辑 0 | 逻辑 1 | 典型 VCC |
|---|---|---|---|
| TTL | 0V ~ 0.8V | 2.0V ~ 5.0V | 5V |
| CMOS | 0V ~ 0.3×VCC | 0.7×VCC ~ VCC | 3.3V / 5V |
| LVTTL | 0V ~ 0.4V | 2.4V ~ 3.3V | 3.3V |
你想想看,如果 A 设备用 5V TTL 输出,B 设备用 3.3V CMOS 输入,直接连会怎样?大概率烧坏 B 设备的输入引脚。我有个项目就是这样,STM32 的串口接了个 5V 的 GPS 模块,结果 STM32 的 RX 脚直接冒烟了。
信号畸变与眼图分析
信号畸变,说白了就是波形走样了。常见原因有:
- 反射:阻抗不匹配,信号在线上来回弹
- 串扰:相邻信号线互相干扰
- 衰减:线太长,信号幅度越来越小
- 抖动:时钟不稳定,边沿位置飘忽不定
眼图是分析信号质量的利器。把多次采样的波形叠加在一起,看起来像一只眼睛。眼睛睁得越大,信号质量越好。
- 眼高:信号幅度余量,至少 > 200mV
- 眼宽:采样窗口宽度,至少 > 0.6 个码元周期
- 抖动:边沿的随机偏移,越小越好
- 过冲/下冲:信号超出正常电平的幅度,应 < 10%
我曾经调一个 115200bps 的 UART,通信时好时坏。用示波器看眼图,发现眼高只有 150mV,眼宽不到半个码元周期。查了半天,原来是 PCB 走线太长,而且没做阻抗匹配。加了个 33Ω 的串联电阻后,眼图立马打开了。
常见物理层故障
电平不匹配
这是最常遇到的问题。5V 设备接 3.3V 设备,或者 RS-232 设备直接接 TTL 设备。症状很明显:要么完全收不到数据,要么收到一堆乱码。
线序错误
UART 的 TX 和 RX 必须交叉连接。A 设备的 TX 接 B 设备的 RX,A 设备的 RX 接 B 设备的 TX。很多人想当然地“TX 接 TX,RX 接 RX”,结果通信失败。
我有个血的教训:调试一块 4G 模块时,怎么都发不出 AT 指令。折腾了两小时,最后发现是杜邦线插反了。从那以后,我每次接线都会用万用表确认一遍 TX 和 RX 的对应关系。
信号畸变
信号畸变通常表现为:
- 波形上升沿/下降沿变缓
- 有过冲或振铃
- 码元宽度不一致
- 误码率随波特率升高而急剧增加
解决信号畸变,我一般按这个顺序排查:
- 检查线缆长度,UART 在 115200bps 下建议不超过 1.5 米
- 在 TX 端串联 22Ω ~ 100Ω 电阻,抑制过冲
- 检查地线连接是否可靠,地线环路会产生共模噪声
- 用示波器看眼图,量化信号质量
眼睛睁得大,信号质量佳。
眼睛眯成线,误码在眼前。
过冲像尖刺,反射没消除。
抖动像毛刺,时钟有问题。
嗯,物理层这部分就这些。记住一句话:信号在线上走,跟人在路上走一样——路况不好,车就跑不快。先把物理层搞干净了,再谈协议解码的事。