汽车电子网络与总线实战:CAN FD、车载以太网与诊断刷写

发布时间:2026/10/29 6:02:39
汽车电子网络与总线实战:CAN FD、车载以太网与诊断刷写

1. 汽车电子的边界,其实就是一张网络拓扑图

干这行久了,经常被问"汽车电子技术到底难在哪儿",我一般不从芯片制程或者算法模型讲起,而是先问一句:你知道一台主流乘用车里到底有几个控制器、全套线束有多重吗?汽车电子技术和汽车网络这两个词,其实是同一个问题的两面——前者是节点,后者是节点之间的路。节点越多、功能越复杂,路怎么修、车道的宽窄、红绿灯的时序,就决定了整台车能不能跑得稳。我见过太多项目,硬件方案做得漂漂亮亮,样件装车一上电,报文互相堵死、诊断进不去、刷写中途掉线,问题全出在那张"路网"上。所以这篇东西不是教科书式的协议罗列,而是我把这些年做电子电气架构、总线和诊断摸爬滚打攒下的一些东西整理出来,从架构怎么分层、CAN 和 CAN FD 的参数怎么算、车载以太网怎么落地、诊断刷写怎么不砸手里,最后再讲几个现场排查的真事。刚入行一两年的朋友可以顺着当路线图看,已经做了几年、但一直只碰单一模块的同行,也能从后面几节的排查手法里捞到点能直接用的东西。

1.1 线束重量是这门生意的第一性原理

很多人第一次听到"一台车的线束总长能有两三公里、重量二三十公斤",反应都是惊讶。但只要你把这根主线想明白,汽车网络里九成的设计决策就都有了答案。线束的本质是点对点的物理连接,每多一个信号从 A 控制器送到 B 控制器,理论上就要多一根线;每多一个功能模块,就要多一组电源线、地线、信号线。线束重量直接压向整车油耗和续航,线束体积直接卡住装配工艺,线束成本直接体现为物料清单上那串数字。

这就是为什么几乎所有车企都在拼命做信号合并和总线化。一根双绞线上跑几十上百个信号,CAN 的出现本质上就是"用时间换铜"——分时复用,把并行的多根线压成一根串行总线。后来 LIN 把车窗、后视镜这种低速率、慢响应的东西从 CAN 上摘出去,用单根线搞定,成本压到几毛钱一个节点;再后来 CAN FD 把数据段速率提上去,是为了在不大改拓扑的前提下塞进更多数据;车载以太网则干脆换了一条路,用单对双绞线做到百兆甚至千兆,把摄像头、雷达这种高带宽传感器的数据接进主干。

我这里说的"用时间换铜"是我自己总结的说法,不是行业术语,但它确实能解释绝大多数总线选型的动机:带宽够用就行,省钱、省重量、省空间才是主机厂真正关心的。

所以当你拿到一份网络拓扑图,看到某个模块用的是 LIN 而不是 CAN,别急着吐槽"这年头还用 LIN",先想想它是不是雨刮、座椅加热这种对实时性毫无要求的执行器。反过来,如果看到某个域控把一堆高速信号全挂在一条 500kbps 的 CAN 上,那就要警惕了,负载率大概率已经逼近红线。

1.2 电子电气架构的三个阶段

从分布式到域集中,再到中央计算加区域控制器,这个演进路径这些年被讲烂了,但我还是想从"为什么必须走这一步"的角度重新捋一遍。

分布式阶段,每个功能一个 ECU,车门模块、座椅模块、空调模块、灯光模块各自为政。好处是开发解耦,某个模块出问题不影响别人;坏处是控制器数量爆炸,我见过一台老平台上塞了七八十个节点,光是给它们分配 CAN ID 和报文周期就够一个团队忙半年。更麻烦的是跨模块功能,比如"锁车后自动关窗并折叠后视镜",需要在三个 ECU 之间做信号联动,逻辑散落在各处,改一次需求要动三个供应商的代码。

