2. 通信基础
飞控系统中,MCU 与 IMU、磁力计、气压计、GPS、光流等传感器之间的数据交换,绝大多数都建立在串行通信之上。理解串行通信的基本概念,是读懂 SPI、I2C、UART 驱动时序、排查总线故障、评估带宽瓶颈的前提。本节从最基础的位传输讲起,逐步建立同步/异步、双工方式、主从结构、时钟极性相位、速率与拓扑这一整套概念框架。
一、串行通信的基本概念
串行通信是指数据按位(bit)在一条或少数几条信号线上依次传输。与之相对的并行通信虽然单位时间吞吐更高,但引脚多、走线长、时钟偏斜难以控制,在飞控这种小型化、高振动、强电磁干扰的场景中并不实用。串行通信的核心参数包括:
- 位速率(Bit Rate):每秒传输的位数,单位 bps。SPI 常见 1~20 Mbps,I2C 标准模式 100 kbps、快速模式 400 kbps、快速+ 1 Mbps,UART 常用 115200 bps。
- 波特率(Baud Rate):每秒调制的符号数。在二进制调制下,波特率与位速率数值相等,但概念不同。
- 帧(Frame):一次完整传输的数据单元。UART 帧包含起始位、数据位、校验位、停止位;SPI/I2C 则以字节为单位连续传输。
- 时钟(Clock):同步通信中用于采样数据的节拍信号,决定数据何时有效。
二、同步与异步通信
同步与异步的区别,本质在于“接收方如何知道每一位的边界”。
同步通信由主机提供时钟线(如 SPI 的 SCLK、I2C 的 SCL),从机在时钟边沿采样数据。收发双方共享同一时基,因此可以连续高速传输,不需要为每个字节附加起始/停止位,效率高。缺点是必须多一根时钟线,且时钟频率受限于最慢的从机。
异步通信没有共享时钟,收发双方依靠事先约定的波特率各自计时。UART 通过起始位触发接收方重新对齐,并在每个位周期的中间采样,以容忍一定时钟误差。通常要求双方波特率误差在 2%~3% 以内,否则累积偏移会导致采样错误。异步通信线少、成本低,但速率和可靠性受限。
三、全双工与半双工
按数据流向划分,串行通信可分为三种模式:
- 全双工(Full-Duplex):收发可同时进行,需要独立的发送线和接收线。SPI 的 MOSI/MISO、UART 的 TX/RX 都是典型全双工。
- 半双工(Half-Duplex):同一时刻只能收或发,共享一条数据线。I2C 的 SDA 就是半双工,主机与从机分时占用总线。
- 单工(Simplex):数据只能单向流动,如某些传感器的中断/数据就绪引脚。
在飞控中,SPI 全双工让 MCU 可以在发送寄存器地址的同时读回传感器数据,这是 SPI 读取 IMU 效率高的关键;而 I2C 半双工意味着读操作必须先写寄存器地址、再发起重复起始条件切换方向。
四、主从模式
绝大多数板级传感器总线采用主从结构:主机发起时钟和传输,从机被动响应。SPI 通常一主多从,通过独立的 CS(片选)线选择目标从机;I2C 通过地址寻址,一条总线上可挂多个从机,但同一时刻只有一个主机控制 SCL。
主从模式带来的工程约束包括:
- 主机必须正确配置时钟频率、极性、相位,否则从机采样错误。
- 多从机共享 MISO 时,未被选中的从机必须释放总线(高阻态),否则会发生总线冲突。
- I2C 从机地址冲突会导致通信失败,需要检查硬件地址引脚或使用多路复用器。
五、时钟极性与相位(CPOL / CPHA)
SPI 没有统一的协议规定时钟空闲电平和采样边沿,因此引入 CPOL 与 CPHA 两个参数:
- CPOL(Clock Polarity):时钟空闲电平。CPOL=0 空闲为低,CPOL=1 空闲为高。
- CPHA(Clock Phase):采样边沿。CPHA=0 在第一个边沿采样,CPHA=1 在第二个边沿采样。
两者组合成 SPI 的四种模式 Mode 0~Mode 3。例如 MPU6000/ICM20602 常用 Mode 3(CPOL=1,CPHA=1),而部分气压计使用 Mode 0。驱动配置错误时,典型现象是读出的 WHO_AM_I 寄存器值错位或全 0/全 0xFF。
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 |
|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低 | 上升沿 |
| Mode 1 | 0 | 1 | 低 | 下降沿 |
| Mode 2 | 1 | 0 | 高 | 下降沿 |
| Mode 3 | 1 | 1 | 高 | 上升沿 |
六、总线速率与拓扑
总线速率并非越高越好。SPI 速率受限于从机器件手册上限、PCB 走线长度与信号完整性;I2C 速率受限于总线电容(通常不超过 400 pF)和上拉电阻取值。速率过高会出现数据偶发错误、CRC 校验失败、传感器初始化失败等问题。
拓扑方面,SPI 采用星形或菊花链结构,每个从机独立 CS,走线应尽量短且等长;I2C 采用总线型拓扑,所有器件并联在 SCL/SDA 上,需要统一上拉电阻,并注意地址分配。飞控中常见做法是:IMU 走 SPI 高速短走线,磁力计/气压计走 I2C 共享总线,GPS/数传走 UART 独立端口。
七、案例与常见误区
某四旋翼在更换 IMU 后出现姿态解算抖动,日志显示加速度计数据偶发跳变。排查发现新 IMU 要求 SPI Mode 3,而驱动仍配置为 Mode 0,导致采样边沿错误,数据位错位。将 CPOL/CPHA 改为 1/1 后恢复正常。这说明时钟极性相位不是“可选项”,而是必须与器件手册严格一致。
另一个常见误区是盲目提高 SPI 时钟。某机型将 IMU SPI 从 8 MHz 提到 20 MHz 后,地面测试正常,飞行中却出现 CRC 错误。原因是长排线在高频下反射严重,信号完整性下降。最终降回 10 MHz 并缩短走线后稳定。
八、小结清单
- 同步靠时钟,异步靠起始位与约定波特率。
- 全双工可同时收发,半双工分时共享数据线。
- 主从模式决定谁提供时钟、谁被寻址。
- CPOL/CPHA 必须与从机器件手册一致。
- 速率与拓扑受走线、电容、上拉和器件上限约束。
- 飞控中 SPI 用于高速 IMU,I2C 用于低速传感器,UART 用于外设链路。
典型 SPI 配置示例(以 ICM20602 为例):
Mode : 3 (CPOL=1, CPHA=1)
Clock : 8 MHz
CS : 独立片选,低有效
First Bit : MSB
Data Size : 8 bit
典型 I2C 配置示例(以 BMP280 为例):
Mode : 标准/快速模式
Clock : 400 kHz
Address : 0x76 或 0x77(由 SDO 引脚决定)
Pull-up : 4.7 kΩ 上拉至 3.3 V
掌握这些基础概念后,后续学习 SPI 与 I2C 的具体时序、寄存器读写、DMA 传输和故障排查时,就能快速定位问题出在“协议层”还是“电气层”,而不是盲目试错。