第2章:诊断架构:诊断仪与ECU通信模型、物理层与链路层基础、CAN总线简介

各位同学,欢迎来到第二章。

上一章我们聊了UDS是什么,能干什么。这一章,咱们得把“地基”打牢。你想想看,诊断仪和ECU之间到底是怎么“说话”的?它们之间有没有什么“规矩”?

我个人习惯,在讲任何协议之前,先搞清楚物理连接。不然你代码写得再漂亮,信号发不出去,全是白搭。

2.1 诊断仪与ECU的通信模型

说白了,这就是一个“一问一答”的模型。诊断仪是“主”,ECU是“从”。

诊断仪发一个请求(Request),ECU收到后,必须回一个响应(Response)。

这个模型很简单,但有个关键点:ECU不能主动说话。它只能被动回答。为什么?因为总线上可能挂着好几个ECU,如果大家都抢着说,总线就乱套了。

核心通信流程:

  • 请求(Request):诊断仪发送,包含服务ID(SID)和参数。
  • 指示(Indication):ECU的CAN控制器收到消息,通知上层软件。
  • 响应(Response):ECU处理完,发回肯定响应或否定响应。
  • 确认(Confirmation):诊断仪收到响应,确认通信完成。

我在项目中遇到过一个问题:某个ECU在休眠状态下,诊断仪怎么发请求它都不理。后来发现,是ECU的CAN收发器在休眠时把总线给断开了。嗯,这里要注意,ECU的电源状态直接影响诊断通信

2.2 物理层与链路层基础

这部分是硬核知识。很多工程师觉得“物理层跟我写软件有什么关系?”关系大了去了!

2.2.1 物理层:信号怎么跑

物理层决定了电压、电平、传输速率这些“硬指标”。

在汽车上,最常用的就是CAN总线。CAN总线用两根线:CAN_H和CAN_L。它们之间的电压差,决定了信号是“显性”(0)还是“隐性”(1)。

信号状态 CAN_H电压 CAN_L电压 差分电压
显性(Dominant) 3.5V 1.5V 2.0V
隐性(Recessive) 2.5V 2.5V 0V

你想想看,为什么用差分信号?抗干扰啊!两根线绞在一起,外部干扰对两根线的影响几乎一样,电压差不变。这就是CAN总线能在发动机舱这种恶劣环境下稳定工作的原因之一。

避坑指南:我曾经在测试时,发现总线一直报错。查了半天,原来是CAN_H和CAN_L接反了。记住:CAN_H接CAN_H,CAN_L接CAN_L,别搞混!

2.2.2 链路层:数据怎么组织

链路层负责把物理层的“0”和“1”组织成有意义的“帧”。

CAN总线有四种帧类型:

  • 数据帧:传输数据,诊断通信主要用这个。
  • 远程帧:请求数据,诊断中很少用。
  • 错误帧:检测到错误时发送。
  • 过载帧:接收方忙不过来时发送。

数据帧的结构,我建议你记住:

帧起始(SOF) + 仲裁场(ID + RTR + IDE) + 控制场(DLC) + 数据场(0-8字节) + CRC场 + ACK场 + 帧结束(EOF)

这里有个关键点:仲裁场。CAN总线用ID来决定谁有发言权。ID越小,优先级越高。诊断通信的ID通常设得很高(优先级低),因为诊断不能干扰车辆的正常运行。

注意:标准CAN(CAN 2.0A)的ID是11位,扩展CAN(CAN 2.0B)是29位。UDS on CAN通常用11位标准ID,但有些高端车也用29位。你测试前一定要确认好。

2.3 CAN总线简介

CAN总线,全称Controller Area Network。1986年由德国博世公司发明,初衷是为了减少汽车线束。现在,它已经是汽车电子系统的“神经中枢”。

我个人觉得,CAN总线最牛的地方在于:多主通信。任何节点都可以主动发消息,靠ID仲裁解决冲突。这比传统的“主从式”总线灵活多了。

UDS诊断在CAN总线上,通常使用功能寻址物理寻址两种方式:

  • 物理寻址:点对点通信。诊断仪发请求给特定ECU,ECU必须响应。ID通常是:0x7E0(请求)和 0x7E8(响应)。
  • 功能寻址:一对多通信。诊断仪发请求给一组ECU,所有符合条件的ECU都要响应。ID通常是:0x7DF

我记得有一次,客户抱怨说“为什么我用功能寻址读故障码,有的ECU不回?”后来发现,那个ECU的CAN控制器配置错了,把功能寻址的ID过滤掉了。嗯,CAN硬件过滤器是个好东西,但配置错了也是个大坑。

2.3.1 CAN总线的物理特性

再补充几个关键参数:

  • 波特率:常见的有125kbps、250kbps、500kbps。诊断通信通常用500kbps。
  • 终端电阻:总线两端各需要120Ω电阻,用于消除信号反射。没有它,通信会不稳定。
  • 总线长度:与波特率有关。500kbps时,最长约100米。车内用绰绰有余。

实战经验:我建议你在做诊断测试前,先用示波器看看CAN总线的波形。正常的波形应该是:显性位时,CAN_H和CAN_L的电压差在2V左右;隐性位时,电压差接近0V。如果波形畸变,先检查终端电阻和线束。

小结

这一章我们聊了诊断仪和ECU的“一问一答”模型,也深入了物理层和链路层。说白了,UDS诊断就是建立在CAN总线这个“高速公路”上的“交通规则”。

下一章,我们会正式进入UDS协议的核心——服务。准备好了吗?

课后思考:如果总线上同时有两个ECU要发诊断响应,会发生什么?提示:想想CAN的仲裁机制。

好了,今天就到这里。记住,理论要结合实践。找个开发板,搭个CAN网络,亲手抓个报文看看,比看十遍书都管用。