前天那个项目又出问题了,又是CAN总线。说实话,我当时差点把示波器摔地上。一组报文莫名其妙丢帧,另一个节点直接错误被动,总线负载飙到80%——这都什么事儿啊。但冷静下来一想,也不能全怪CAN,毕竟它已经四十多岁了。早在1986年,博世就扔出了这个协议,现在满大街车还在用,工业现场更是一抓一大把。你说它老旧?可新设备还不是乖乖加上CAN接口。这就是CAN总线的魔力——可靠到让人又爱又恨。
两根线跑天下?CAN物理层那些坑
很多人刚接触CAN,都会被一句话误导:“就两根线,简单!” 天真。真的天真。CAN_H和CAN_L,双绞线差分信号,理论上抗干扰强得一批。但你得把线走好了才行。有一次在注塑机旁边布线,电机的变频器一启动,CAN报文直接成串错误帧。查了两天,最后发现——屏蔽层单端接地,另一端悬空,结果成了天线。教训啊。✅ 记住:屏蔽层必须单点接地,推荐在电源侧。还有终端电阻,差一点都不行。标准120欧,两个终端各一个。如果你在同一段总线上不小心加第三个,信号反射……劝你别试,那是自虐。

差分电平:隐性状态两线电压约2.5V,差模0V;显性时CAN_H拉高到3.5V,CAN_L拉低到1.5V,差模2V。实际上收发器耐操得很,共模范围-7V到+12V,但别拿这个当挑战。💡 小窍门:如果怀疑物理层,用示波器量差模,看眼图。发现振铃、台阶,赶紧查终端和线缆。
仲裁,ID决定生死——谁设计出来的天才机制?
CAN最绝的地方,不是速度,是那个非破坏性逐位仲裁。报文ID越小,优先级越高。于是总线上一有冲突,ID小的直接胜出,其他节点乖乖退让,没有任何延迟。我第一次看协议文档时直呼“牛逼”。但这也埋下了隐患:如果总线上有个傻逼节点疯狂发送高优先级报文——ID 0x000——其他节点全歇菜。这在汽车上就是制动系统报文被一个故障大灯挤占,真会要命。所以后期J1939和CANopen都规定了报文ID的分配规则,不能乱来。
问:那标准帧11位ID和扩展帧29位ID怎么选?
答:标准帧足够了绝大多数情况,除非你节点多到爆炸。扩展帧浪费总线带宽,而且有些古老控制器根本不认。不过现在CAN FD时代,29位ID倒是常用了,反正数据速率上去了,不差这点开销。

帧种类也很多:数据帧、远程帧、错误帧、过载帧。远程帧现在基本没人用,好多控制器都不支持。过载帧几乎绝迹。剩下的就是数据帧和错误帧。错误帧分主动错误和被动错误——这个后面说。
错误管理:节点死给你看的时候,别慌

CAN的错误处理太严苛了,有点变态。每个节点内部有发送错误计数和接收错误计数。一旦任何一个超过96,节点可能进入错误被动状态;超过255,直接总线关闭。这就导致一个问题:某个节点因为一点点小错,比如一时电磁干扰,计数蹭蹭涨,最后被踢出总线。然后你得断电复位。尤其早期的一些收发器,抗干扰差,每逢雷雨天气就批量掉线。❗ 所以调试的时候,一定监控这些计数器。如果发现某节点错误计数一直涨,查物理层、查波特率偏差、查采样点配置。
问:如何配置采样点才不会出错?
答:采样点位置太太太关键了。大多数人只设了波特率,不管采样点。实际上,波特率相同而采样点不同的两个节点,照样干仗。根据位定时,采样点一般设在75%到87.5%的位置。如果线缆长、电容大,得往后放。要是两边都在80%左右,通信稳如老狗。拿一个CAN分析仪,实际测一下信号,校准采样点,比啥都强。很多奇葩问题,校准完就消失了。
还有错误帧,一旦某个节点检测到位错误、填充错误、CRC错误、格式错误或应答错误,马上发送错误标志,把整个网络搅乱。所以有时看到总线上一连串错误,根因就是某个节点的地线没接好。排查时要断开逐个节点连接,看错误消失没。这是个笨办法,但最有效。
CAN FD:快是真快,兼容是真头疼

CAN FD来了,数据段速率可以跑到8Mbps甚至更高,帧长大到64字节,太爽了。但是,老旧CAN节点混在一起时,那叫一个灾难。因为CAN FD帧的BRS位和FDF位,经典CAN控制器完全看不懂,直接当成错误处理。所以你想着把ECU升级成FD,却发现整车网络都得动。这不只是芯片的事,线束、终端匹配可能都要重调。不过话说回来,新项目就别犹豫了,直接上FD。毕竟未来是确定性的。CAN FD还有个好处,ISO 11898-2:2015规定了更严的物理层指标,收发器普遍质量更好了。
问:CAN FD对比以太网,谁才是未来?
答:讲真,别一听以太网就高潮。车载以太网确实快,但成本、抗干扰、确定性上,CAN FD依然有绝对优势。在汽车动力总成、底盘控制这些地方,没谁能替代CAN。工业里也一样。一些提以太网的要考虑下现场工程师的感受——IT那套进去就是废脚。所以,相当长一段时间内,CAN FD和经典CAN继续当主力。
最后扯几句

写了这么多,其实就是因为被CAN折磨得太久,也佩服它的设计。每个搞嵌入式、工业自动化的,总得跟它过招。你觉得自己懂了?不存在的。因为实际现场总有新花样。不过吧,掌握了那些关键点——终端电阻、采样点、屏蔽接地、ID分配、错误计数监控——至少能睡个好觉。下次项目再出问题,别急着骂CAN。先检查自己做的对不对。这是给年轻人的忠告,也是给自己的提醒。
✅ 如果觉得有用,传给下一个还在被CAN虐的同事。💡 有什么补充的,欢迎在评论区怼我。