CAN诊断速通笔记,按"面试追问概率"排序。
一、CAN总线基础(铺垫层,5分钟)
一句话定义:CAN是差分串行总线(CAN_H / CAN_L两根线),多主仲裁,靠报文ID决定优先级(ID越小优先级越高)。
面试必知的4个数字:
| 项目 | 关键值 |
|---|---|
| 标准帧ID | 11位(0x000~0x7FF) |
| 扩展帧ID | 29位(车厂诊断一般用它) |
| 单帧数据段 | 最多8字节(CAN FD才有64字节) |
| 常见诊断波特率 | 500K / 250K,诊断刷写常用1M |
帧类型:数据帧、远程帧、错误帧、过载帧——问到了答"诊断主要用数据帧"即可。
二、诊断寻址(重点,UDS over CAN的核心)
车载诊断消息用CAN ID来区分"说给谁听":
1. 物理寻址(Physical Addressing)—— 一对一
- 测试仪 → ECU:ID如
0x7E0(发给具体某个ECU) - ECU → 测试仪:ID如
0x7E8(该ECU的应答地址) - 特点:有问必答,诊断仪刷写、读DID、安全解锁都用这个
2. 功能寻址(Functional Addressing)—— 一对多(广播)
- 测试仪 → 所有ECU:ID如
0x7DF - 特点:通常只有会话控制(0x10)、部分ECU复位类服务用广播;且不支持多帧传输(广播没人做流控),这是常考点
记忆口诀:物理寻址=私聊(0x7E0/0x7E8),功能寻址=群发(0x7DF),群发不能发长消息。
三、单帧 / 多帧传输(ISO-TP层,重点)
CAN一帧只能装8字节,但UDS请求经常超8字节(比如WriteDataByIdentifier写VIN码),所以传输层用ISO 15765-2(ISO-TP)拆包:
PCI字节(每帧第一个字节的高4位)区分帧类型:
| 帧类型 | PCI首字节 | 说明 |
|---|---|---|
| 单帧 SF | 0x0X | X=数据长度,≤7字节直接发 |
| 首帧 FF | 1X XX | 表示"我要发多帧了",X XX=总数据长度 |
| 连续帧 CF | 2X | 后续数据帧,X=序号1,2,3…F循环 |
| 流控帧 FC | 3X | 接收方应答:BS块大小、STmin间隔时间 |
经典流程(能复述这个就过关):
诊断仪 → ECU:10 14 (首帧:我要发20字节) ECU → 诊断仪:30 00 00 (流控:继续发,无限制) 诊断仪 → ECU:21 xx xx... (连续帧,序号从1开始) 诊断仪 → ECU:22 xx xx...关键细节:连续帧序号到0x2F后回绕到0x20;流控帧里的STmin是两帧之间的最小发送间隔。
四、UDS请求/响应规则(和寻址联动,重点)
正常肯定响应 = 服务ID + 0x40
请求: 22 F1 90 (ReadDataByIdentifier,读VIN) 肯定响应:62 F1 90 xx xx... (0x22+0x40=0x62)否定响应 = 7F + 原服务ID + NRC
请求: 22 F1 90 否定响应:7F 22 31 (NRC=0x31,requestOutOfRange)必背的6个NRC(面试最高频):
| NRC | 名称 | 触发场景 |
|---|---|---|
| 0x11 | serviceNotSupported | 服务不支持 |
| 0x12 | subFunctionNotSupported | 子功能不支持(如10 05) |
| 0x13 | incorrectMessageLengthOrInvalidFormat | 长度/格式错误 |
| 0x22 | conditionsNotCorrect | 条件不满足(如车速不为0时刷写) |
| 0x31 | requestOutOfRange | DID/DTC不存在或越界 |
| 0x33 | securityAccessDenied | 没解锁就访问受保护数据 |
响应抑制位(suppressPosRspMsgIndicationBit):请求服务带子功能时,子功能字节的最高位bit7=1表示"成功就不要回肯定响应了"(减少总线负载)。例如10 82= 进入默认会话且不回响应。
五、CANoe实操口径(工具层面兜底)
被问"CANoe里怎么做诊断"按这个答:
- 用Diagnostic Console(手动发诊断请求)或写CAPL脚本(自动化)
- 需要加载诊断描述文件(CDD/PDX,里面有DID、安全算法、会话配置)
- 用Panel做交互界面,用Test Module跑诊断测试序列,最后出HTML报告
- Log分析看Trace窗口:正常/异常响应、NRC、多帧流控时序一目了然
自测清单(能答出这8题就安全)
- 物理寻址和功能寻址的区别?功能寻址为什么不能有肯定响应和多帧?
- 22服务读到数据的肯定响应SID是多少?
- 否定响应
7F 22 78是什么意思?(0x78 = responsePending,请求已收到正在处理——刷写时常见) - 首帧PCI是
10 14表示什么? - 连续帧序号超了0x2F怎么办?
- NRC 0x33 什么时候出现?
- 为什么刷写前要做安全访问(27服务)?(防盗/防误刷写,种子-密钥机制)
- CANoe诊断需要加载什么文件?
把第二、三、四节背熟(约30分钟),第一、五节理解即可。有答不上来的具体题随时来问。