嵌入式通讯协议
嵌入式系统的核心工作之一是让芯片与外设、传感器、电机驱动器"对话"。掌握通讯协议,就掌握了嵌入式系统的"神经网络"。
一、为什么需要多种协议?
不同的应用场景对通讯有不同要求:速度、距离、设备数量、实时性、成本。这就是为什么嵌入式世界中有那么多协议并存。
mindmap
root((嵌入式通讯))
芯片内/板级
SPI - 高速外设
I²C - 多传感器总线
UART - 调试 · 模块通信
1-Wire - 温度传感器
板间/设备间
CAN Bus - 汽车 · 机器人
RS485/Modbus - 工业控制
RS232 - 老设备
无线
蓝牙 BLE
WiFi
LoRa
高速/工业以太网
EtherCAT - 高实时
USB - PC 接口
二、协议横向对比
基础参数对比
| 协议 |
信号线数 |
拓扑 |
双工 |
最大速率 |
最大距离 |
典型应用 |
| UART |
2(TX/RX) |
点对点 |
全双工 |
~10 Mbps |
~15 m(TTL)/ 更远(RS232) |
调试、GPS、蓝牙模块 |
| SPI |
4+(CLK/MOSI/MISO/CS) |
一主多从 |
全双工 |
~50 Mbps |
<1 m(板内) |
Flash、LCD、ADC、编码器 |
| I²C |
2(SCL/SDA) |
一主多从 |
半双工 |
3.4 Mbps |
<1 m |
MPU6050、气压计、OLED |
| CAN Bus |
2(差分 CANH/CANL) |
多主总线 |
半双工 |
1 Mbps |
~40 m@1Mbps |
汽车 ECU、机器人电机驱动器 |
| RS485 |
2(差分 A/B) |
多主/主从 |
半双工 |
10 Mbps |
~1200 m |
工业步进驱动器、Modbus |
| RS232 |
3+(TX/RX/GND) |
点对点 |
全双工 |
~1 Mbps |
~15 m |
老式设备、工控机接口 |
电气特性对比
| 协议 |
电平标准 |
抗干扰能力 |
说明 |
| UART (TTL) |
0/3.3V 或 0/5V |
弱 |
单端信号,怕电磁干扰 |
| SPI |
0/VCC 单端 |
弱 |
板内使用,短距离 |
| I²C |
0/VCC 开漏上拉 |
弱 |
板内,有地址冲突风险 |
| CAN |
差分 ±2V |
强 |
高抗干扰,车载环境设计 |
| RS485 |
差分 ±2.5V |
强 |
长距离工业首选 |
| RS232 |
±3V ~ ±25V |
中 |
电平摆幅大,历史遗留 |
三、各协议典型应用场景
传感器通讯
| 传感器类型 |
推荐协议 |
代表芯片 |
理由 |
| 6轴 IMU |
I²C / SPI |
MPU6050(I²C)、ICM42688(SPI) |
高速采样用 SPI |
| 气压计 |
I²C / SPI |
BMP280、MS5611 |
低速传感器,I²C 足够 |
| 温湿度 |
I²C / 1-Wire |
SHT30、DHT22、DS18B20 |
简单外设 |
| 磁编码器 |
SPI / I²C |
AS5048B(SPI)、AS5600(I²C) |
高精度用 SPI |
| 激光雷达 |
UART / ETH |
RPLIDAR、Livox |
数据量大用高速接口 |
| 深度相机 |
USB / ETH |
D435、L515 |
图像数据带宽需求 |
| GPS |
UART |
ublox NEO-M8N |
NMEA 协议 |
电机驱动器通讯
| 驱动器类型 |
协议 |
代表产品 |
说明 |
| 大疆电调 |
CAN Bus |
M3508、M2006、GM6020 |
1 Mbps CAN,指令+反馈 |
| 宇树电机 |
CAN Bus / RS485 |
A1、GO1 关节电机 |
自定义 CAN 帧 |
| 工业步进驱动器 |
RS485 Modbus |
雷赛 DM332、奥托 |
标准 Modbus RTU |
| 舵机总线 |
UART |
Dynamixel、飞特舵机 |
半双工 TTL 总线 |
| RC 电调(无刷) |
PWM / DSHOT |
通用 ESC |
1~2ms 脉宽或数字协议 |
| 商业伺服驱动器 |
EtherCAT / CANopen |
汇川、西门子 |
工业自动化 |
四、选型建议
flowchart TD
Q1{"需要多少设备?"}
Q1 --> |"1对1"| Q2{"速率要求?"}
Q1 --> |"多个设备"| Q3{"主要需求?"}
Q2 --> |"< 10 Mbps"| R1["UART<br>简单、通用"]
Q2 --> |"> 10 Mbps"| R2["SPI<br>高速板内"]
Q3 --> |"传感器为主"| R3["I²C<br>2根线挂多个传感器"]
Q3 --> |"抗干扰/长距"| Q4{"工业总线?"}
Q3 --> |"高实时电机控制"| R5["CAN Bus<br>机器人/车载首选"]
Q4 --> |"是"| R6["RS485 + Modbus<br>工业标准"]
Q4 --> |"否"| R7["SPI 多CS<br>板内多从机"]
五、本章笔记索引
| 笔记 |
覆盖协议 |
主要内容 |
| UART / USART |
UART、RS232、USART |
异步串口原理、STM32 HAL、Linux pyserial、调试技巧 |
| SPI |
SPI、QSPI |
同步串口原理、STM32 HAL、Linux spidev、编码器接线 |
| I²C |
I²C、SMBus |
总线仲裁原理、STM32 HAL、Linux smbus2、传感器实战 |
| CAN Bus |
CAN 2.0A/B、CANopen |
差分总线原理、STM32 bxCAN/FDCAN、Linux SocketCAN、大疆电机 |
| RS485 / Modbus |
RS485、Modbus RTU/TCP |
长距离通讯、STM32 半双工实现、Linux pymodbus、步进驱动器 |
学习路径建议
- 先掌握 UART — 调试入门,几乎所有项目都用到
- 再学 I²C — 快速接传感器
- 然后 SPI — 需要速度时上
- 最后 CAN Bus — 做机器人/电机控制必须掌握
- RS485/Modbus — 对接工业设备时学