
上个月帮一个做工业数据采集的朋友排查问题,他们现场有一批自研的采集节点,通过一对差分线把数据汇总到主控板。原来的链路跑了大半年一直挺稳,后来因为要加长传输距离,固件里把物理层的线路编码从一种方案切到了另一种方案。改完之后,实验室里短距离测试一切正常,拉到现场跑了两天,开始出现随机丢包。具体现象是:主控板每隔几小时就报一次校验错误,采集节点那边看发送计数器,发现有些帧发出去之后收不到确认,重发几次才成功。最麻烦的是它不持续坏,而是隔一阵抽一下,现场根本抓不住规律。朋友一开始怀疑是线缆接触不良,把接头全换了一遍,没用。又怀疑是电源纹波,加了滤波电容,还是老样子。后来他把两版固件的波形抓出来对比,才发现问题出在编码方式切换之后,接收端时钟恢复的裕量变小了。原来那种编码跳变密度高,接收端很容易从数据流里提取时钟;换成的另一种编码虽然直流平衡更好、频谱效率更高,但连续相同电平的游程变长了,接收端锁相环在长游程期间只能靠自身惯性维持相位,一旦线缆衰减稍大或者温度漂移导致频偏,相位就慢慢跑偏,跑到一定程度就采错一个比特。这个错误又刚好落在帧头或者长度字段上,整帧就废了。这个坑让我觉得有必要把物理层编码切换这件事单独拎出来讲清楚。很多做嵌入式或者现场总线的工程师,选编码方式的时候只看两个指标:一是编码效率,二是直流平衡。这两个当然重要,但真正决定连接稳定性的,往往是第三个指标——跳变密度与接收端时钟恢复能力的匹配程度。这个指标在数据手册里通常只给一个典型值,很少告诉你它在长线缆、宽温区、低成本晶振条件下的实际表现。先讲清楚一个基本事实:任何串行链路,接收端都需要一个时钟来采样。这个时钟要么单独走一根线传过来(源同步),要么从数据本身提取(自同步)。绝大多数低成本差分链路用的是后者。从数据提取时钟的