1. 课程导入

当你拆开一架多旋翼飞控,最先看到的往往不是算法,而是一块布满芯片和接口的电路板:主控 MCU、惯性测量单元 IMU、气压计、磁力计、GPS 接口、电调信号输出、SD 卡、USB 调试口。飞控之所以能“感知姿态、判断位置、输出控制”,靠的正是这些传感器不断把物理世界转换成数字量,再由主控读取、融合、运算,最后驱动电机。传感器驱动工程师的核心任务,就是让主控稳定、实时、正确地拿到这些数据。而 SPI 与 I2C,正是飞控板上最常用的两类板级通信总线。

一、飞控系统的典型组成

从数据流角度看,飞控可以划分为四个层次:感知层、计算层、执行层和调试/存储层。感知层负责采集姿态、角速度、加速度、气压高度、磁场方向等原始数据;计算层由 MCU 完成姿态解算、滤波、控制律运算;执行层通过 PWM、DShot 或 CAN 驱动电调与舵机;调试与存储层则负责日志记录、参数配置和地面站通信。传感器驱动位于感知层与计算层之间,是整条数据链的入口。

以常见的 STM32 飞控为例,其典型外设连接如下:

IMU(ICM-42688)  --SPI1-->  MCU
气压计(BMP388)  --I2C1-->  MCU
磁力计(QMC5883) --I2C1-->  MCU
GPS/罗盘       --UART-->  MCU
电调           --DShot--> MCU
SD 卡          --SDIO-->  MCU

可以看到,SPI 通常承担高速、大数据量的 IMU 读取;I2C 则连接气压计、磁力计等低速但多设备共享总线的传感器。理解这一分工,是后续驱动开发的基础。

飞控系统数据流与总线定位 感知层 IMU 惯性测量 ICM-42688 / BMI088 气压计 BMP388 / SPL06 磁力计 QMC5883 / IST8310 GPS / 罗盘 UART 接口 总线与接口 SPI 高速 · 全双工 SCLK/MOSI/MISO/CS I2C 低速 · 多设备共享 SCL/SDA + 地址 UART GPS / 数传 计算层 MCU 主控 STM32 / H7 姿态解算 · 控制律 传感器融合 卡尔曼 / 互补滤波 执行层 电调 DShot/PWM 舵机 PWM 存储/日志 SD 卡 传感器驱动位于感知层与计算层之间:SPI 负责高速 IMU,I2C 负责低速多设备传感器,二者共同构成飞控数据入口

二、传感器在飞控中的作用

飞控的稳定飞行依赖三类核心传感器:IMU 提供三轴角速度与三轴加速度,是姿态解算的主干;气压计提供高度信息,用于定高和高度保持;磁力计提供航向参考,用于偏航修正。GPS 则提供位置与速度,用于定点、返航和自动航线。不同传感器对采样率、延迟和精度的要求差异很大,这直接决定了它们挂载在哪种总线上。

传感器 典型型号 常用总线 采样率需求 数据量
IMU ICM-42688 SPI 1 kHz ~ 8 kHz 大,6 轴 16 位
气压计 BMP388 I2C / SPI 50 Hz ~ 100 Hz 小,压力+温度
磁力计 QMC5883 I2C 50 Hz ~ 100 Hz 小,3 轴磁场
GPS M9N / F9P UART 5 Hz ~ 20 Hz 中,位置+速度

三、SPI 与 I2C 在飞控中的定位

SPI 是四线全双工同步总线,包含 SCLK、MOSI、MISO 和 CS。它的优势是速率高、时序简单、无地址冲突,适合 IMU 这类需要高频读取的设备。缺点是引脚多,每增加一个从设备就要多一根 CS。I2C 是两线半双工总线,只有 SCL 和 SDA,通过 7 位地址区分设备,布线简洁,适合气压计、磁力计等低速设备。缺点是速率较低,总线仲裁和时钟拉伸会增加驱动复杂度。

选型口诀:高速大数据走 SPI,低速多设备走 I2C;IMU 优先 SPI,气压计和磁力计优先 I2C;同一总线上的设备地址不能冲突。

四、案例场景:一次 IMU 读取失败的分析

某飞控在调试时发现姿态数据偶尔跳变,日志显示 IMU 读取返回全 0。排查过程如下:

  1. 用逻辑分析仪抓取 SPI 波形,发现 SCLK 正常但 MISO 始终为高电平,说明从设备没有驱动数据线。
  2. 检查 CS 引脚,发现 CS 在传输期间被其他任务误拉高,导致 IMU 提前结束响应。
  3. 进一步检查发现,CS 与另一个 SPI 设备共用,但驱动中未做互斥保护。
  4. 修复方式:为每个 SPI 设备分配独立 CS,或在驱动层增加总线锁。

这个案例说明,SPI 虽然没有地址冲突,但 CS 管理不当同样会导致通信失败。I2C 则更常见的问题是地址冲突、上拉电阻不匹配和总线死锁。

常见误区:认为 I2C 接线少就一定简单。实际上 I2C 的时序问题、上拉电阻选择、多主竞争和时钟拉伸,往往比 SPI 更容易让初学者踩坑。SPI 的问题通常集中在 CS 和模式配置,I2C 的问题则分散在地址、上拉、时序和总线状态上。

五、学习目标与整体框架

本课程围绕“能看懂、能配置、能调试、能优化”四个目标展开。学完后,你应当能够:

  • 理解飞控传感器数据流,明确 SPI 与 I2C 的适用边界;
  • 掌握 SPI 的四种模式、时序参数和 CS 管理方法;
  • 掌握 I2C 的地址、速率、上拉电阻和总线恢复机制;
  • 能够编写 IMU、气压计、磁力计的初始化与读取驱动;
  • 能够使用逻辑分析仪和示波器定位通信故障;
  • 能够从采样率、延迟、CPU 占用三个维度优化驱动性能。

整体框架分为三部分:第一部分是总线基础与硬件连接,第二部分是典型传感器驱动实战,第三部分是调试、排障与性能优化。后续章节会从 SPI 时序开始,逐步深入到具体型号的寄存器操作和飞控集成。

学习建议:每学一种总线,都准备一块最小系统板和对应传感器模块,边写代码边用逻辑分析仪观察波形。飞控驱动不是纯软件问题,时序、电平和布线同样决定成败。