3. 整车匹配基础
VCU在车上不是孤岛。它要跟BMS、MCU、OBC、仪表盘聊天。聊天的媒介就是CAN总线,聊天的语言就是UDS诊断协议。这一块要是搞不透,车跑起来你连它哪儿疼都不知道。
我刚开始做VCU标定时,最怕的就是CAN报文看不懂。明明发了指令,电机就是没反应。后来才发现,是ID过滤配错了。嗯,这种坑踩过一次就记住了。
3.1 CAN协议基础:物理层的那些事
CAN总线是差分信号传输。两条线:CAN_H和CAN_L。显性电平(逻辑0)时,CAN_H比CAN_L高2V左右;隐性电平(逻辑1)时,两线电压差接近0。
说白了,就是靠电压差来传0和1。抗干扰能力强,适合车里这种电磁环境恶劣的地方。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 波特率 | 250 kbps / 500 kbps | 动力CAN常用500k,车身CAN常用250k |
| 帧类型 | 数据帧 / 远程帧 / 错误帧 / 过载帧 | VCU最常用数据帧 |
| ID长度 | 11位(标准帧) / 29位(扩展帧) | 动力系统多用扩展帧 |
| 数据长度 | 0~8字节 | CAN 2.0A/B标准 |
3.2 CAN报文解析:从二进制到物理值
拿到一帧CAN报文,你怎么知道它代表什么?
举个例子。报文ID是0x18FF50E1,数据段是8个字节:01 2C 00 00 00 00 00 00。这代表什么?
你得看DBC文件。DBC就是CAN报文的“字典”。它告诉你:
- 哪个ID对应哪个信号
- 信号在数据段里的起始位和长度
- 缩放因子和偏移量
- 单位
比如上面那组数据,DBC里可能定义:
BO_ 512 VCU_Status: 8 VCU
SG_ VCU_Mode : 0|8@1+ (1,0) [0|3] "" ECU
SG_ TargetTorque : 8|16@1+ (0.1,0) [0|3000] "Nm" ECU
解析过程:
- 起始位0,长度8位 → 取第一个字节
01→ 十进制1 → VCU_Mode = 1(表示Ready模式) - 起始位8,长度16位 → 取第2~3字节
2C 00→ 小端模式 = 0x002C = 44 → 乘以因子0.1 → 4.4 Nm
你看,就这么简单。但实际项目里,DBC文件可能有上千个信号。我建议你先把动力相关的信号挑出来,其他的慢慢啃。
3.3 UDS诊断协议:让VCU开口说话
UDS(ISO 14229)是统一诊断服务。说白了,就是让VCU告诉你它现在什么状态,或者你告诉VCU去做什么。
UDS基于请求-响应模型。诊断仪发请求,VCU回响应。常用的服务就三个:
| 服务ID | 名称 | 作用 | 我常用的场景 |
|---|---|---|---|
| 0x22 | ReadDataByIdentifier | 读数据 | 读电池SOC、电机温度、故障码 |
| 0x2E | WriteDataByIdentifier | 写数据 | 写标定参数、清除学习值 |
| 0x31 | RoutineControl | 执行例程 | 执行自学习、执行传感器校准 |
0x22服务:读数据
请求格式:22 + DID(2字节)
响应格式:62 + DID + 数据
举个例子,读VCU的软件版本号:
请求:22 F1 90
响应:62 F1 90 01 02 03 04
DID = 0xF190,数据 = 01 02 03 04,表示版本号V1.2.3.4。
0x2E服务:写数据
请求格式:2E + DID + 数据
响应格式:6E + DID + 数据
注意:写数据前通常需要安全访问(0x27服务)。否则VCU会拒绝写入。
0x31服务:例程控制
请求格式:31 + 子功能 + RID(2字节) + 数据
子功能:01=启动,02=停止,03=查询结果
比如执行电机转子位置自学习:
请求:31 01 02 01
响应:71 01 02 01
RID = 0x0201,启动自学习。VCU执行完后会返回结果。
3.4 CCP/XCP标定协议:在线调参的利器
标定协议是干啥用的?你想想看,VCU里有个扭矩滤波系数,你想从0.1调到0.05。总不能每次改完都刷一遍固件吧?太慢了。
CCP(CAN Calibration Protocol)和XCP(Universal Calibration Protocol)就是干这个的。它们让你在VCU运行时,直接修改RAM里的参数。
| 对比项 | CCP | XCP |
|---|---|---|
| 传输层 | CAN | CAN / Ethernet / FlexRay |
| 数据包 | 固定8字节 | 可变长度 |
| 地址宽度 | 32位 | 32/64位 |
| DAQ模式 | 支持 | 支持,更灵活 |
| 我推荐 | 老项目用CCP | 新项目用XCP on CAN |
CCP的核心命令就几个:
- CONNECT:建立连接
- SET_MTA:设置内存地址
- DOWNLOAD:写数据到RAM
- UPLOAD:从RAM读数据
- START_STOP:启动/停止DAQ采集
XCP比CCP多了个“动态DAQ列表”的功能。你可以随时增删要采集的信号,不用重新编译A2L文件。我个人更喜欢XCP,尤其是做电机标定时,经常要换着看不同的信号。
- CAN是物理层,UDS是应用层,CCP/XCP是标定层
- UDS用于诊断和下线检测,CCP/XCP用于研发标定
- DBC文件是CAN解析的钥匙,A2L文件是CCP/XCP的钥匙
- 标定前先确认安全访问,否则写不进去
3.5 知识体系总览
下面这张图把CAN通信、UDS诊断和CCP/XCP标定的关系串起来了。你看一遍就能明白它们各自的位置。
这张图把CAN、UDS、CCP/XCP的关系讲清楚了。CAN是管道,UDS是对话规则,CCP/XCP是调参工具。三者缺一不可。
实际项目中,我一般先用CAN工具抓报文,确认通信正常。然后用UDS读一遍关键数据,确认VCU状态。最后用CCP/XCP做在线标定,调参数直到性能达标。这套流程走下来,VCU的通信和诊断基本就稳了。