1. 网络通信分层框架
1.1 OSI 七层参考模型
OSI(Open Systems Interconnection)由 ISO 提出,描述网络通信的分层架构。每一层只与相邻层交互,通过接口提供服务。
| 层级 | 名称 | 核心职责 |
|---|
| 7 | 应用层(Application) | 为应用程序提供接口,定义数据语义与服务 |
| 6 | 表示层(Presentation) | 数据格式转换、加密/解密、压缩 |
| 5 | 会话层(Session) | 建立、管理、终止会话 |
| 4 | 传输层(Transport) | 端到端可靠传输、流量控制、差错恢复 |
| 3 | 网络层(Network) | 逻辑寻址、路由选择、分组转发 |
| 2 | 数据链路层(Data Link) | 帧封装、物理寻址(MAC)、介质访问控制、差错检测 |
| 1 | 物理层(Physical) | 电气特性、机械特性、信号编码、比特流传输 |
1.2 TCP/IP 四层模型
互联网实际使用的分层模型,将 OSI 的上三层合并为应用层,下两层合并为网络接口层。
| TCP/IP 层级 | 对应 OSI 层级 | 核心职责 |
|---|
| 应用层 | 5~7(会话 + 表示 + 应用) | HTTP、FTP、DNS、Telnet 等协议 |
| 传输层 | 4 | TCP(可靠连接)、UDP(无连接) |
| 互联网层 | 3 | IP、ICMP、ARP、路由协议 |
| 网络接口层 | 1~2 | Ethernet、Wi-Fi、PPP、驱动程序 |
1.3 IEEE 802 模型
用于局域网(LAN)与城域网(MAN)的标准族,将 OSI 数据链路层拆分为两个子层。
| 层级 | 名称 | 核心职责 |
|---|
| LLC(Logical Link Control) | 数据链路层上子层 | 与上层协议交互,提供统一接口,处理复用/解复用 |
| MAC(Medium Access Control) | 数据链路层下子层 | 帧封装、物理寻址、介质访问控制(CSMA/CD、令牌环等) |
| 物理层 | — | 信号编码、电气特性、连接器规范 |
1.4 AUTOSAR 分层模型
汽车电子领域最常用的软件架构标准,通信栈将底层硬件抽象为标准化接口。
| AUTOSAR 层级 | 名称 | 核心职责 |
|---|
| 应用层(ASW) | Application Software | 实现软件组件(SWC),通过端口(Port)交互 |
| 运行时环境(RTE) | Runtime Environment | 组件间接口映射,信号路由 |
| 基础软件(BSW) | Basic Software | 通信栈(Com / PDU Router / CAN/LIN/Ethernet Driver)、存储、诊断、网络管理 |
| 微控制器驱动(MCAL) | Microcontroller Driver | 微控制器寄存器级驱动,直接操作 CAN/LIN/UART/SPI 控制器 |
AUTOSAR 的 BSW 通信栈中,CAN/LIN 的物理层/数据链路层功能由 Com Driver 封装,应用层(ASW)通过 RTE 收发信号,开发者通常不直接操作帧格式。
2. 嵌入式通信总线层级覆盖总览
以下按 OSI 七层完整列出各总线的覆盖情况。
| 协议 | 物理层(1) | 数据链路层(2) | 网络层(3) | 传输层(4) | 会话层(5) | 表示层(6) | 应用层(7) | 说明 |
|---|
| CAN | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ⚠️ | 需 CANopen/J1939 补充应用层 |
| LIN | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ⚠️ | 需 LDF/UDS 补充应用层 |
| UART | ✅ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | 仅起止位同步,无标准帧格式 |
| RS-232 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 纯电气标准,点对点 |
| RS-485 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 纯电气标准,多点差分 |
| I2C | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 设备寄存器语义由厂商定义 |
| SPI | ✅ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | 无标准帧格式,片选由 GPIO 控制 |
| USB | ✅ | ✅ | ❌ | ✅ | ✅ | ⚠️ | ✅ | 传输层/会话层/设备类完整定义 |
| Modbus | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | 依赖 RS-485/Ethernet 物理层 |
| Ethernet | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 网络层及以上由 TCP/IP 补充 |
| BLE | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | GATT/GAP 覆盖会话层与应用层 |
✅ = 完整定义;⚠️ = 部分定义或弱定义;❌ = 未定义,需上层协议补充。
3. 各协议详细说明
3.1 CAN
| OSI 层级 | CAN 协议栈内容 |
|---|
| 应用层(7) | CANopen、J1939、DeviceNet 等,定义对象字典、PDO/SDO、网络管理 |
| 数据链路层(2) | MAC:帧封装、位填充、CRC、位仲裁、ACK、错误检测;LLC:报文过滤、过载通知 |
| 物理层(1) | ISO 11898-2:差分信号电平、终端电阻(120 Ω × 2)、收发器特性、波特率 |
- CAN 的数据链路层功能(仲裁、CRC、ACK、错误帧)由硬件控制器自动完成,软件在应用层几乎无感知。
3.2 LIN
| OSI 层级 | LIN 协议栈内容 |
|---|
| 应用层(7) | LDF(LIN Description File)定义调度表、信号映射;UDS 诊断服务 |
| 数据链路层(2) | MAC:帧头/响应时序控制、主节点调度;LLC:PID 过滤、校验和计算、事件触发帧冲突处理 |
| 物理层(1) | ISO 9141(K-line):单线信号电平、上拉电阻、UART 异步位时序 |
- LIN 的复杂性从硬件转移到了软件:主节点需在应用层维护调度表与冲突回退逻辑。
3.3 UART
| OSI 层级 | UART 协议栈内容 |
|---|
| 数据链路层(2) | 仅定义起止位同步:1 起始位(显性)+ 8 数据位 + 1 停止位(隐性),无寻址、无 ACK、无帧校验 |
| 物理层(1) | 电气特性(TTL / RS-232 / RS-485)、波特率、单工/半双工/全双工 |
- UART 本身不定义数据包格式。实际工程中,通常在上层自定义协议帧(如
帧头 + 长度 + 数据 + CRC)来弥补数据链路层的缺失。
3.4 RS-232 / RS-485
| OSI 层级 | 内容 |
|---|
| 物理层(1) | 纯电气标准:RS-232(单端、点对点、±3V~±15V);RS-485(差分、多点、半双工/全双工) |
| 数据链路层及以上 | 未定义,需叠加 Modbus、自定义协议等 |
- RS-485 常与 Modbus RTU 配合使用:RS-485 提供物理层,Modbus 提供数据链路层与应用层。
3.5 I2C
| OSI 层级 | I2C 协议栈内容 |
|---|
| 数据链路层(2) | 起始/停止条件、ACK/NACK、7/10 位地址、读写位、字节传输时序 |
| 物理层(1) | 双线(SDA / SCL)、开漏输出、上拉电阻、电气特性、标准/快速/高速模式 |
- I2C 的数据链路层相对完整,但不定义数据语义。设备寄存器地址、读写格式、数据含义完全由设备厂商定义(如 EEPROM 的页写时序、传感器的配置寄存器)。
3.6 SPI
| OSI 层级 | SPI 协议栈内容 |
|---|
| 数据链路层(2) | 无标准帧格式。通常由设备定义:命令字节 + 地址字节 + 数据字节 |
| 物理层(1) | 四线(MOSI / MISO / SCK / CS)、全双工、推挽输出、时钟极性/相位(CPOL / CPHA) |
- SPI 的**片选(CS)**由 GPIO 控制,不属于协议内置的寻址机制。
- 相比 I2C,SPI 的协议标准化程度更低,几乎完全依赖设备数据手册定义通信时序。
3.7 USB
| OSI 层级 | USB 协议栈内容 |
|---|
| 应用层(7) | 设备类协议:HID(键盘鼠标)、Mass Storage(U盘)、CDC(虚拟串口)、Audio 等 |
| 表示层/会话层(6/5) | 设备配置、字符串描述符、枚举流程 |
| 传输层(4) | 四种传输类型:控制(Control)、中断(Interrupt)、批量(Bulk)、等时(Isochronous) |
| 数据链路层(2) | 帧/微帧格式:SYNC、PID、地址、端点号、CRC、握手包(ACK/NAK/STALL) |
| 物理层(1) | 差分信号(D+/D-)、NRZI 编码、位填充、电气特性、连接器规范 |
- USB 是嵌入式领域协议栈最完整的接口之一,从物理层到应用层均有严格定义,因此实现复杂度远高于 UART/SPI/I2C。
3.8 Modbus
| OSI 层级 | Modbus 协议栈内容 |
|---|
| 应用层(7) | 功能码(0x01~0x17):读线圈、读保持寄存器、写单个寄存器等;数据模型:线圈、离散输入、保持寄存器、输入寄存器 |
| 数据链路层(2) | ADU/PDU 格式:从机地址 + 功能码 + 数据 + CRC/LRC;主从问答机制 |
| 物理层(1) | 不定义,依赖 RS-485(Modbus RTU)或 Ethernet(Modbus TCP) |
- Modbus 是应用层协议,本身不规定电气特性。Modbus RTU 运行在 RS-485 之上,Modbus TCP 运行在 Ethernet + TCP/IP 之上。
3.9 Ethernet
| OSI 层级 | Ethernet 协议栈内容 |
|---|
| 数据链路层(2) | MAC 子层:MAC 地址、帧格式(目的 MAC / 源 MAC / 类型 / 数据 / FCS)、CSMA/CD |
| 物理层(1) | PHY 芯片:双绞线/光纤、信号编码(Manchester / 4B/5B / PAM5)、连接器规范 |
- Ethernet 本身只覆盖物理层与数据链路层,网络层及以上由 TCP/IP 协议栈 补充。
3.10 Bluetooth Low Energy(BLE)
| OSI 层级 | BLE 协议栈内容 |
|---|
| 应用层(7) | GATT Profile:Heart Rate、Battery、HID over GATT 等 |
| 表示层/会话层(6/5) | ATT 协议(属性协议)、GAP(通用访问规范):角色定义、连接管理、安全配对 |
| 传输层(4) | L2CAP:逻辑链路控制与适配,信道复用、分段重组 |
| 数据链路层(2) | Link Layer:状态机(Advertising/Scanning/Initiating/Connected)、帧格式、CRC、ACK |
| 物理层(1) | RF 层:2.4 GHz ISM 频段、40 个信道、GFSK 调制、跳频 |
- BLE 协议栈分层清晰,从物理层到应用层均有定义,但实现上通常由专用芯片(如 Nordic nRF 系列)固件完成,应用开发者主要与 GATT 层交互。
4. 层级缺失的共性与影响
4.1 为什么这些总线大多只覆盖底层
嵌入式通信总线的设计目标通常是板级或机箱级短距离实时通信,因此:
- 不需要网络层(3):无跨网段路由需求,所有节点在同一广播域内。
- 不需要传输层(4):无端到端可靠传输需求,错误处理由数据链路层或应用层完成。
- 不需要会话层(5):无会话建立/拆除过程(USB 除外,其枚举流程类似会话建立)。
4.2 层级缺失的弥补方式
| 缺失层级 | 弥补方案 | 示例 |
|---|
| 数据链路层不完整 | 上层自定义帧格式 | UART 上叠加 帧头 + 长度 + 数据 + CRC 协议 |
| 应用层缺失 | 设备数据手册定义寄存器语义 | I2C/SPI 传感器的配置寄存器表 |
| 网络层缺失 | 网关转发 | CAN-Ethernet 网关实现跨网段通信 |
| 传输层缺失 | 应用层重试机制 | Modbus 主站超时重发 |
5. 复杂度对比总结
| 协议 | 硬件复杂度 | 软件复杂度 | 协议栈完整性 |
|---|
| SPI | 低 | 中(设备时序各异) | 低 |
| I2C | 低 | 低 | 中 |
| UART | 极低 | 中(需自定义上层帧) | 低 |
| RS-485 | 低 | 中(需叠加 Modbus 等) | 低 |
| LIN | 低 | 高(调度表、冲突处理) | 中 |
| CAN | 中 | 低(硬件屏蔽底层) | 中 |
| USB | 高 | 高(驱动/枚举/设备类) | 高 |
| Ethernet + TCP/IP | 中 | 高 | 高 |
| BLE | 高 | 中(依赖协议栈固件) | 高 |
- 硬件复杂度:物理层电气特性、收发器设计难度。
- 软件复杂度:驱动开发、协议栈维护、应用层集成难度。
- 协议栈完整性:从物理层到应用层的覆盖程度。