2、物理层对比:CANopen与J1939在CAN总线物理层上的异同,位定时、终端电阻配置
好,咱们进入第二讲。这一章聊物理层。
很多人觉得物理层没啥好比的,不就是CAN总线那点事儿吗?其实不然。我做了这么多年现场总线,踩过的坑里,有一大半都出在物理层。你想想看,协议栈写得再漂亮,物理层一乱,整个系统就崩了。
2.1 先说共同点:它们都跑在标准CAN物理层上
CANopen和J1939,底层用的都是ISO 11898标准的CAN总线。这意味着什么?
- 都采用差分信号传输,CAN_H和CAN_L两根线
- 显性电平(逻辑0)和隐性电平(逻辑1)的定义完全一致
- 总线电平范围、共模电压要求都一样
说白了,从示波器上看波形,你分不清哪个是CANopen,哪个是J1939。它们只是上层协议不同,物理层是共享的。
核心结论:CANopen和J1939的收发器芯片可以互换使用。我曾在项目中直接用同一块CAN接口板,通过切换固件来跑两种协议,硬件纹丝不动。
2.2 位定时:这里开始有差异了
位定时是物理层的核心。它决定了总线能跑多快、能挂多少节点。
2.2.1 CANopen的位定时习惯
CANopen最常用的波特率是125kbps、250kbps和500kbps。我个人习惯在工业现场用250kbps,这个速度在抗干扰和实时性之间平衡得最好。
CANopen的位定时参数,通常遵循CiA 301标准推荐的采样点位置。一般来说,采样点设在75%~80%之间。举个例子,500kbps时,我常用的配置是:
// 500kbps, 采样点87.5%
// 假设晶振16MHz, TSEG1=13, TSEG2=2, SJW=1
CAN_BTR = (2 << 12) | (13 << 8) | (1 << 4) | 1;
嗯,这里要注意。CANopen对位定时的要求没那么死板,只要在有效范围内,不同厂家的设备通常能兼容。但我在项目中遇到过一个问题:某国产PLC的CANopen接口,采样点设在了70%,结果和欧洲某驱动器通信时,偶尔丢帧。后来我把采样点调到80%,问题就消失了。
2.2.2 J1939的位定时规矩
J1939就严格多了。它强制使用250kbps,采样点固定在87.5%。你没看错,这是SAE J1939-11标准里写死的。
为什么会这样?因为J1939主要用在重卡、工程机械上,总线可能长达40米,节点数多达30个。如果采样点不统一,长距离传输时信号反射会导致误码。
我的经验:如果你在做J1939设备,位定时参数最好直接用标准推荐的。我曾经为了省事,抄了CANopen的配置跑J1939,结果在实验室没问题,一上整车就出乱码。后来老老实实按J1939-11的表来配,稳了。
J1939的标准位定时参数(250kbps,16MHz晶振):
// J1939标准配置
// 采样点87.5%, TSEG1=14, TSEG2=2, SJW=1
CAN_BTR = (2 << 12) | (14 << 8) | (1 << 4) | 1;
| 参数 | CANopen | J1939 |
|---|---|---|
| 常用波特率 | 125k, 250k, 500k, 1M | 250k(强制) |
| 采样点 | 75%~80%(推荐) | 87.5%(固定) |
| 同步跳转宽度 | 1~2 Tq | 1 Tq |
| 最大总线长度 | 视波特率而定(500k时约100m) | 40m(标准要求) |
2.3 终端电阻配置:看似一样,实则不同
终端电阻这块,两者都遵循CAN总线的基本要求:总线两端各加一个120Ω电阻。但实际应用中,差别就出来了。
2.3.1 CANopen的终端电阻
CANopen设备通常内置了终端电阻,通过一个拨码开关或跳线来启用。我见过很多设备,默认是不启用终端电阻的,需要用户根据网络拓扑手动配置。
这里有个坑:有些廉价CANopen模块,内置的终端电阻精度只有±5%,甚至用的是碳膜电阻。温度一变化,阻值漂移,总线信号就变形了。
警告:我曾经在一个项目中,用了某品牌的CANopen I/O模块,终端电阻标称120Ω,实际测量只有114Ω。结果总线反射严重,通信距离超过50米就开始丢包。后来全部换成高精度金属膜电阻,问题解决。
2.3.2 J1939的终端电阻
J1939的终端电阻配置更讲究。标准要求使用120Ω,精度±1%,而且必须是单独的电阻器,不能集成在节点内部。
为什么?因为J1939网络是固定的——车辆上就那么几个ECU,终端电阻通常安装在物理总线的两端,比如驾驶室里的仪表盘和后桥上的ABS控制器。如果电阻集成在节点内部,万一那个节点被拆掉,总线就断了。
另外,J1939还要求终端电阻的功率至少为1/4W。别小看这个,在24V系统的卡车上,总线短路时电流不小,功率不够的电阻会烧掉。
2.4 物理层设计的避坑指南
好,讲了这么多,我总结几条实战经验:
- 别混用波特率。CANopen虽然支持多种波特率,但同一个网络必须统一。我见过有人把125k和250k的设备挂同一条总线上,结果谁也收不到谁的数据。
- 终端电阻一定要测。不要相信标称值,上电前用万用表量一下CAN_H和CAN_L之间的电阻。正常应该是60Ω(两个120Ω并联)。如果测到120Ω,说明只有一端有电阻;如果测到0Ω,说明短路了。
- 注意共模电压。J1939在12V/24V系统上,共模电压可能高达几十伏。普通CAN收发器扛不住,要用隔离型的。CANopen在工业现场也建议隔离,但很多低成本设备没做,容易烧芯片。
- 线缆选择有讲究。J1939推荐使用屏蔽双绞线,线径至少0.5mm²。CANopen没那么严格,但长距离传输时,线缆质量直接影响通信可靠性。
一句话总结:物理层上,CANopen灵活但容易出乱子,J1939死板但可靠。如果你在做一个新项目,不确定怎么选,我建议先按J1939的物理层标准来设计硬件,然后上层协议再决定跑CANopen还是J1939。这样进可攻退可守。
下一章,咱们聊聊数据链路层的差异,那才是两种协议真正分道扬镳的地方。