域集中阶段,按功能域划分,动力域、底盘域、车身域、座舱域、智驾域各自有一个算力较强的域控制器,下面的小节点退化成执行器或者干脆被吸收进去。这一阶段最直接的变化是软件开始集中,跨域功能的逻辑可以在域控里闭环。但同时带来了新问题:域控之间的通信量剧增,原来 CAN 上那点带宽不够用了,于是主干网开始向以太网迁移。

中央计算加区域控制阶段,是目前很多新平台在推的方向。整车只留一两个中央计算单元负责算力,按物理位置划分的区域控制器负责 IO 汇聚和电源分配,中间用高速以太网主干连接。这么做的核心动机是软硬件彻底解耦——硬件按位置标准化,软件按功能部署,功能可以在不同计算单元之间迁移。

三个阶段的技术难点完全不同:分布式难在管理和一致性,域集中难在跨域通信和带宽,中央计算难在时间同步、功能安全和冗余设计。你在做方案的时候,得先明确自己处在哪个阶段,别拿分布式的经验去套中央计算的场景。

1.3 各条总线的分工,别想着一条打天下

我在评审会上最常纠正的一个认知偏差,就是有人觉得"以太网上车了,CAN 就该退休了"。实际完全不是这么回事,各条总线在今天依然是各司其职的状态。下面这张表是我自己整理的一版对照,参数按常见工程实践取值,不同项目会有出入,但量级和定位基本准确。

总线类型典型速率拓扑典型用途关键限制
LIN最高 20 kbps单线主从,一主多从车窗、后视镜、雨刮、座椅、氛围灯无仲裁、无错误帧,只能做慢速执行器
CAN最高 1 Mbps双绞线总线型动力、底盘、车身控制、诊断单帧最多 8 字节,负载率和实时性受限
CAN FD仲裁段 500 kbps,数据段 2~5 Mbps双绞线总线型新平台动力、域控间通信、刷写对终端匹配和支线长度极敏感
FlexRay10 Mbps,双通道总线或星型线控底盘、悬架、转向成本高、协议复杂,应用面在收缩
车载以太网100 Mbps / 1 Gbps点对点或交换式摄像头、雷达、域控主干、诊断需要交换芯片,时间同步要求高

这张表里最值得多说两句的是 CAN FD。很多团队在做迁移时,直接把 CAN 的报文搬过来,只把帧格式改成 FD,速率拉满,结果一上整车就各种错误帧。原因在后面第 2 节细说,这里先给个结论:CAN FD 不是 CAN 的简单加速版,它对物理层的要求严格得多,尤其是数据段速率超过 2 Mbps 之后,支线长度、终端电阻精度、连接器阻抗一致性,每一项都能让链路直接失效。

还有一个经常被忽略的点:总线的选择不只是技术问题,还是供应链问题。用一条成熟总线,意味着你能找到一堆现成的收发器、现成的分析工具、现成的测试规范;用一条小众总线,你可能要自己写驱动、自己做测试板、自己培训供应商。这个隐形成本在项目初期不明显,到量产爬坡阶段会集中爆发。

2. CAN 和 CAN FD:用得最多,也最容易翻车

CAN 有多普及呢,基本上只要你的车有四个轮子,身上就一定有 CAN。它稳定、便宜、生态成熟,但也正因为太成熟,很多人把它当成"配置一下就能跑"的东西,参数随便填、终端电阻随便加、负载率凭感觉估,等到偶发故障出现,再去查就非常痛苦。这一节我把 CAN 和 CAN FD 里最容易出问题的几个点拆开讲,尤其是参数计算部分,我会把算式写出来,你对着自己的晶振频率就能套。

2.1 位时间与采样点:手把手算一遍

位时间是 CAN 里最基础也最容易被忽视的参数。一个位时间被划分为四个段:同步段、传播段、相位缓冲段 1、相位缓冲段 2,每个段由若干个时间份额(tq)组成。采样点就落在相位缓冲段 1 和相位缓冲段 2 的交界处。采样点位置太靠前,信号还没稳定就采样,容易误判;太靠后,留给后续位的时间不够,同步容错变差。

