1. 课程导学与硬件基础:I2C与SPI协议对比、传感器融合概念、常用传感器选型
各位同学好,我是你们这门课的老周。做嵌入式驱动开发十几年了,从最早的8位单片机一路折腾到现在的多核应用处理器。今天咱们开篇,不讲虚的,直接聊点实在的——I2C和SPI到底怎么选?传感器融合是个啥?以及市面上那些常见的传感器,到底哪个适合你的项目。
说实话,我见过太多工程师在协议选型上栽跟头。有人为了省两根线硬上I2C,结果高速采样时数据丢得一塌糊涂;也有人不管三七二十一全用SPI,结果引脚不够用,被迫换大封装芯片。嗯,这些坑咱们今天先打个预防针。
1.1 I2C与SPI协议对比——选对协议,事半功倍
先看一张对比表,这是我个人习惯的整理方式,一目了然。
| 对比项 | I2C | SPI |
|---|---|---|
| 信号线数量 | 2根(SCL + SDA) | 4根(SCLK + MOSI + MISO + CS) |
| 通信方式 | 半双工,主从架构 | 全双工,主从架构 |
| 速率范围 | 标准100kHz,快速400kHz,高速3.4MHz | 通常10MHz~50MHz,甚至更高 |
| 从设备寻址 | 7位或10位地址,总线仲裁 | 片选信号(CS)独立选通 |
| 总线拓扑 | 多主多从,总线型 | 单主多从,星型 |
| 硬件复杂度 | 开漏输出,需上拉电阻 | 推挽输出,无需上拉 |
| 典型功耗 | 较低(开漏结构) | 较高(推挽结构) |
| 抗干扰能力 | 较弱(长线易受干扰) | 较强(差分或屏蔽线更佳) |
核心结论:I2C适合连接多个低速传感器,节省引脚;SPI适合高速、大数据量传输,比如摄像头、显示驱动、高精度ADC。
你可能会问:为什么I2C速率上不去?说白了,它的开漏结构决定了上升沿要靠上拉电阻慢慢充电。线长一点、电容大一点,波形就变圆了。我在一个项目中用过I2C总线挂8个传感器,线长超过30cm,结果400kHz下通信直接挂掉。后来降频到100kHz才稳定——这就是教训。
SPI就不一样了。推挽输出,驱动能力强,速率轻松上10MHz。但代价是每加一个从设备就要多一根片选线。你想想看,如果挂8个传感器,光片选就占8个GPIO,主控引脚不够用怎么办?
我的建议:如果传感器数量≤3个,且速率要求不高,优先选I2C。如果超过3个,或者需要高速采样,果断上SPI。实在不行,用I2C加多路复用器(如TCA9548A)也能扩展。
1.2 传感器融合概念——1+1 > 2
传感器融合,说白了就是把多个传感器的数据揉在一起,得到比单个传感器更准、更稳的结果。举个例子:
- 加速度计:测线性加速度,但受振动噪声影响大,长期漂移小。
- 陀螺仪:测角速度,动态响应快,但积分后会有累积误差。
- 磁力计:测地磁场方向,能提供航向,但易受铁磁干扰。
单独用任何一个,都有硬伤。但把它们的数据通过卡尔曼滤波或互补滤波器融合起来,就能得到稳定、准确的姿态角。这就是融合的价值。
注意:传感器融合不是简单的数据平均。你需要考虑每个传感器的噪声特性、采样率、时间戳对齐。我曾经在一个无人机项目中,因为IMU和气压计的采样时间没对齐,导致高度融合结果剧烈抖动——查了两天才发现是驱动层的时间戳没处理好。
咱们这门课会重点讲两种融合算法:
- 互补滤波器:简单高效,适合资源受限的MCU。
- 卡尔曼滤波器:精度高,但计算量大,适合有FPU的处理器。
别担心,我会从原理讲到代码实现,手把手带你调通。
1.3 常用传感器选型——MPU6050/BMP280/ADXL345
选传感器,我一般看三个指标:精度、功耗、接口。下面这三款是市面上最常用的,也是咱们课程的主角。
| 传感器 | 类型 | 接口 | 关键参数 | 典型应用 |
|---|---|---|---|---|
| MPU6050 | 6轴IMU(加速度+陀螺仪) | I2C(默认地址0x68) | 加速度±2/4/8/16g,陀螺仪±250/500/1000/2000°/s | 姿态检测、平衡车、无人机 |
| BMP280 | 气压+温度传感器 | I2C/SPI可选 | 气压精度±1hPa,温度精度±1°C | 高度测量、气象站、室内定位 |
| ADXL345 | 3轴加速度计 | I2C/SPI可选 | 加速度±2/4/8/16g,分辨率13位 | 倾斜检测、计步器、自由落体检测 |
选型建议:
- 做姿态融合,首选MPU6050,自带DMP(数字运动处理器),能减轻主控负担。
- 做高度测量,BMP280性价比极高,但注意它只能测相对高度,高度受天气影响。
- 做低功耗倾斜检测,ADXL345的功耗低至23μA,非常适合电池设备。
我记得有一次帮一个客户做智能手环,他们选了ADXL345做计步。本来一切顺利,但量产时发现部分设备在低温下加速度读数漂移严重。查了半天,发现是ADXL345的偏移寄存器没做温度补偿。后来在驱动初始化时加了一段校准流程,问题才解决。所以啊,选型只是第一步,驱动写得不好,再好的传感器也白搭。
1.4 本章知识体系总览
下面这张图是我手绘的,把本章的核心知识点串起来了。你把它存脑子里,后面学起来会轻松很多。