4、车载网络基础(以太网):100BASE-T1/1000BASE-T1物理层、TCP/IP协议栈裁剪、SOME/IP协议入门
各位同学,欢迎来到第四章。今天咱们聊聊车载以太网。
说实话,我刚入行那会儿,车上跑的还是CAN和LIN。那时候觉得,100kbps的CAN FD已经很快了。直到后来做ADAS项目,摄像头数据回传,CAN总线直接卡死。嗯,从那以后,我就知道以太网这玩意儿,迟早得上车。
4.1 为什么是车载以太网?
你想想看,一辆智能网联车,光摄像头就有七八个,再加上激光雷达、毫米波雷达,还有那个动不动就几十GB的高精地图。CAN总线那点带宽,说白了就是小水管。以太网不一样,它是大动脉。
但问题来了:普通以太网能用吗?
不行。普通以太网用的是RJ45接口,四对差分线,又重又贵,而且EMC性能在车里根本过不了。所以,汽车行业搞了两套专用标准——100BASE-T1和1000BASE-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_ARP、LWIP_IGMP、LWIP_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)怎么写,代码怎么生成。到时候我会拿一个真实项目里的例子,带你们一步步调通。
好,今天就到这里。有问题随时找我。