举个实际的例子。假设控制器时钟 80 MHz,目标波特率 500 kbps。

第一步算 tq 和总段数。位时间 = 1 / 500000 = 2 μs。如果预分频设为 10,那么 tq = 10 / 80 MHz = 125 ns,一个位包含 2 μs / 125 ns = 16 个 tq。

第二步分配各段。想要 80% 的采样点,也就是采样点在第 12.8 个 tq 附近,取整到 13。于是同步段 1 tq、传播段 6 tq、相位缓冲段 1 取 6 tq,加起来 13;相位缓冲段 2 取 3 tq,总计 16。采样点 = (1 + 6 + 6) / 16 = 81.25%,接近目标值,可以接受。

第三步定同步跳转宽度 SJW。SJW 一般取相位缓冲段 2 和相位缓冲段 1 中较小的那个,这里取 3 或者更保守取 2 都行。SJW 越大,允许的相位误差补偿越强,但过大容易引入抖动。

CAN FD 要算两套,仲裁段和数据段各一套。数据段 2 Mbps 的话,位时间只有 500 ns,时钟 80 MHz、预分频取 2,tq = 25 ns,一个位 20 个 tq。采样点建议放在 75% 到 80%,取 16 个 tq 处:同步段 1、传播段 5、相位缓冲段 1 取 10,合计 16;相位缓冲段 2 取 4。采样点 = 80%。

注意事项:这里的段分配不是唯一解,各家控制器的约束也不一样,有的要求传播段至少多少、有的要求相位缓冲段 2 不小于某个值。算完之后一定要用工具做一致性测试,别只看计算器上显示的数字对不对。

我给的建议是,新项目一律按 80% 采样点起步,然后用示波器实测位宽和边沿。我遇到过不止一次因为供应商用了 75% 采样点、我们又用了 80%,两边在长线束上出现偶发错误帧的情况。整车网络里所有节点的采样点必须统一,这个原则在 CAN FD 上更是铁律。

2.2 终端电阻和拓扑:120 欧不是随便加的

CAN 总线两端各需要一个 120 Ω 的终端电阻,这是常识。但常识背后为什么是 120 Ω,很多人答不上来。CAN 用的双绞线特征阻抗在 100 到 120 Ω 之间,终端电阻的作用是做阻抗匹配,吸收信号到达线缆末端时的反射能量。如果两端各挂 120 Ω,从任意一个节点看进去,两条支路并联后的等效阻抗大约是 60 Ω,正好和线缆特征阻抗匹配。

实际排查里我总结出几个快速判断的手法:

  • 断电测电阻:把总线两端断开,用万用表量 CAN_H 和 CAN_L 之间的电阻,正常应该是 60 Ω 左右。如果量到 120 Ω,说明只有一端有电阻;如果量到 40 Ω 左右,说明多接了一个;如果量到几十欧姆以下甚至接近 0,大概率是短路或者某个节点内部损坏。
  • 上电测电平:正常隐性状态下 CAN_H 和 CAN_L 都在 2.5 V 附近,显性状态下 CAN_H 拉到 3.5 V、CAN_L 拉到 1.5 V,差分电压 2 V。如果两边电压不对称,先怀疑收发器或者共模电感。
  • 看支线长度:这是被严重低估的一项。CAN 在 500 kbps 下,单条支线建议不超过 0.3 m;CAN FD 数据段 2 Mbps 时,支线最好控制在 0.1 m 以内甚至完全取消。我见过一个车门模块的支线拉了将近 1 m,CAN 跑得好好的,一换成 CAN FD 就疯狂报错误帧,最后把支线缩短到 15 cm 才彻底解决。

另一个高频问题是拓扑不规整。理想的 CAN 是一条直线,节点挂在主干上。但整车布置往往做不到,于是出现星型、树型、菊花链混着来的情况。这种拓扑本身不是不能用,但必须做仿真或者实测验证,尤其是反射和驻波。我的经验是,节点数超过 15 个、或者总线长度超过 40 m 的时候,拓扑就必须认真对待,不能靠"以前这么干也没事"糊过去。

