一次难忘的通信故障

那是一个月黑风高的夜晚——好吧夸张了,但现场确实急死人。设备间CAN通信死活连不上。排查半天,最后发现是终端电阻没加。哎,低级错误,浪费两小时。CAN总线这东西,说简单也简单,两根线,差分信号,挂一堆节点。但里面的坑可真不少。
CAN总线到底神在哪?
工业现场,电磁干扰那叫一个酸爽。电机一启动,RS485有时都会被带偏。CAN却能稳如老狗。凭什么?差分传输。CAN_H和CAN_L互为镜像,干扰信号耦合进来,一减就没了, 抗共模干扰能力极强。再加上那个总线仲裁机制——非破坏性逐位仲裁, 优先级高的报文不会丢,实时性有保障。真心觉得,博世当初设计这个协议的人,脑袋怎么长的?
不过话说回来,很多人以为CAN就只有2.0A/B。其实现在CAN FD普及度越来越高,数据段速率能到8Mbps甚至更高,一帧能传64字节。经典CAN最多8字节,传个标定数据都得分包,CAN FD直接搞定。但兼容性是个头疼事,后面再说。

那些让你抓狂的CAN故障
错误帧满天飞。遇到过没?示波器一抓,波形跟心电图似的,全是错误标志。常见原因:终端电阻匹配不对,或者某个节点波特率偏差太大。有一次,一个国产控制器,晶振温漂厉害,低温下波特率偏移超过2%,直接导致总线瘫痪。换了颗工业级温补晶振,问题解决。 成本多了几十块,但值。
总线被单个节点拉死。某节点发完错误帧后,一直保持显性位,导致其他节点无法通信。这时需要逐个断开节点,定位那个“凶手”。我一般用CAN卡配合上位机软件,看哪个节点最后停止发送报文。或者用”瞎猫碰死耗子”法,一个个下电,虽然土,但有效。
终端电阻位置不对。理论上要在总线两端各加一个120Ω,但有人只在中间加,或者加了多个。信号反射,波形振铃,通信时好时坏。这种毛病最难查,因为它不是彻底死掉,而是间歇性抽风。最好上网络分析仪,或者至少用示波器看眼图。💡
CAN高层协议:J1939与CANopen的爱恨情仇
别看CAN物理层一样,上层协议五花八门。商用车用J1939,工业自动化用CANopen,乘用车各玩各的。J1939基于29位扩展ID,定义了PGN(参数组编号),每个PGN对应一组参数。整车厂强行要求通信矩阵,报文周期精确到毫秒。有一点让我特别欣赏:地址声明机制,节点上电自报家门,不用手动设ID,多方便。
CANopen呢,基于对象字典,玩的是SDO、PDO、NMT那一套。PDO用来实时传输过程数据,SDO配置参数。对象字典索引0x1000是设备类型,0x1017是心跳时间……背过对象字典的人都知道,那简直是一部词典。但一旦理解了,组态起来非常灵活,一台伺服驱动器,通过SDO改几个对象,就能实现不同控制模式。难怪欧洲工业界那么喜欢它。

问得最多的问题,我这样回答

问:为什么CAN总线必须加终端电阻?不加会怎样?
答:简单说,是为了阻抗匹配,防止信号反射。电信号在传输线末端,如果阻抗不连续,就会像皮球撞墙一样反弹回来,叠加在正常信号上,造成振铃。不加的话,波形畸变,严重时总线直接瘫痪。尤其是高速CAN,终端电阻绝对不能省。120欧姆,记住了。❗
问:CAN FD和经典CAN到底能不能混用?
答:硬件上可以,但协议得注意。CAN FD节点能接收经典CAN报文,但经典CAN控制器识别不了FD的高速数据段,会报错误帧。所以混用时,得保证没有经典节点挂在FD报文通路上,或者用网关隔离。还有一点,FD帧的CRC场和经典帧不同,经典节点会当成格式错。混用时建议要么分网段,要么全部升级为FD控制器。💡
问:DBC文件是干什么的?自己如何创建?
答:DBC文件就是CAN通信的翻译字典。没有它,你面对一串ID和数据字节,完全不知道啥意思。它定义了报文ID、信号名称、起始位、长度、因子、偏移量等。用Vector CANdb++或者开源的Kvaser Database Editor可以创建。这东西需要和硬件工程师、应用工程师一起核对,最怕信号位置或大小写错,一个偏移量搞错,解析的值全乱套。曾经因为DBC文件里一个信号属性定义错误,整车标定折腾了两天,查到最后想摔电脑。
我的几个私房调试技巧
第一,买个好点的CAN卡。不要图便宜买几十块的USB转CAN,那玩意儿时间戳精度、缓冲容量都不行。Kvaser、Vector、PEAK这些,虽然贵点,但配套软件强大,滤波、触发、回放功能都齐。一次故障复现,用回放功能模拟节点发包,瞬间找到问题。
第二,善用终端电阻切换。在测试板上加个跳线帽或拨码开关,方便接入或断开终端电阻。有时候你需要在总线中间加监听节点,断开终端电阻很重要。
第三,记日志,别只靠脑子。CAN报文一秒钟成百上千帧,肉眼根本看不过来。 用软件记录成BLF、ASC或CSV格式,事后回放分析。很多偶发性故障,只有在日志里才能发现规律。比如某个节点每隔27秒发一个异常帧,你盯着屏幕看绝对发现不了。
第四,重视屏蔽和接地。虽然CAN抗干扰强,但也别太过分。屏蔽双绞线必须用,屏蔽层单点接地。遇到过一起案例,现场有大功率变频器,CAN线没走桥架,直接拉线,结果通信经常中断。后来换了带双层屏蔽的电缆,外加磁环,总算消停。✅
结语?没结语,只有无止境的坑

CAN总线玩了这么多年,依然有新坑不断出现。随着CAN XL标准推进,速率更快,payload更大,挑战也会更多。但核心思想不变:差分信号、仲裁机制、实实在在掌握物理层特性,才能以不变应万变。真要学透彻,别光看书,多去现场摸爬滚打吧——那才是最好的老师。