4、车载网络基础(以太网):100BASE-T1/1000BASE-T1物理层、TCP/IP协议栈裁剪、SOME/IP协议入门

各位同学,欢迎来到第四章。今天咱们聊聊车载以太网。

说实话,我刚入行那会儿,车上跑的还是CAN和LIN。那时候觉得,100kbps的CAN FD已经很快了。直到后来做ADAS项目,摄像头数据回传,CAN总线直接卡死。嗯,从那以后,我就知道以太网这玩意儿,迟早得上车。

4.1 为什么是车载以太网?

你想想看,一辆智能网联车,光摄像头就有七八个,再加上激光雷达、毫米波雷达,还有那个动不动就几十GB的高精地图。CAN总线那点带宽,说白了就是小水管。以太网不一样,它是大动脉。

但问题来了:普通以太网能用吗?

不行。普通以太网用的是RJ45接口,四对差分线,又重又贵,而且EMC性能在车里根本过不了。所以,汽车行业搞了两套专用标准——100BASE-T11000BASE-T1

核心区别一句话:100BASE-T1和1000BASE-T1只用一对双绞线,就能跑100Mbps或1Gbps。省线、省重量、省成本,EMC还好。

4.2 100BASE-T1物理层

100BASE-T1,也叫BroadR-Reach。我记得最早是Broadcom推的,后来被IEEE标准化了。

它的物理层有几个关键点:

  • 一对线:只用一对非屏蔽双绞线,不像普通百兆以太网需要两对。
  • 全双工:同时收发,靠回波抵消技术实现。这个技术挺妙的,我当年调试的时候,回波抵消没调好,自环就把自己干趴下了。
  • 传输距离:15米,够用了。车里最长的线也就从车头到车尾。
  • 编码:PAM3,三电平脉冲幅度调制。不是普通的NRZ,所以频谱利用率高。

避坑指南:我曾经在项目里遇到过,100BASE-T1的线束如果和电源线走同一个线束,干扰会非常大。后来我们强制要求,以太网线必须单独走,或者至少保持5cm以上的间距。这个坑,你们以后一定会遇到。

4.3 1000BASE-T1物理层

1000BASE-T1,就是千兆车载以太网。它和百兆的差别,不只是速度。

参数 100BASE-T1 1000BASE-T1
速率 100 Mbps 1 Gbps
编码 PAM3 PAM4
线对 1对 1对
传输距离 15m 15m
典型应用 诊断、OTA、摄像头 ADAS域控、激光雷达

1000BASE-T1用了PAM4编码,一个符号能传2个bit。但代价是信噪比要求更高。我个人习惯,在做千兆设计时,PCB走线一定要做阻抗控制,差分阻抗100欧姆,一点都不能偏。

注意:1000BASE-T1的PHY芯片功耗比100BASE-T1大不少。如果你做的是低功耗的T-Box,建议只在需要高速通信时才唤醒千兆PHY,平时用百兆就够了。

4.4 TCP/IP协议栈裁剪

好了,物理层讲完了。但光有物理层,数据还是跑不起来的。你得有协议栈。

标准的TCP/IP协议栈,是为PC和服务器设计的。那玩意儿在嵌入式系统里跑,太臃肿了。你想想看,一个网关MCU,RAM才几百KB,你让它跑完整的Linux协议栈?不现实。

所以,我们要做协议栈裁剪

我个人常用的裁剪策略:

  • 去掉不必要的协议:比如ARP、ICMP重定向、IGMP这些,在车里基本用不上。
  • 简化TCP:TCP的窗口缩放、选择性确认(SACK),这些高级功能可以砍掉。车里大多是短连接,没必要。
  • UDP优先:车载通信,尤其是SOME/IP,大部分走UDP。TCP只在诊断和OTA时用。
  • IP分片禁用:车里MTU一般设成1500,或者直接用巨帧。IP分片在车里是灾难,性能差还容易丢包。

我建议:如果你用的是FreeRTOS + lwIP,直接把lwIP的配置头文件打开,把不需要的宏注释掉。比如 LWIP_ARPLWIP_IGMPLWIP_SNMP,统统关掉。能省下至少30%的RAM。

4.5 SOME/IP协议入门

最后,咱们聊聊SOME/IP。

SOME/IP,全称是Scalable service-Oriented MiddlewarE over IP。说白了,它就是一套在以太网上做服务发现和远程调用的协议。

为什么需要它?

因为传统的CAN通信,是基于信号的。你发一个CAN ID,里面塞几个信号,接收方解析。但以太网不一样,它是基于服务的。比如,我想获取车速,不是去读某个CAN ID,而是去调用一个叫getVehicleSpeed()的服务。

SOME/IP的核心概念:

  • Service(服务):提供某种功能的实体,比如"车门控制服务"。
  • Method(方法):远程过程调用,比如"LockDoor()"。
  • Event(事件):服务端主动通知,比如"车门状态变化"。
  • Field(字段):可读可写的属性,比如"当前车门锁状态"。

我记得第一次调SOME/IP的时候,服务发现老是超时。后来发现是SD(Service Discovery)报文发的间隔太短,网关处理不过来。嗯,这里要注意,SD报文的周期建议设在100ms以上,别太激进。

实战经验:SOME/IP的序列化(Serialization)很关键。数据在发送前要打包成二进制流,接收方再解包。我建议你们用vsomeip这个开源库,它已经帮你处理好了序列化和反序列化。但要注意,不同编译器对结构体对齐的处理不一样,跨平台通信时一定要加#pragma pack(1)

4.6 小结

这一章内容不少。从物理层的100BASE-T1和1000BASE-T1,到协议栈裁剪,再到SOME/IP入门。说白了,车载以太网就是一套从物理到应用的完整解决方案。

下一章,我们会深入SOME/IP的实战配置,包括服务接口定义文件(ARXML)怎么写,代码怎么生成。到时候我会拿一个真实项目里的例子,带你们一步步调通。

好,今天就到这里。有问题随时找我。