2. 车载网络基础
做多协议网关,第一件事不是写代码,而是搞清楚你面对的是哪些“方言”。
车载网络不像IT网络那样几乎被以太网一统天下。车里同时跑着CAN、LIN、FlexRay、MOST,还有越来越猛的车载以太网。每种协议从物理层的电平、线束,到数据链路层的帧结构、仲裁方式,都完全不同。
我个人习惯,拿到一个新项目,先拉一张协议全景表贴在工位上。今天我就把这张表的核心内容拆给你看。
2.1 物理层:信号怎么在线上跑?
物理层决定了线束成本、抗干扰能力、传输距离和速率。车里环境恶劣,EMC要求极高,物理层设计往往是瓶颈。
| 协议 | 传输介质 | 拓扑结构 | 差分/单端 | 典型速率 | 最大节点数 | 总线长度 |
|---|---|---|---|---|---|---|
| CAN 2.0 | 双绞线 | 总线型 | 差分 | 125k~1Mbps | 30~40 | 40m@1Mbps |
| CAN-FD | 双绞线 | 总线型 | 差分 | 数据段最高8Mbps | 30~40 | 40m@1Mbps |
| LIN | 单线 | 主从星型 | 单端 | 20kbps | 16 | 40m |
| FlexRay | 双绞线(双通道) | 总线/星型 | 差分 | 10Mbps | 64 | 24m |
| MOST25/50/150 | 塑料光纤(POF) | 环形 | 光信号 | 25/50/150Mbps | 64 | 数十米 |
| 100BASE-T1 | 单对双绞线 | 点对点 | 差分 | 100Mbps | 2 | 15m |
| 1000BASE-T1 | 单对双绞线 | 点对点 | 差分 | 1Gbps | 2 | 15m |
关键差异点
- CAN/CAN-FD:差分信号,抗干扰强,但速率受限于总线长度。CAN-FD在数据段提速,仲裁段仍用1Mbps。
- LIN:单线,成本极低。说白了就是UART加了个从机休眠唤醒。我见过有人拿LIN当廉价传感器总线,但20kbps的速率只能传开关信号。
- FlexRay:双通道冗余,时间触发,确定性极强。但线束成本高,配置复杂。我曾经在一个线控转向项目里被FlexRay的同步帧折腾了两周。
- MOST:光纤环网,专为音视频流设计。现在基本被以太网取代,但存量车还有。
- 车载以太网:单对线,点对点。100BASE-T1和1000BASE-T1物理层完全不同,不能混用。注意,它和办公室的100BASE-TX不兼容。
2.2 数据链路层:帧怎么组织?怎么仲裁?
物理层把比特流送过来,数据链路层负责组帧、寻址、错误检测和介质访问控制。这部分是网关协议转换的核心战场。
2.2.1 CAN 2.0 vs CAN-FD
CAN 2.0的帧结构大家应该熟悉:SOF、11/29位ID、控制段、数据段(0~8字节)、CRC、ACK、EOF。仲裁靠ID优先级,ID越小优先级越高。
CAN-FD在数据链路层做了两个关键改进:
- 可变速率:仲裁段1Mbps,数据段最高8Mbps。物理层需要支持快速切换。
- 更大数据场:最多64字节。这对网关来说太重要了。我做过一个OTA升级项目,用CAN-FD传固件包,效率比CAN 2.0高了4倍。
避坑指南
我曾经在CAN-FD和CAN 2.0混接时踩过坑。CAN-FD节点发送FD帧,CAN 2.0节点看到DLC大于8会直接报错。网关必须做速率转换和帧格式转换,不能透传。
2.2.2 LIN 2.x
LIN的帧结构很简单:同步间隔段、同步段、标识符段、数据段(1~8字节)、校验和段。主节点调度,从节点响应。没有仲裁,没有冲突。
你想想看,LIN的标识符只有6位,最多64个ID。但实际项目中一般只用十几个节点。它的调度表是固定的,主节点按时间表发帧头,从节点对号入座。
2.2.3 FlexRay
FlexRay的数据链路层分静态段和动态段。静态段是时间触发,每个时槽固定分配给一个节点,确定性极高。动态段是事件触发,类似CAN的仲裁。
帧结构包含:帧头(5字节)、有效载荷(0~254字节)、帧尾(3字节CRC)。FlexRay的同步机制很复杂,冷启动、重同步、时钟校正,我建议你直接用芯片的协议引擎,别自己写。
2.2.4 MOST
MOST的帧结构是同步的,每帧包含同步数据(流数据)和异步数据(控制数据)。它的网络管理是分布式的,节点加入/离开环网需要复杂的配置流程。
说实话,MOST的物理层和数据链路层耦合太紧,网关做MOST到以太网的转换,通常需要专用的MOST网络控制器芯片。
2.2.5 车载以太网
100BASE-T1和1000BASE-T1的数据链路层就是标准的IEEE 802.3 MAC。帧结构、MAC地址、VLAN、CRC32,和办公室以太网完全一样。
但物理层不同:
- 100BASE-T1:PAM3编码,单对线,全双工。没有RX/TX分开,靠回波抵消。
- 1000BASE-T1:PAM3编码,单对线,全双工。速率更高,物理层更复杂。
注意
车载以太网物理层芯片(如博通BCM89811、Marvell 88Q2112)的配置寄存器、MDIO接口、唤醒/休眠逻辑都和工业以太网不同。别拿Linux的通用PHY驱动直接怼,会出问题。
2.3 协议全景对比图
下面这张图是我自己画的全景对比,帮你快速定位每种协议在车载网络中的位置。
2.4 网关设计的关键启示
看完这张全景图,你应该能感受到多协议网关的挑战在哪:
- 速率不匹配:LIN的20kbps和1000BASE-T1的1Gbps差了5万倍。网关必须有足够的缓冲和调度能力。
- 帧结构不同:CAN的11位ID、LIN的6位ID、FlexRay的时槽、以太网的MAC地址,路由表必须能统一管理。
- 实时性要求不同:FlexRay的静态段是硬实时,以太网是软实时。网关转发时不能破坏确定性。
- 唤醒/休眠机制不同:CAN有本地唤醒,LIN有主从唤醒,以太网有EEE和WoL。网关的电源管理必须协调这些差异。
我的建议
刚开始做网关设计,别想着一个芯片搞定所有协议。先画清楚你的协议矩阵,明确哪些协议需要转换,哪些只是透传。我见过最惨的案例,是工程师把CAN-FD当CAN 2.0用,结果数据段速率没配,整车网络瘫痪。