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 实际项目中的选择建议

说了这么多,到底怎么选?我个人的经验是:

  1. 动力总成、底盘、ADAS:首选CAN。成熟、稳定、工具链完善。
  2. 车身控制、舒适系统:LIN够用。成本低,线束少。
  3. 安全关键、线控系统:FlexRay。但要做好心理准备,开发周期长。
  4. 未来趋势:车载以太网(DoIP)。带宽大,刷写快,但成本高。

一句话总结:UDS是应用层的协议,不挑物理层。但物理层的选择决定了你的诊断性能、成本和开发复杂度。选对了,事半功倍;选错了,后面全是坑。

2.5 本章小结

这一章我们聊了:

  • UDS在OSI模型中的映射关系
  • CAN、LIN、FlexRay三种物理层的优缺点
  • 实际项目中的选型建议

下一章,我会深入UDS的会话管理和安全访问机制。到时候咱们聊聊「为什么有时候发诊断请求没响应」——嗯,这个问题我当年可是被折磨得不轻。