2.3 总线负载率怎么估,多高算危险

总线负载率的计算不难,但很多人在估算的时候会漏掉位填充和帧间隔。标准的算法是:把 1 秒内所有报文占用的总位数加起来,除以波特率。关键在于"总位数"怎么算。

以标准数据帧、8 字节数据为例,去掉位填充后的基础长度大约是 108 位(含帧起始、仲裁段、控制段、数据段、CRC、应答、帧结束)。但 CAN 有位填充机制,连续 5 个相同电平就要插入 1 个相反电平,最坏情况下会多出约 20% 的位数。工程上一般按 130 位左右估算,保守一点按 135 位。

假设一条 500 kbps 的 CAN 上跑了 40 条报文,其中 30 条周期 10 ms、10 条周期 100 ms:

  • 30 条 × 100 帧/秒 × 130 位 = 390,000 位/秒
  • 10 条 × 10 帧/秒 × 130 位 = 13,000 位/秒
  • 合计约 403,000 位/秒,除以 500,000 得到负载率约80.6%

这个数字已经很危险了。经验上我把负载率分成四档:

负载率区间状态判断处理建议
30% 以下非常健康有充足余量,可支撑后续功能扩展
30% ~ 50%正常大多数量产项目的目标区间
50% ~ 70%偏紧需要关注最坏情况下的时延,考虑拆分或迁移
70% 以上危险高优先级报文的时延无法保证,必须做架构调整

为什么 70% 以上就危险?因为 CAN 是基于优先级仲裁的,低优先级报文在总线繁忙时会被不断推迟,理论上可以无限期推后。负载率越高,这种"饿死"的概率越大。而像转向角、制动踏板这类信号,时延超过几十毫秒就可能触发功能降级。所以我在做报文设计的时候,会把高优先级报文的周期压缩到最短、数据长度压到最小,把长长的状态报文拆成多条低优先级帧,原理就是让关键的短帧更容易抢到总线。

2.4 错误帧、Bus Off 与恢复策略

CAN 的错误处理机制是它稳定性的核心,但也是排查时最让人头疼的部分。每个节点内部有发送错误计数器(TEC)和接收错误计数器(REC),出错就加、成功就减。TEC 超过 255 时,节点进入Bus Off状态,主动脱离总线,不再参与通信。

Bus Off 本身不是故障,是保护机制。真正的问题是为什么会 Bus Off。我梳理过这些年遇到的原因,大概集中在几类:物理层问题(终端电阻缺失、支线过长、线束破损、连接器虚接)、波特率或采样点不一致、某个节点软件异常疯狂发帧、电磁干扰。排查顺序我一般按"先物理后逻辑"来:先量电阻和电平,再看错误帧的分布,最后抓报文看是谁在持续出错。

抓错误帧有个技巧:错误帧的形态是 6 个连续显性位,会破坏正常帧结构。用分析工具看总线统计的时候,重点关注错误帧出现的时刻和伴随的报文 ID,如果总是紧跟着某一个 ID 出现,问题基本就锁定在那个节点或者它附近。

恢复策略上,标准做法是检测到 Bus Off 后延时一段时间再尝试恢复,恢复成功后如果短时间内再次 Bus Off,则延长下次恢复的延时(快恢复加慢恢复)。这个延时的取值很有讲究:太短会导致总线反复抖动,太长又会让节点长时间失联。我的做法是首次恢复延时 100 ms,连续失败时按 100 ms、200 ms、400 ms 递增,上限 2 s。

实操心得:很多项目在台架上测得好好的,装车就偶发 Bus Off,十有八九是线束问题。我建议在样车阶段就在关键节点上挂个记录仪,把 Bus Off 前后的报文全存下来,事后分析比现场瞎猜高效得多。

3. 车载以太网:从诊断口一路杀进主干

