3、CAN总线协议基础:CAN 2.0与CAN FD区别、报文帧结构、位时序与同步、CAN网络拓扑

各位同学,咱们今天聊聊CAN总线。说实话,做汽车电子BootLoader开发,CAN总线是绕不开的坎。我当年刚入行时,总觉得CAN协议就是发发数据那么简单,直到第一次调试BootLoader升级失败,才发现自己对CAN的理解太浅了。

嗯,咱们今天就把CAN总线的基础掰开揉碎讲清楚。你想想看,BootLoader升级说白了就是通过CAN总线把固件数据从诊断仪传到ECU里。如果连CAN总线都搞不明白,那升级失败都不知道问题出在哪。

3.1 CAN 2.0与CAN FD的区别

先说说CAN 2.0和CAN FD的区别。我习惯把CAN 2.0叫做「经典CAN」,CAN FD就是它的升级版。FD全称是Flexible Data-rate,灵活数据速率。

说白了,CAN FD就是在经典CAN的基础上做了两个重要改进:

  • 数据长度变长了:经典CAN一帧最多带8个字节数据,CAN FD可以带64个字节。你想想看,BootLoader升级时一包数据能传64字节,效率提升可不是一星半点。
  • 速率可以切换了:经典CAN最高速率1Mbps,CAN FD在数据段可以跑到8Mbps甚至更高。仲裁段还是用原来的速率,数据段才切高速。

核心区别总结

特性CAN 2.0CAN FD
最大数据长度8字节64字节
数据段速率固定(最高1Mbps)可切换(最高8Mbps+)
帧格式标准帧/扩展帧兼容CAN 2.0 + FD帧
CRC校验15位CRC17位/21位CRC(更强)

我在项目中遇到过一个问题:某款ECU明明支持CAN FD,但BootLoader升级时总是丢包。查了半天才发现,是网关把CAN FD帧当成了错误帧给过滤掉了。所以啊,做升级方案前一定要确认整个网络都支持CAN FD。

3.2 报文帧结构

CAN总线上跑的数据,我们叫它「报文帧」。常见的帧类型有四种:数据帧、远程帧、错误帧、过载帧。做BootLoader开发,最常用的是数据帧和远程帧。

咱们重点看看数据帧的结构。我画个简图帮你理解:

帧起始 | 仲裁场 | 控制场 | 数据场 | CRC场 | 应答场 | 帧结束
  SOF   |  ID+RTR |  DLC   |  0-8B  |  15bit |  ACK  |  EOF

这里有几个关键点:

  • 帧起始(SOF):一个显性位,告诉总线上其他节点「我要发数据了」。
  • 仲裁场:包含11位ID(标准帧)或29位ID(扩展帧)。ID越小优先级越高。我习惯把高优先级ID留给关键控制报文,低优先级给诊断和升级报文。
  • 控制场:包含IDE位、保留位和DLC(数据长度码)。DLC告诉接收方数据场有多少字节。
  • 数据场:0到8个字节的数据。BootLoader升级时,这里放的就是固件数据块。
  • CRC场:15位CRC校验,加上1位CRC界定符。嗯,这里要注意,CAN FD的CRC更强,有17位或21位。
  • 应答场:接收节点如果正确收到报文,会在应答槽发送显性位。如果没收到应答,发送节点会重发。

个人经验:调试BootLoader时,我经常用CAN分析仪抓报文。如果看到大量错误帧,先别急着查软件,看看总线终端电阻是不是接对了。120欧姆,两边各一个,这是基本功。

3.3 位时序与同步

位时序这个话题,说实话有点绕。但搞BootLoader升级,你必须懂。为什么?因为波特率配不对,ECU和诊断仪就聊不到一块去。

CAN总线的位时间分成四段:

  • 同步段(SS):1个时间量子,用于同步总线上的节点。
  • 传播段(PTS):补偿信号在总线上的传播延迟。
  • 相位缓冲段1(PBS1):用于补偿边沿相位误差。
  • 相位缓冲段2(PBS2):同样用于补偿,但位置在采样点之后。

采样点就在PBS1和PBS2之间。我建议采样点设置在85%左右,这样抗干扰能力最强。曾经有个项目,ECU在高温下频繁丢帧,我把采样点从75%调到85%,问题就解决了。

同步机制有两种:

  • 硬同步:每个帧起始的SOF下降沿触发,所有节点重新同步。
  • 重同步:帧内遇到显性到隐性的跳变时,调整相位缓冲段来补偿误差。

你想想看,如果总线上两个节点的晶振误差太大,重同步也救不了。所以CAN规范要求晶振误差不超过1.58%。我一般用0.5%精度的晶振,省心。

避坑指南:我曾经遇到过一个问题,BootLoader升级到一半突然卡死。排查了两天,发现是波特率配置表写错了。ECU上电时用默认波特率,但升级过程中切换到了另一个波特率,结果两边对不上。所以啊,波特率切换一定要做握手确认。

3.4 CAN网络拓扑

CAN总线的拓扑结构,说白了就是一条线,所有节点都挂在这条线上。但实际项目中,拓扑结构会影响BootLoader升级的稳定性。

常见的拓扑有:

  • 直线型:最简单,所有节点通过一根总线连接。两端各加一个120欧姆终端电阻。
  • 星型:通过集线器连接。这种拓扑要注意,集线器可能会引入延迟。
  • 混合型:直线+星型组合。大型车辆常用这种。

做BootLoader升级时,我建议优先用直线型拓扑。为什么?因为信号反射最小,误码率最低。星型拓扑如果分支太长,信号反射会导致位错误。

还有个关键点:终端电阻。没有终端电阻,总线信号会反射,导致通信失败。我见过有人用100欧姆代替120欧姆,结果总线电压不对,通信时好时坏。嗯,别省这个电阻钱。

网络设计建议

  • 总线长度不超过40米(1Mbps时)
  • 节点数不超过30个
  • 分支长度不超过0.3米
  • 终端电阻精度1%以上

好了,CAN总线基础就讲到这里。下一章咱们聊聊BootLoader的启动流程和分区管理。记住,CAN总线是BootLoader的「高速公路」,路修不好,车就跑不快。

课后思考:如果你的BootLoader升级速率是500kbps,每帧带8字节数据,算算升级一个256KB的固件需要多长时间?别忘了考虑帧间隔和应答时间。