2. CAN与J1939基础

在ECU节点开发与集成工程中,CAN总线是底层通信的物理与链路基础,而J1939是在CAN之上建立的应用层协议体系。理解二者的分层关系,是后续进行报文设计、节点集成、故障排查的前提。本节从物理层、数据链路层、帧格式、仲裁机制四个维度展开,并说明J1939如何对CAN进行扩展。

一、物理层:差分信号与终端匹配

CAN总线采用差分信号传输,两条信号线分别为CAN_H和CAN_L。显性位(逻辑0)时,CAN_H约3.5V、CAN_L约1.5V,差分电压约2V;隐性位(逻辑1)时,两线均约2.5V,差分电压接近0V。这种差分结构使总线对共模干扰有较强抑制能力,适合车载电磁环境。

物理层的关键工程参数包括:

  • 终端电阻:总线两端各需一个120Ω电阻,并联后约60Ω,用于吸收信号反射。缺少终端电阻会导致波形振铃、通信误码。
  • 拓扑结构:线性总线,节点通过短支线接入,支线长度应尽量短,避免星型或环形拓扑。
  • 速率与长度:CAN标准帧在40m内可达1Mbps;J1939常用250kbps(商用车)和500kbps(部分工程机械),对应总线长度约250m和100m。
  • 共模电压范围:收发器通常支持-2V~+7V,超出范围可能损坏或误判。
在台架调试时,若出现随机错误帧,应优先用示波器观察CAN_H/CAN_L波形,确认终端电阻是否缺失、支线是否过长、共模电压是否异常。

二、数据链路层:帧类型与位填充

CAN数据链路层定义了四种帧类型:数据帧、远程帧、错误帧、过载帧。数据帧用于承载有效数据,远程帧用于请求数据,错误帧用于通知总线错误,过载帧用于延迟下一帧发送。J1939主要使用扩展数据帧,几乎不使用远程帧。

CAN数据帧由帧起始、仲裁场、控制场、数据场、CRC场、应答场、帧结束组成。其中位填充机制规定:在帧起始到CRC序列之间,连续5个相同极性位后必须插入1个相反极性位,接收端自动去除。位填充保证接收方能从信号中恢复时钟,但也意味着实际传输位数略多于理论位数。

三、帧格式:标准帧与扩展帧

CAN标准帧使用11位标识符,扩展帧使用29位标识符(11位基本ID + 18位扩展ID)。J1939采用扩展帧,29位标识符被划分为优先级(P)、保留位(R)、数据页(DP)、PDU格式(PF)、PDU特定(PS)和源地址(SA)。

字段 位数 J1939含义 典型取值
P 3 优先级 0最高,7最低,默认6
R 1 保留位 固定0
DP 1 数据页 0为页0,1为页1
PF 8 PDU格式 决定报文类型
PS 8 PDU特定 目标地址或组扩展
SA 8 源地址 0~253,254为空地址

当PF小于240时,报文为点对点(PDU1),PS表示目标地址;当PF大于等于240时,报文为广播(PDU2),PS表示组扩展。这一规则是解析J1939报文的关键。

四、仲裁机制:非破坏性逐位仲裁

CAN总线采用载波监听多路访问/冲突检测(CSMA/CD)与逐位仲裁相结合。当多个节点同时发送时,每个节点在发送每一位的同时监听总线。若某节点发送隐性位(1)而监听到显性位(0),则判定自己仲裁失败,立即停止发送并转为接收状态,而仲裁获胜的节点继续发送,不受影响。

由于显性位覆盖隐性位,标识符数值越小(前导位显性越多),优先级越高。J1939中优先级字段P位于标识符最高位,因此P值越小,报文优先级越高。例如,优先级6的报文比优先级3的报文更容易在仲裁中失败。

仲裁是非破坏性的:获胜帧完整传输,失败帧自动重发,不会造成数据丢失,但会增加失败节点的发送延迟。在高负载总线上,低优先级报文可能长时间无法发送,需通过优先级设计规避。

五、J1939对CAN的扩展关系

J1939并非替代CAN,而是在CAN数据链路层之上构建了完整的应用层协议。其扩展关系可概括为:

  • 物理层:沿用CAN差分总线,规定250kbps/500kbps、终端电阻、拓扑要求。
  • 数据链路层:沿用CAN扩展帧,但将29位标识符重新定义为PGN结构。
  • 网络层:定义点对点传输、广播传输、多包传输(TP.CM/TP.DT)。
  • 应用层:定义参数组(PGN)、可疑参数(SPN)、故障码(DM1/DM2)等。
  • 地址管理:定义源地址声明、地址仲裁、动态地址分配。

因此,开发J1939 ECU时,底层CAN驱动负责位定时、滤波、收发;上层J1939协议栈负责PGN解析、多包重组、地址管理。二者分层清晰,调试时也应分层定位:先确认CAN物理层和链路层正常,再排查J1939应用层逻辑。

六、典型误区与复盘

误区一:把J1939报文当作普通CAN报文处理。若直接用11位标准帧发送,J1939节点无法识别。必须使用29位扩展帧,并按PGN规则填充标识符。

误区二:忽略优先级对实时性的影响。安全相关报文(如制动、转向)应分配较高优先级(P=3或更低),诊断和状态报文可用P=6或7。

误区三:终端电阻随意放置。终端电阻必须位于总线物理两端,中间节点不应再并联120Ω,否则等效阻抗下降,信号幅度不足。

// 典型J1939标识符构造示例(伪代码)
// P=6, DP=0, PF=0xF0, PS=0x00, SA=0x80
uint32_t id = 0;
id |= (6u << 26);        // 优先级
id |= (0u << 25);        // 保留位
id |= (0u << 24);        // 数据页
id |= (0xF0u << 16);     // PDU格式
id |= (0x00u << 8);      // PDU特定
id |= (0x80u);           // 源地址
// 结果:0x18F00080

掌握CAN物理层、数据链路层、帧格式与仲裁机制,并理解J1939在标识符、网络层和应用层上的扩展,是后续进行PGN设计、节点集成和总线故障排查的基础。实际工程中,建议先用CAN分析仪确认链路层通信正常,再逐步验证J1939应用层报文。

CAN 与 J1939 分层扩展关系 CAN 物理层 差分信号 CAN_H / CAN_L · 120Ω 终端电阻 · 线性总线拓扑 · 250k/500kbps J1939 沿用:速率、终端匹配、共模电压范围、支线长度约束 CAN 数据链路层 数据帧 / 远程帧 / 错误帧 / 过载帧 · 位填充 · CRC 校验 · 应答机制 J1939 沿用:扩展帧格式、位填充规则、错误处理,但几乎不用远程帧 CAN 帧格式 标准帧:11 位 ID 扩展帧:29 位 ID J1939 固定使用 29 位扩展帧 仲裁机制 非破坏性逐位仲裁 显性位覆盖隐性位 ID 越小优先级越高 J1939 扩展层(应用层 / 网络层 / 地址管理) 29 位标识符重定义:P(3) + R(1) + DP(1) + PF(8) + PS(8) + SA(8) PGN 参数组 · SPN 可疑参数 · DM1/DM2 故障码 · TP.CM/TP.DT 多包传输 地址声明与仲裁 · 广播 / 点对点通信 · 优先级 P 控制实时性 底层承载 链路复用 帧格式基础 协议扩展