如果说 CAN 解决的是"信号怎么少走线",那以太网解决的就是"数据太多线走不下"。摄像头、激光雷达、高精地图、座舱大屏,这些动辄几十上百兆的数据流,靠 CAN FD 那点带宽根本喂不饱。于是车载以太网从最早的 OBD 诊断口开始,一步步爬到了整车主干网的位置。这一节我想讲清楚三件事:它和你家里那根网线到底差在哪、上面的协议栈是怎么分工的、以及什么时候真的需要上 TSN。

3.1 100BASE-T1 与家里那根网线的差别

第一次接触车载以太网的人,最容易犯的错误是拿普通网线和 RJ45 水晶头去接。这两者物理层完全不同。100BASE-T1用的是单对非屏蔽双绞线,一根线上同时完成收发,靠的是回声消除和 PAM3 调制;而普通百兆以太网用两对线,一对发一对收。线束这边,车载用的是小巧的 HSD 或者 MATEnet 类连接器,不是 RJ45。

速率上也有一条演进线:100BASE-T1 有效载荷 100 Mbps,链路长度标称 15 m;1000BASE-T1 到 1 Gbps,链路长度可以做到 40 m;再往上还有多千兆的方案,但成本和散热是门槛。多数乘用车目前主干还是千兆,传感器侧百兆居多。

还有一个特别容易踩的坑:Master / Slave 模式。车载以太网 PHY 必须一端配置为 Master、一端配置为 Slave,链路才能建立。台架上随手拿两块板子对接,如果两边都默认 Master,物理链路根本起不来,你会以为是硬件坏了,其实是配置问题。我建议在项目初期的连接器定义表里就把主从关系写清楚,别等到联调现场现查。

另一个差异是唤醒和休眠。车规以太网 PHY 支持睡眠唤醒(Sleep/Wake),通过线缆上的特定波形唤醒对端,这对整车静态电流控制很关键。普通以太网没有这套机制,直接照搬会导致熄火后某个节点一直在耗电。

3.2 SOME/IP 和 DoIP:一个跑服务,一个跑诊断

车载以太网上跑两套主要的应用层协议,用途完全不同,很多人第一次听会混。

SOME/IP是面向服务的通信中间件,核心思想是"服务提供者发布服务、服务消费者订阅服务",可以用请求-响应,也可以用发布-订阅。它解决的是传统 CAN 上"信号固定映射"的问题——CAN 里每个信号在报文里的位置是写死的,加一个信号就要改 DBC、改所有节点的解析代码;SOME/IP 里服务的接口是动态的,加方法或者加事件对已有消费者影响小得多。这套东西是 SOA(面向服务架构)在车上的落地方式。

DoIP是跑在 IP 上的诊断协议,用来替代传统的 CAN 诊断。它的优势是带宽高,刷写大文件时速度能快一个数量级;另一个优势是远程诊断,只要网络可达就能连。DoIP 有几个关键概念:车辆声明(上电后主动广播自己的逻辑地址和 IP)、路由激活(诊断仪要先激活路由才能发诊断请求)、以及基于逻辑地址的寻址。

两者的关系可以这么理解:DoIP 管"怎么把一个诊断请求送到某个 ECU",SOME/IP 管"应用功能之间怎么互相调用"。实际项目里经常是两条路并行,诊断走 DoIP,功能通信走 SOME/IP。

3.3 TSN 到底什么时候才值得上

TSN(时间敏感网络)这几年热度很高,一堆方案里不写 TSN 好像就不够先进。但我得说句实话:大部分项目其实不需要完整的 TSN。TSN 是一组标准的集合,包括时间同步(gPTP)、时间感知整形、帧抢占、冗余、流量调度等等,每一项都有明确的适用条件。

什么时候真的需要?我总结三个判断依据:

第一,有硬实时要求且多流共存的场景。比如底盘域控要同时处理转向指令和一大坨传感器数据,转向指令的端到端时延要求毫秒级且抖动极小,这时候时间感知整形(给实时流预留固定时间窗口)就有价值。

第二,需要跨节点精确时间对齐。多个传感器融合的时候,如果每个传感器的时间戳基准不一致,融合结果就会漂。gPTP 能把全网时间偏差控制到亚微秒级,这个能力在智驾域是刚需。

