4. CAN通信协议详解

CAN(Controller Area Network)是VCU整车网络中承载动力、底盘、车身等关键控制信息的主干总线。理解CAN 2.0A/B的帧格式、仲裁机制、错误处理、位定时与采样点配置,以及总线负载率的计算与优化,是诊断集成工程师进行网络设计、报文分析和故障排查的基本功。本节从协议底层出发,结合工程实践逐层展开。

一、CAN 2.0A/B帧格式

CAN 2.0A使用11位标识符的标准帧,CAN 2.0B同时支持11位标准帧和29位扩展帧。两者在仲裁段结构不同,其余字段基本一致。一帧报文由帧起始、仲裁段、控制段、数据段、CRC段、应答段和帧结束组成。

  • 帧起始(SOF):1位显性电平,用于硬同步,标志一帧开始。
  • 仲裁段:标准帧为11位ID + RTR;扩展帧为11位基本ID + SRR + IDE + 18位扩展ID + RTR。
  • 控制段:IDE、r0、DLC(4位),DLC表示数据长度0~8字节。
  • 数据段:0~8字节有效数据,高位先发。
  • CRC段:15位CRC序列 + 1位CRC界定符,用于校验传输错误。
  • 应答段:ACK槽 + ACK界定符,接收节点正确接收后在ACK槽发送显性电平。
  • 帧结束:7位隐性电平。

标准帧与扩展帧的关键差异在于:标准帧仲裁段短、总线利用率高、延迟小;扩展帧ID空间大,适合复杂网络分层寻址。VCU网络中,动力扭矩、挡位等高频关键报文通常采用标准帧,诊断和标定报文多采用扩展帧。

二、仲裁机制

CAN采用非破坏性逐位仲裁。总线上多个节点同时发送时,每个节点在发送每一位的同时回读总线电平。若某节点发送隐性(1)而回读为显性(0),说明有更高优先级报文正在发送,该节点立即退出仲裁转为接收,且不会破坏已获胜报文的数据。

仲裁优先级由ID数值决定:ID越小,优先级越高。因为显性位(0)在仲裁中胜出,ID中靠前的显性位越多,越容易赢得总线。因此关键安全报文应分配较小的ID。

仲裁只发生在仲裁段,一旦进入数据段,所有节点都已确定主从关系,不再发生仲裁。这也是CAN适合实时控制的原因:高优先级报文延迟可预测,低优先级报文自动退让。

三、错误处理与故障界定

CAN节点通过五种错误检测机制保证数据完整性:位错误、填充错误、CRC错误、格式错误和应答错误。检测到错误的节点会在下一位发送错误帧,破坏总线数据,通知其他节点丢弃当前帧。

每个节点维护发送错误计数器(TEC)和接收错误计数器(REC),据此进入三种状态:

状态进入条件行为
错误主动TEC和REC均≤127正常收发,可发送主动错误帧
错误被动TEC或REC>127可收发,但只能发送被动错误帧
总线关闭TEC>255脱离总线,停止收发,需恢复

总线关闭是诊断重点:若某节点反复进入Bus-Off,通常意味着该节点硬件故障、终端电阻异常或总线短路。VCU诊断中应记录Bus-Off事件及恢复次数,作为网络健康度指标。

四、位定时与采样点配置

CAN位时间由同步段、传播段、相位缓冲段1和相位缓冲段2组成,以时间份额Tq为单位。采样点位于相位缓冲段1结束处,是判断位电平的时刻。采样点位置通常用“采样点 = (1 + PropSeg + PhaseSeg1) / 总Tq”表示。

示例:500 kbps,时钟8 MHz,BRP=1,Tq=125 ns
位时间 = 16 Tq = 2 μs
SyncSeg = 1 Tq
PropSeg  = 3 Tq
PhaseSeg1 = 6 Tq
PhaseSeg2 = 6 Tq
采样点 = (1+3+6)/16 = 62.5%
SJW = 4 Tq

工程经验:500 kbps下采样点建议75%~87.5%,1 Mbps下建议75%~80%。采样点过前,对传播延迟和晶振偏差容忍度低;采样点过后,则容易受相位误差影响。同一总线所有节点必须使用相同波特率,采样点尽量一致,否则同步裕度下降。

配置位定时时,先确定总线长度和传播延迟,再选采样点,最后校验SJW是否覆盖晶振偏差。整车网络中,VCU、MCU、BMS等节点应统一由网络规范约束采样点范围。

五、总线负载率计算与优化

总线负载率是单位时间内总线被占用时间与总时间的比值。它直接决定报文延迟和网络余量。计算时需考虑每帧的位数(含填充位和帧间隔)。

负载率 = Σ(每帧位数 × 每秒发送次数) / 波特率 × 100%

示例:500 kbps总线
报文A:标准帧,8字节,约111位,100次/秒 → 11100位
报文B:扩展帧,8字节,约131位,50次/秒  → 6550位
总位数 = 17650位/秒
负载率 = 17650 / 500000 ≈ 3.53%

实际工程中,负载率超过50%时延迟明显增大,超过70%时低优先级报文可能频繁丢失。优化手段包括:

  1. 合并或降低非关键报文发送周期,如车身状态报文由20 ms改为100 ms。
  2. 将大周期诊断报文与实时控制报文分总线或分时段发送。
  3. 使用标准帧替代扩展帧,减少仲裁段位数。
  4. 合理分配ID优先级,避免高优先级报文过度占用总线。
  5. 对突发数据采用事件触发而非周期发送,降低平均负载。
常见误区:只按数据字节数估算负载率,忽略帧头、CRC、填充位和帧间隔,导致实际负载率被低估20%以上。另一个误区是只关注平均负载率,忽略峰值负载率,导致偶发丢帧难以复现。

六、案例与复盘

某VCU项目在整车路试中出现偶发扭矩报文延迟,诊断仪显示总线负载率约45%,看似正常。进一步用CANoe统计峰值负载率,发现某工况下1秒内峰值达到82%,原因是BMS诊断报文与MCU状态报文同时突发。复盘结论:平均负载率不能代表最坏情况,必须结合峰值和报文优先级分析。优化措施是将BMS诊断报文改为分片发送,并调整MCU状态报文ID优先级,峰值负载率降至58%,延迟问题消失。

综上,CAN协议的核心在于:帧格式决定寻址与数据承载,仲裁决定实时性,错误处理决定可靠性,位定时决定物理层一致性,负载率决定网络余量。五者相互关联,任何一项配置不当都会在整车网络中放大为通信故障。

CAN 2.0A/B 帧结构与仲裁、位定时、负载率关系图 标准帧(11位ID) SOF 11位ID+RTR 控制 数据0~8B CRC ACK EOF 扩展帧(29位ID) SOF 11位基本ID SRR IDE 18位扩展ID 控制 数据 CRC ACK 非破坏性逐位仲裁 节点A ID=0x100(显性优先) 节点B ID=0x200(隐性退让) 结果:A赢得总线,B转接收,数据不破坏 位定时与采样点 Sync PropSeg PhaseSeg1 PhaseSeg2 采样点 62.5% 总线负载率与优化 负载率 = Σ(帧位数 × 每秒次数) / 波特率 优化:降周期 · 分总线 · 标准帧 · 合理ID · 事件触发 峰值>70% 需优化