一个让我熬到凌晨三点的“幽灵丢包”
几年前做一个多节点采集系统,主控通过一条差分总线轮询十几个从节点。实验室里跑得好好的,一到现场就出问题:轮询周期性地超时,但用示波器看波形,幅值、边沿都正常,连噪声容限都留了很大余量。更诡异的是,把分析仪挂上去抓包,抓到的报文全是完整的,一个错误帧都没有。
当时第一反应是软件问题,查了中断优先级、DMA 搬运、环形缓冲区,甚至怀疑编译器优化把某个变量优化没了。折腾到后半夜,我把分析仪从总线上摘下来,换了个思路——让主控自己的收发器进入回环模式,自己发自己收,结果发现发出的数据和收回的数据在某个字节上差了两位。问题不在总线,在主控这一侧的收发器配置上:一个引脚被复用成了普通 IO,收发器的方向控制实际上一直处于“半开”状态,发送时驱动能力不够,接收时又勉强能识别。分析仪挂上去时,它的输入阻抗和容性负载恰好把那个临界状态“扶正”了,所以抓包看起来一切正常。
拔掉分析仪就复发,挂上就正常——这种“观测行为改变被测对象”的坑,让我重新审视了回环和只听这两种模式到底该在什么阶段用、怎么用。
回环模式:先把自己摘干净
回环模式的核心逻辑是:发送通道的输出不送到外部总线,而是直接内部绕回接收通道。你发什么,理论上就应该收到什么。这个模式最大的价值,是在你怀疑“问题到底在总线还是在节点”的时候,一刀切下去。
我习惯把它分成两种用法。
第一种是控制器内部回环。很多通信控制器本身就支持把发送数据流在协议层直接环回到接收 FIFO,不经过物理层引脚。这种回环能验证的东西很有限——它能确认控制器配置、波特率、帧格式、中断/DMA 通路是否正常,但