第三,有可靠性冗余要求。比如刹车、转向这类功能,链路断了不能失能,就得用冗余路径加帧复制消除。

反过来,如果只是把 CAN 上的车身控制信号搬到以太网上,那完全用不着 TSN,配好 VLAN 优先级(QoS)就够了。我见过一些方案为了"技术先进"把 TSN 全套堆上去,结果交换机配置复杂度暴涨、调试周期拉长、成本上去了,实际收益却看不出多少。技术选型还是要回到需求本身。

3.4 抓包调试的现场手法

以太网调试比 CAN 舒服的地方在于抓包方便,但也更容易被"抓了包看不懂"困住。我的常规流程是这样:

先确认链路。用支持车载以太网的介质转换器把车上的单对线转成标准以太网,接到笔记本上,看链路指示灯和 PHY 状态寄存器。如果链路起不来,先查主从配置和线束,不要在协议层浪费时间。

再抓原始包。用抓包工具在交换机镜像口或者串联点抓,先看有没有预期的广播、组播流量,再看 SOME/IP 的服务发现报文有没有正常收发。服务发现跑在 UDP 上,如果看不到,多半是网络配置或者防火墙策略的问题。

最后做应用层分析。把抓到的包按服务实例过滤,看请求和响应的时延、有没有丢包重传。这里有个经验:车载以太网上的问题有相当一部分是时序问题而不是协议问题,比如某个服务消费者在服务提供者还没完成初始化的时候就开始订阅,结果订阅失败,后面一直收不到数据。这种问题在抓包里表现为"某个时间点之后报文就断了",需要结合日志一起看。

4. 协议跑通只是开始:AUTOSAR、诊断与刷写

我在带新人的时候经常强调一句话:能让报文跑起来,只完成了两成工作量。剩下的八成在架构规范、诊断刷写、功能安全这些"不出彩但必须做对"的地方。这一节就讲讲这些。

4.1 CP 和 AP 的分工边界

AUTOSAR 分经典平台(CP)和自适应平台(AP),很多人知道这个划分,但说不清边界在哪。我的理解是这样:

CP 面向的是硬实时、资源受限、安全等级高的控制类任务,比如电机控制、电池管理、刹车。它基于静态配置,所有任务和通信在编译期就确定了,运行时开销小、确定性好。用 C 语言,跑在 MCU 上,通常配 RTOS。

AP 面向的是高算力、动态部署、需要频繁 OTA 的复杂应用,比如智驾感知、座舱交互。它基于 POSIX,支持动态加载进程,通信走 SOME/IP 这类服务化机制,跑在 SoC 上,通常配 Linux 或 QNX。

实际项目里两者是共存的,中间靠一个"信号到服务"的转换层打通。这个转换层是最容易出问题的地方,因为 CP 那边的信号是周期性的、无连接的,AP 这边是事件驱动、面向服务的,两者的时序模型不一样。我遇到过信号在转换层被缓存住、导致 AP 侧收到的是旧值的情况,排查了很久才发现是转换配置里的更新策略选错了。

4.2 一次完整刷写会话的报文流

UDS 诊断的刷写流程,我觉得是每个做汽车电子的人都该烂熟于心的东西。下面按阶段把关键服务列一下,服务号都是标准定义。

预编程阶段:诊断仪先读当前软件版本(0x22 读数据标识符),确认目标 ECU 和版本;然后关闭 DTC 记录(0x85 控制 DTC 设置),避免刷写过程中的异常被记录下来;再进入扩展会话(0x10 03)。

编程会话建立:切到编程会话(0x10 02),ECU 会复位并跳转到 Bootloader;然后做安全访问(0x27),先请求种子,再根据种子算出密钥回传,通过后才有写权限。

刷写执行:写入指纹信息(0x2E,一般包含日期、诊断仪标识、维修站代码);请求下载(0x34),告诉 ECU 数据总大小和格式;擦除 Flash(0x31,例程控制);然后循环传输数据(0x36),每个块带一个块序号,ECU 校验通过才回正响应;全部传完后请求退出传输(0x37)。

