17、多ECU协同升级:车载以太网与DoIP协议、UDS诊断服务(0x34/0x36/0x37)、网关路由与优先级管理、跨域升级时序控制
多ECU协同升级,说白了就是让车上几十个脑子(ECU)一起换系统。这事儿比手机升级复杂得多。手机就一个处理器,车上有网关、座舱、智驾、车身控制……每个ECU都有自己的固件,升级顺序错了,车可能就趴窝了。
我个人习惯把多ECU升级拆成三个核心问题:怎么传数据、怎么刷写、怎么协调。咱们一个一个聊。
17.1 车载以太网与DoIP协议
传统CAN总线带宽只有1Mbps,刷个几百兆的座舱系统得等半小时。以太网一上来,直接干到100Mbps甚至1Gbps。DoIP(Diagnostics over IP)就是基于以太网的诊断协议,它把UDS诊断报文封装在TCP/IP包里。
我在项目中遇到过一个问题:DoIP的端口号是13400,但很多工程师不知道它其实支持同时多个连接。一个连接用来发诊断请求,另一个用来收事件通知,互不干扰。
DoIP的核心流程:
- 车辆发现:诊断仪发广播,ECU回复自己的IP和VIN
- 路由激活:诊断仪请求激活,ECU返回激活状态
- 诊断通信:通过UDS over DoIP发送请求/响应
你想想看,如果不用DoIP,每个ECU都得单独接一根线。有了以太网,所有ECU都挂在同一个网络里,网关负责把诊断报文路由到目标ECU。
17.2 UDS诊断服务:0x34/0x36/0x37
这三个服务是刷写的核心。我刚开始做OTA时,总把0x34和0x36搞混。后来记住一句话:0x34是握手,0x36是传数据,0x37是结束。
| 服务ID | 名称 | 作用 |
|---|---|---|
| 0x34 | Request Download | 告诉ECU我要刷写了,协商数据格式和大小 |
| 0x36 | Transfer Data | 分块传输固件数据,每块最大4096字节 |
| 0x37 | Request Transfer Exit | 通知ECU数据传完了,开始校验和安装 |
避坑指南:我曾经在0x34的请求里忘了设置正确的内存地址,结果ECU把固件刷到了校准数据区,车机直接黑屏。0x34的请求报文里有个memoryAddress字段,一定要和ECU的Flash分区表对齐。
0x36的块大小也很关键。以太网环境下,我建议每块设成4096字节。太大容易丢包重传,太小又浪费带宽。嗯,这里要注意:0x36的响应里有个blockSequenceCounter,ECU用这个来检测丢包。如果连续丢两块,ECU会直接中止刷写。
17.3 网关路由与优先级管理
网关是升级的大脑。它负责把DoIP报文从以太网侧路由到CAN、LIN甚至FlexRay总线。每个ECU都有自己的物理地址和逻辑地址,网关维护一张路由表。
我在项目中遇到过一个问题:同时升级座舱ECU和网关ECU,结果网关把自己刷死了,所有路由都断了。后来我们加了一条规则:网关必须最后升级,或者升级网关时保留一个最小路由表。
优先级管理原则:
- 安全相关ECU(如制动、转向)优先级最高,必须最先升级
- 网关ECU优先级最低,避免升级过程中断路由
- 娱乐ECU可以后台升级,不影响驾驶安全
说白了,优先级管理就是决定谁先谁后。我见过一个方案:把ECU分成三个优先级组。第一组是安全ECU,第二组是车身控制,第三组是座舱和娱乐。同一组内的ECU可以并行升级,不同组必须串行。
17.4 跨域升级时序控制
跨域升级是最头疼的。座舱域、智驾域、车身域,每个域都有自己的升级策略。时序控制的核心是依赖关系。
举个例子:智驾域的摄像头ECU升级后,图像处理ECU也必须升级,否则协议不兼容。这种依赖关系必须在升级前就定义好。
我建议的时序控制流程:
- 云端下发升级包,车端先做依赖检查
- 按优先级分组,每组内并行升级
- 每组升级完成后,做功能验证
- 所有组都完成后,做整车级验证
我曾经在时序控制上栽过跟头。有一次升级顺序是:先升级座舱,再升级智驾。结果座舱升级后,智驾域的网络配置变了,智驾ECU连不上网关。从那以后,我坚持在升级前做全车网络拓扑快照,升级完成后做一致性校验。
这张图展示了我常用的时序控制流程。注意看,依赖检查和网络拓扑快照是并行进行的,这样可以节省时间。升级完成后,功能验证是必须的,不能跳过。
我的经验:跨域升级最容易出问题的是时序窗口。比如座舱域升级需要5分钟,智驾域需要3分钟,如果同时开始,座舱域还没结束,智驾域已经完成了,这时候智驾域可能因为座舱域的网络变化而出错。我建议用栅栏机制:所有ECU都到达同一个状态后,再统一进入下一步。
嗯,最后说一句。多ECU协同升级没有银弹。每个车型的ECU拓扑都不一样,依赖关系也不同。我见过最复杂的项目有80多个ECU需要协同升级,光依赖图就画了三天。但核心思路不变:先安全、后娱乐、网关最后、验证不能省。