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% 以内,否则累积偏移会导致采样错误。异步通信线少、成本低,但速率和可靠性受限。

同步通信靠“时钟边沿”对齐,异步通信靠“起始位 + 约定波特率”对齐。飞控中 SPI 接 IMU 属于同步,GPS/数传接 UART 属于异步。

三、全双工与半双工

按数据流向划分,串行通信可分为三种模式:

  • 全双工(Full-Duplex):收发可同时进行,需要独立的发送线和接收线。SPI 的 MOSI/MISO、UART 的 TX/RX 都是典型全双工。
  • 半双工(Half-Duplex):同一时刻只能收或发,共享一条数据线。I2C 的 SDA 就是半双工,主机与从机分时占用总线。
  • 单工(Simplex):数据只能单向流动,如某些传感器的中断/数据就绪引脚。

在飞控中,SPI 全双工让 MCU 可以在发送寄存器地址的同时读回传感器数据,这是 SPI 读取 IMU 效率高的关键;而 I2C 半双工意味着读操作必须先写寄存器地址、再发起重复起始条件切换方向。

四、主从模式

绝大多数板级传感器总线采用主从结构:主机发起时钟和传输,从机被动响应。SPI 通常一主多从,通过独立的 CS(片选)线选择目标从机;I2C 通过地址寻址,一条总线上可挂多个从机,但同一时刻只有一个主机控制 SCL。

主从模式带来的工程约束包括:

  1. 主机必须正确配置时钟频率、极性、相位,否则从机采样错误。
  2. 多从机共享 MISO 时,未被选中的从机必须释放总线(高阻态),否则会发生总线冲突。
  3. 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。

模式CPOLCPHA空闲电平采样边沿
Mode 000低上升沿
Mode 101低下降沿
Mode 210高下降沿
Mode 311高上升沿

六、总线速率与拓扑

总线速率并非越高越好。SPI 速率受限于从机器件手册上限、PCB 走线长度与信号完整性;I2C 速率受限于总线电容(通常不超过 400 pF)和上拉电阻取值。速率过高会出现数据偶发错误、CRC 校验失败、传感器初始化失败等问题。

拓扑方面,SPI 采用星形或菊花链结构,每个从机独立 CS,走线应尽量短且等长;I2C 采用总线型拓扑,所有器件并联在 SCL/SDA 上,需要统一上拉电阻,并注意地址分配。飞控中常见做法是:IMU 走 SPI 高速短走线,磁力计/气压计走 I2C 共享总线,GPS/数传走 UART 独立端口。

串行通信核心概念关系 串行通信 同步 / 异步 时钟线 vs 起始位+波特率 全双工 / 半双工 MOSI/MISO vs SDA 分时 主从模式 CS 片选 / 地址寻址 时钟极性 / 相位 CPOL 空闲电平 CPHA 采样边沿 总线速率 / 拓扑 SPI 星形 / I2C 总线型 走线长度 · 上拉 · 电容 飞控典型应用 IMU→SPI 高速 GPS/数传→UART 配置顺序:先确定主从与拓扑 → 再选同步/异步 → 设定速率 → 最后匹配 CPOL/CPHA 与双工方向 任一环节不匹配,都会表现为初始化失败、数据错位或偶发丢包

七、案例与常见误区

某四旋翼在更换 IMU 后出现姿态解算抖动,日志显示加速度计数据偶发跳变。排查发现新 IMU 要求 SPI Mode 3,而驱动仍配置为 Mode 0,导致采样边沿错误,数据位错位。将 CPOL/CPHA 改为 1/1 后恢复正常。这说明时钟极性相位不是“可选项”,而是必须与器件手册严格一致。

另一个常见误区是盲目提高 SPI 时钟。某机型将 IMU SPI 从 8 MHz 提到 20 MHz 后,地面测试正常,飞行中却出现 CRC 错误。原因是长排线在高频下反射严重,信号完整性下降。最终降回 10 MHz 并缩短走线后稳定。

排查串行通信问题的顺序建议:先确认供电与地线 → 再确认主从与片选/地址 → 再核对 CPOL/CPHA 与波特率 → 最后用示波器/逻辑分析仪观察波形。不要一上来就改驱动代码。

八、小结清单

  • 同步靠时钟,异步靠起始位与约定波特率。
  • 全双工可同时收发,半双工分时共享数据线。
  • 主从模式决定谁提供时钟、谁被寻址。
  • 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 传输和故障排查时,就能快速定位问题出在“协议层”还是“电气层”,而不是盲目试错。