2、OSI模型与UDS:UDS在OSI七层模型中的映射、物理层与数据链路层选择(CAN/LIN/FlexRay)
好,咱们进入第二章。这一章我打算聊聊UDS和OSI模型的关系。
说实话,很多工程师刚接触UDS时,总觉得它就是个「发请求、收响应」的协议。但实际做项目时你会发现,如果不理解它在网络模型中的位置,出了问题根本无从下手。
我个人习惯,讲UDS之前,先把这个底层的「地基」讲清楚。
2.1 OSI七层模型回顾
OSI模型,搞通信的应该都背过。从上到下:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
但UDS不是全都要。它主要用下面几层:
- 应用层(第7层):UDS协议本身就在这。你发的诊断请求、收到的响应,都是这一层的事。
- 会话层(第5层):UDS的「会话控制」功能落在这。比如默认会话、扩展会话、编程会话的切换。
- 传输层(第4层):对于CAN来说,ISO 15765-2(也就是我们常说的CAN TP)负责把长报文拆包、重组。
- 网络层(第3层):同样由CAN TP处理,负责寻址和路由。
- 数据链路层(第2层):CAN控制器干的活,比如帧格式、错误检测、仲裁。
- 物理层(第1层):CAN收发器、差分信号、波特率这些。
你想想看,UDS的请求从应用层一路往下走,经过传输层拆包,再到数据链路层封装成CAN帧,最后通过物理层发出去。反过来也一样。
核心要点:UDS本身只定义了应用层的行为。底下怎么传,是CAN TP和CAN驱动的事。但作为BSW开发者,这几层你都得懂。
2.2 UDS在OSI模型中的映射
咱们具体看看UDS的各个部分映射到了哪一层。
| OSI层 | UDS相关功能 | 具体协议/标准 |
|---|---|---|
| 应用层(7) | 诊断服务(10进0x10、22读数据、2E写数据等) | ISO 14229-1 |
| 表示层(6) | 数据编码(比如Intel/Motorola格式) | ISO 14229-1(隐含) |
| 会话层(5) | 会话控制、安全访问 | ISO 14229-1 |
| 传输层(4) | 分段传输、流控制 | ISO 15765-2(CAN TP) |
| 网络层(3) | 网络寻址、路由 | ISO 15765-2 |
| 数据链路层(2) | CAN帧封装、错误检测 | ISO 11898-1 |
| 物理层(1) | 电平信号、位时序 | ISO 11898-2 |
我刚开始做UDS时,一直搞不懂为什么要有CAN TP这一层。后来遇到一个项目,诊断数据超过8个字节,发出去对方收不全。查了半天,才发现是TP层没配置好。嗯,从那以后我再也不敢跳过传输层了。
2.3 物理层与数据链路层的选择
UDS不挑物理层。CAN、LIN、FlexRay、以太网都能跑。但实际项目中,选哪个得看场景。
2.3.1 CAN总线
CAN是UDS最常用的载体。为什么?
- 实时性好:事件触发,优先级仲裁,关键诊断报文能抢到总线。
- 可靠性高:CRC校验、错误帧、重发机制,误码率极低。
- 成本适中:比LIN贵,但比FlexRay便宜。
我在项目中遇到过一个问题:某ECU在高速CAN总线上,诊断响应总是超时。排查下来,发现是CAN控制器接收FIFO深度不够,诊断响应被其他报文挤掉了。后来把FIFO深度从8改成16,问题解决。
小技巧:用CAN跑UDS时,建议把诊断报文ID设成高优先级。不然遇到总线负载高,诊断响应可能被延迟。
2.3.2 LIN总线
LIN主要用于车身低速控制,比如车窗、座椅、门锁。UDS在LIN上也能跑,但有限制。
- 主从架构:只有主节点能发起诊断请求,从节点只能响应。
- 速度慢:最大20kbps,适合小数据量。
- 无仲裁:LIN是调度表驱动的,没有CAN那种优先级抢占。
说白了,LIN上的UDS只适合做简单的读故障码、读版本号。你要是想用LIN刷写程序,那得等很久。
注意:LIN的UDS实现中,诊断请求通常用「主节点发诊断请求帧,从节点发诊断响应帧」的方式。但LIN帧只有8字节数据场,所以长报文也得拆包。不过LIN没有CAN TP那么复杂的流控制,简单很多。
2.3.3 FlexRay总线
FlexRay主要用在安全关键系统,比如线控制动、线控转向。它的特点是:
- 时间触发:确定性高,延迟可预测。
- 双通道:冗余设计,容错性好。
- 高速率:最高10Mbps。
但FlexRay的UDS实现比CAN复杂。因为FlexRay是静态调度,诊断报文得提前分配好时隙。我曾经在一个FlexRay项目里,为了加一个诊断服务,得重新生成整个通信矩阵。嗯,那感觉,谁做谁知道。
2.4 实际项目中的选择建议
说了这么多,到底怎么选?我个人的经验是:
- 动力总成、底盘、ADAS:首选CAN。成熟、稳定、工具链完善。
- 车身控制、舒适系统:LIN够用。成本低,线束少。
- 安全关键、线控系统:FlexRay。但要做好心理准备,开发周期长。
- 未来趋势:车载以太网(DoIP)。带宽大,刷写快,但成本高。
一句话总结:UDS是应用层的协议,不挑物理层。但物理层的选择决定了你的诊断性能、成本和开发复杂度。选对了,事半功倍;选错了,后面全是坑。
2.5 本章小结
这一章我们聊了:
- UDS在OSI模型中的映射关系
- CAN、LIN、FlexRay三种物理层的优缺点
- 实际项目中的选型建议
下一章,我会深入UDS的会话管理和安全访问机制。到时候咱们聊聊「为什么有时候发诊断请求没响应」——嗯,这个问题我当年可是被折磨得不轻。