CAN总线通信调试血泪史:从波形异常到终端电阻那些破事儿

干工控的,谁还没被CAN总线折磨过?上个月给一个AGV小车做维护,通信时好时坏,动不动就离线。现场调试那叫一个抓狂——示波器一打,波形像锯齿,电压偏低。脑袋嗡一下,又是终端电阻问题!120Ω终端电阻,缺一个都不行,结果客户为了省钱,只在主站加了一个,从站全没加。你说气不气人?

CAN总线这玩意儿,到底是怎么工作的?

其实CAN总线不是什么新东西,博世在80年代就搞出来了,当时是为了汽车内部通信。现在满大街的工业设备都在用。它就是个多主通信的差分总线,靠两根线:CAN_H和CAN_L,通过电压差来表示0和1。显性电平(0)是CAN_H高CAN_L低,差动电压大概2V;隐性电平(1)两根线都是2.5V左右,电压差为0。这种差分传输抗干扰能力贼强,在电机旁边跑都不用太担心。

不过话说回来,它的多主机制有时候也挺坑——谁都能往总线上发消息,通过ID仲裁优先级。一旦哪个节点疯了,不停地发高优先级ID,整个总线就瘫痪了。我们俗称“bus off”。遇到过吗?😤

CAN总线差分信号波形示意图
CAN总线差分信号波形示意图

现场排故三板斧:波形、电阻、终端

我总结了一套笨办法,但管用。

  1. 先看波形。示波器接CAN_H和CAN_L,正常波形应该像两张嘴,紧紧咬合。如果看到明显的回沟、锯齿,或者幅度不够,基本是匹配问题。
  2. 量电阻。断电后,在总线最远端测CAN_H对CAN_L的电阻,应该是60Ω左右——因为首尾各一个120Ω终端电阻并联。如果测到40Ω,八成有人多加一个;要是120Ω呢?嘿嘿,只加了一个。
  3. 终端电阻的位置!别小看这玩意儿,一定得加在线缆的最远端。我见过有人把终端电阻焊在PCB上,然后拖了10米长的支线出去……不给你颜色看才怪。

这里有个经典QA:

问:为什么我明明加了终端电阻,波形还是不好?
答:终端电阻的安装位置很关键。理论上它要放在干线最远处,且每个节点到干线的支线尽量短,别超过30cm(在1Mbps速率下)。你如果主控器上焊了一个,但实际总线延伸出去几十米,另一端没加,那等于没加。👉 另一端也得加!还有就是检查你的线缆,CAN需要用120Ω特性阻抗的屏蔽双绞线,别拿普通电线凑合。

工业CAN总线终端电阻正确安装位置图
工业CAN总线终端电阻正确安装位置图

兼容性噩梦:2.0A、2.0B与FD之间的那些坑

兼容性噩梦:2.0A、2.0B与FD之间的那些坑
兼容性噩梦:2.0A、2.0B与FD之间的那些坑

早期CAN 2.0A只有11位ID,2.0B有29位扩展ID,两者混用容易出问题。我碰到过一个趣事:用周立功的USBCAN调试,收发正常,但换成国产某便宜分析仪就丢帧。最后才发现,那个便宜货只支持标准帧11位ID,而我们的29位ID报文全被它忽略了……白折腾一上午。💡 现在又出了CAN FD,数据段波特率可变,最高能到8Mbps,但和老设备完全不兼容。升级前务必确认所有节点支持FD,不然一上电就bus heavy,错误帧满天飞。

再说个QA:

问:CAN FD和经典CAN能共存吗?
答:不能直接通信。CAN FD的帧格式扩展了,仲裁段波特率可以相同,但数据段会切换到高速,经典CAN控制器根本认不出FD帧,会产生错误帧。如果你非得混合用,需要一个带FD-to-Classic转换功能的网关设备,或者SJA1105这类桥接芯片……不过成本就上去了。✅ 建议新项目直接全上FD,长痛不如短痛。

软件?其实软坑比硬坑还多

很多人以为CAN就是硬件的事,配置个波特率就完了。大错特错。时间触发、滤波设置、错误处理,哪一个没弄好都能让你怀疑人生。比如我记得有一次,设备工作一段时间后突然离线,查了好久,发现是接收FIFO溢出,驱动程序却只做了错误计数,没及时清空。中断优先级一乱,主循环就卡死了。🫠 所以一定要配好心智健全的错误处理:总线关闭后自动恢复,错误计数溢出中断别忽略。

总之,CAN总线就是这样,看着简单,用起来处处是细节。那些年擦过的屁股都能写本书了。但没办法,谁让它确实可靠呢?——在正确施工的前提下。如果不幸踩坑,别慌,记住那三板斧,基本能解决八成的现场问题。🚀

最后,强烈建议每个工控人随身带一个靠谱的CAN分析仪,比听现场描述靠谱一百倍。什么PCAN、Kvaser都行,别省那点钱。

免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:CAN总线通信调试血泪史:从波形异常到终端电阻那些破事儿
文章链接:https://www.zystgy.cn/a/53012