校验与收尾:做完整性校验(0x31 例程,常见的是 CRC32 或者签名校验);切换回默认会话(0x10 01);硬复位(0x11 01);最后重新读取版本确认刷写成功。

整个过程里最容易出问题的环节,我个人经验是0x36 传输阶段的块大小和流控。块太大,ECU 的接收缓冲区不够会丢包;块太小,传输效率低,一个几十兆的包能刷半小时。另外 CAN FD 刷写和 DoIP 刷写的参数要分别调优,前者受总线负载影响大,后者受网络带宽和 TCP 窗口影响大。

提示:刷写测试一定要做异常场景,包括刷到一半断电、刷到一半拔线、刷写过程中总线负载拉满。这些场景在产线和售后都会真实发生,Bootloader 能不能安全回滚,直接决定了会不会把 ECU 刷成砖。

4.3 功能安全与信息安全的最小动作集

功能安全这块,ISO 26262 那套流程完整走下来对一个小团队来说负担很重。我的做法是抓几个最小动作:

一是做危害分析和风险评估,至少把安全目标定下来,明确哪些功能失效是不可接受的、对应的安全等级是什么。这一步不做,后面所有设计都是无根之木。

二是通信层面的保护机制。CAN 上加 E2E 保护(计数器加 CRC),防止报文丢失、重复、乱序、内容被篡改;关键信号做冗余传输或者双通道校验。

三是监控与降级。每个安全相关功能都要有独立的监控逻辑,主功能失效时能切到安全状态。这里的关键是监控逻辑本身要独立于被监控的逻辑,不能共用一个核、一份代码。

信息安全这边,现在法规要求的基本动作包括:安全启动、安全诊断(27 服务要有足够强度的算法)、通信加密(关键报文加密或者加消息认证码)、以及 OTA 包的签名验证。我个人的建议是把这些做成平台化的基础能力,别每个项目重新造一遍轮子。

5. 现场排查实录:三个让我印象深刻的坑

理论和流程讲完了,讲点真实的。下面这几个案例都是我亲身经历的,细节做了脱敏处理,但技术逻辑是原样的。

5.1 偶发 Bus Off:一个接插件引发的连锁反应

某车型在路试阶段出现偶发 Bus Off,频率大概是每天一两次,台架上完全复现不了。一开始怀疑是软件问题,查了半个月没结果。后来在车上装了长时间记录仪,把 Bus Off 前后的报文和电压全存下来,发现一个规律:每次 Bus Off 之前,都有一个特定节点的错误计数器在缓慢上升,而且上升往往发生在过减速带或者颠簸路段。

这个规律指向物理层。把那个节点的线束拆下来检查,发现连接器插针有轻微的氧化,振动时接触电阻变化,导致信号边沿畸变,错误计数累积到阈值就 Bus Off。更换连接器、加了防振固定之后问题消失。

这个案例给我的教训是:偶发问题一定要想办法让它"留下证据"。靠现场描述和主观判断,永远查不到根因。

5.2 以太网丢包:冷启动时序不对齐

另一个项目,座舱和智驾域控之间的以太网通信,冷启动后大概有 5% 的概率出现某个服务订阅不上。热启动、单独重启都正常,只有整车冷启动才复现。

抓包分析发现,订阅请求发出去的时候,服务提供者那边还没完成服务注册。也就是说,消费者启动太快了,提供者还没准备好。这在台架上不会出现,因为台架上是分别上电的。

解决办法有两个方向:一是让消费者在订阅失败后做定时重试;二是优化启动时序,让提供者的服务注册提前。我们两个都做了,重试间隔设为 500 ms、最多重试 10 次,同时把提供者的初始化流程做了剪裁,把服务注册提到最前面。改完之后复现率降到零。

5.3 常见问题速查表

下面这张表是我这些年攒下来的,贴在工位上,遇到问题先扫一眼。

