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数据链路层定义了四种帧类型:数据帧、远程帧、错误帧、过载帧。数据帧用于承载有效数据,远程帧用于请求数据,错误帧用于通知总线错误,过载帧用于延迟下一帧发送。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应用层报文。