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),说明有更高优先级报文正在发送,该节点立即退出仲裁转为接收,且不会破坏已获胜报文的数据。
仲裁只发生在仲裁段,一旦进入数据段,所有节点都已确定主从关系,不再发生仲裁。这也是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%。采样点过前,对传播延迟和晶振偏差容忍度低;采样点过后,则容易受相位误差影响。同一总线所有节点必须使用相同波特率,采样点尽量一致,否则同步裕度下降。
五、总线负载率计算与优化
总线负载率是单位时间内总线被占用时间与总时间的比值。它直接决定报文延迟和网络余量。计算时需考虑每帧的位数(含填充位和帧间隔)。
负载率 = Σ(每帧位数 × 每秒发送次数) / 波特率 × 100%
示例:500 kbps总线
报文A:标准帧,8字节,约111位,100次/秒 → 11100位
报文B:扩展帧,8字节,约131位,50次/秒 → 6550位
总位数 = 17650位/秒
负载率 = 17650 / 500000 ≈ 3.53%
实际工程中,负载率超过50%时延迟明显增大,超过70%时低优先级报文可能频繁丢失。优化手段包括:
- 合并或降低非关键报文发送周期,如车身状态报文由20 ms改为100 ms。
- 将大周期诊断报文与实时控制报文分总线或分时段发送。
- 使用标准帧替代扩展帧,减少仲裁段位数。
- 合理分配ID优先级,避免高优先级报文过度占用总线。
- 对突发数据采用事件触发而非周期发送,降低平均负载。
六、案例与复盘
某VCU项目在整车路试中出现偶发扭矩报文延迟,诊断仪显示总线负载率约45%,看似正常。进一步用CANoe统计峰值负载率,发现某工况下1秒内峰值达到82%,原因是BMS诊断报文与MCU状态报文同时突发。复盘结论:平均负载率不能代表最坏情况,必须结合峰值和报文优先级分析。优化措施是将BMS诊断报文改为分片发送,并调整MCU状态报文ID优先级,峰值负载率降至58%,延迟问题消失。
综上,CAN协议的核心在于:帧格式决定寻址与数据承载,仲裁决定实时性,错误处理决定可靠性,位定时决定物理层一致性,负载率决定网络余量。五者相互关联,任何一项配置不当都会在整车网络中放大为通信故障。