现象高概率原因快速验证手法
CAN 完全无通信终端电阻缺失、线束断路、收发器供电异常断电测 CAN_H/CAN_L 电阻,应在 60 Ω 左右
偶发错误帧支线过长、连接器接触不良、干扰缩短支线,检查连接器,用示波器看边沿
固定节点持续 Bus Off波特率或采样点不匹配、该节点软件异常比对全网的位时序配置,抓该节点的发送记录
CAN FD 高负载下大量错误数据段速率过高、拓扑不满足要求降速到 2 Mbps 测试,检查支线长度
以太网链路起不来主从模式配置错误、PHY 供电、线序读 PHY 状态寄存器,确认一端 Master 一端 Slave
服务订阅失败启动时序不对齐、服务发现报文被丢弃抓包看服务发现流程,检查 VLAN 和组播配置
UDS 刷写中途失败块大小不合适、流控参数错误、总线负载过高降低块大小,检查流控帧,刷写时限制其他流量
诊断进不去会话切换失败、安全访问算法不匹配、路由未激活逐条看诊断响应码,DoIP 场景检查路由激活状态

6. 工具与经验的私货:少走弯路的几条建议

最后这一节,聊聊工具和方法论。这部分内容比较主观,都是我自己用下来的体会,不一定适合所有人,但可以当个参考。

6.1 工具选型的取舍

工具这块我的原则是:分析类工具要买好的,仿真类工具够用就行。原因在于,分析工具决定了你排查问题的效率上限,一个好的总线分析工具能同时看多路报文、能做统计、能回放、能自动化脚本,这些能力在关键时刻能省下几天时间。而仿真类工具,很多场景用开源方案加点自己写的脚本就能覆盖。

具体到配置,我建议至少备齐这几样:一台支持 CAN 和 CAN FD 的多通道分析仪,一台支持车载以太网的介质转换加抓包设备,一台带宽足够的示波器(看边沿和眼图用),再加上一套能跑自动化测试脚本的环境。台架上再配一个可编程的电源,能做上下电时序测试,这个在排查冷启动问题时特别有用。

买工具的时候要注意一个坑:标称支持不等于好用。有些分析仪号称支持 CAN FD,但数据段只到 2 Mbps,遇到 5 Mbps 的项目就傻眼;有些以太网转换器不支持 gPTP,做时间同步测试就没法用。采购前一定要拿着自己的实际用例去试,别只看参数表。

6.2 我在项目里坚持的几条做法

第一条,所有参数都要有出处。位时序、采样点、报文周期、负载率、超时时间,每一个数字都应该能追溯到计算过程或者规范要求。我见过太多项目,参数是从上一个项目抄过来的,问为什么是这个值,没人说得清。等到出问题,连从哪儿查都不知道。

第二条,尽早做整车级的联调。台架环境再完善,也模拟不出整车的线束长度、电源波动、电磁环境。我的经验是,能在样车上验证的,绝不留到量产前。早期发现一个物理层问题,改一根线束就行;晚期发现,可能要改模具。

第三条,把测试用例当资产管起来。每个踩过的坑,都应该沉淀成一条自动化或者半自动化的测试用例。我们团队现在有一套回归测试集,覆盖了总线负载、错误注入、刷写异常、上下电时序这些场景,每次软件迭代都跑一遍。这套东西前期投入不小,但后面省下的返工时间远超投入。

第四条,别迷信"以前这么干也没事"。汽车电子的技术在快速变化,从 CAN 到 CAN FD 到以太网,从分布式到中央计算,每一代的技术约束都不一样。上一代能跑通的方案,下一代可能就是隐患。保持怀疑,多做验证,这是我这些年最实在的体会。

最后分享一个我自己用的小技巧:每次做完一个新平台的总线和诊断设计,我会画一张"故障树",把可能出问题的环节从上到下过一遍,每个环节标注验证方法。这张图不对外交付,纯粹是给自己做检查用的,但帮我提前发现过不少设计漏洞。纸上推演一遍,比在车上摸黑排查一整天强得多。