3、数据采集硬件与接口:I2C/SPI通信协议、Arduino/ESP32/STM32等平台接线与配置
在TinyML异常检测项目中,加速度计数据的质量与采集硬件的稳定性直接决定了后续模型训练与推理的上限。本章聚焦于数据采集链路中最关键的硬件层:I2C与SPI两种总线协议的工作原理、时序特征与选型依据,并针对Arduino、ESP32、STM32三大主流嵌入式平台,给出具体的接线方法、引脚配置与初始化代码框架。理解这些底层接口,不仅是为了让传感器“转起来”,更是为了在采样率、数据完整性、功耗与实时性之间做出工程化的权衡。
上图从总线拓扑与平台适配两个维度,概括了I2C与SPI在加速度计采集场景中的核心差异。I2C以两线制和多从机寻址见长,适合连线受限、速率要求不高的场景;SPI则以四线制全双工和高速率见长,适合需要高采样率或低延迟的TinyML应用。下面我们将从协议原理、接线配置、平台实践与常见误区四个模块展开。
3.1 核心原理:I2C与SPI的物理层与数据链路层差异
I2C(Inter-Integrated Circuit)由Philips设计,采用SCL(时钟线)与SDA(数据线)两根线完成通信。所有设备并联在总线上,通过7位或10位地址区分从机。其物理层为开漏输出,必须外接上拉电阻(典型值2.2kΩ~10kΩ),电平标准常见3.3V或5V。I2C的时钟由主设备产生,速率模式分为标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。在加速度计应用中,ADXL345、MPU6050等传感器通常支持I2C接口,且默认地址可通过引脚电平修改。
SPI(Serial Peripheral Interface)由Motorola提出,使用SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)四根线。SPI为全双工通信,主设备通过拉低特定从设备的CS引脚来选择通信对象,因此每个从机需要独占一个GPIO作为片选。SPI没有标准速率上限,实际取决于主从设备能力,常见加速度计如LIS3DH在SPI模式下可达10MHz。SPI的时序由CPOL(时钟极性)和CPHA(时钟相位)组合成4种模式,必须与传感器数据手册匹配。
选型速查:若项目仅需1~2个传感器且采样率低于1kHz,I2C可简化布线;若需同时采集多轴数据且采样率高于1.6kHz,或需要同步多个传感器,SPI是更稳妥的选择。TinyML场景中,SPI能减少CPU等待时间,配合DMA可大幅提升数据吞吐。
3.2 判断方法与操作流程:从传感器数据手册到引脚级配置
在接线前,必须完成以下四步判断流程,否则极易出现通信失败或数据损坏。
- 确认传感器接口类型:阅读数据手册的“Interface”章节,确认是否支持I2C/SPI,以及是否支持SPI模式切换(部分传感器通过引脚电平选择)。例如ADXL345的SDO引脚接地时I2C地址为0x53,接高时为0x1D;同时SDO也作为SPI的MISO复用。
- 确定电平兼容性:检查传感器VDD供电范围与MCU的IO电平。若传感器为3.3V供电而MCU为5V(如传统Arduino Uno),I2C上拉电阻应接3.3V,且SDA/SCL可能需要电平转换;SPI的MOSI/SCLK/CS同样需要转换,MISO则需确认传感器是否容忍5V输入。
- 规划引脚分配:对于I2C,确认MCU的硬件I2C外设引脚(如ESP32的GPIO21/22),避免使用仅支持软件模拟的引脚;对于SPI,确认硬件SPI外设的SCLK/MOSI/MISO引脚,并预留独立的CS引脚(任意GPIO均可)。
- 配置通信参数:I2C需设置时钟频率(通常400kHz)和从机地址;SPI需设置时钟极性(CPOL)、相位(CPHA)、速率(如5MHz)以及数据位宽(8位)。这些参数必须与传感器数据手册中的时序图严格对应。
以下是一个典型的ESP32与ADXL345通过I2C连接的初始化代码片段(使用Arduino框架):
#include <Wire.h>
#define ADXL345_ADDR 0x53
void setup() {
Wire.begin(21, 22); // SDA=GPIO21, SCL=GPIO22
Wire.setClock(400000); // 400kHz 快速模式
// 读取DEVID寄存器 (0x00) 验证通信
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(ADXL345_ADDR, 1);
if (Wire.available()) {
uint8_t devid = Wire.read();
if (devid != 0xE5) {
Serial.println("ADXL345 not found!");
}
}
}
3.3 案例拆解:基于STM32的SPI高速采集与DMA传输
在振动监测类TinyML项目中,通常需要以3.2kHz采样率连续采集三轴加速度数据。若使用I2C的400kHz速率,每次读取6字节需约120μs,加上地址与寄存器开销,CPU占用率过高。本案例选用STM32F103的SPI1外设,配合DMA实现无CPU干预的数据搬运。
背景与约束:项目需监测工业电机轴承振动,采样率3.2kHz,三轴16位精度,数据需实时存入4KB环形缓冲区。MCU为STM32F103C8T6,传感器为LIS3DH(支持SPI,最高10MHz)。
初始现象:使用轮询方式读取SPI时,CPU在每次采样周期内需等待约50μs,导致无法同时运行TinyML推理任务。
操作步骤:
- 将LIS3DH的CS接PA4,SCLK接PA5,MOSI接PA7,MISO接PA6,VDD接3.3V,VDD_IO接3.3V。
- 配置SPI1为Master模式,CPOL=0,CPHA=0(模式0),速率9MHz(APB2时钟72MHz/8分频)。
- 使能SPI1的RX DMA通道(DMA1_Channel2),设置外设地址为SPI1->DR,内存地址为环形缓冲区,传输长度6字节,循环模式。
- 在定时器中断中触发DMA传输,每次传输完成产生中断,更新缓冲区写指针。
结果对比:启用DMA后,CPU仅在每次DMA完成中断时进行指针更新(约2μs),释放了98%的CPU时间用于TinyML推理。SPI速率提升至9MHz后,6字节读取时间缩短至约5.3μs,远低于I2C的120μs。
风险提示:SPI高速模式下,杜邦线长度超过10cm可能导致信号反射,引起数据错位。建议使用双绞线或FPC排线,并在SCLK与MISO之间串联33Ω电阻抑制振铃。此外,DMA循环模式需注意缓冲区溢出,务必在中断中及时处理数据。
3.4 常见误区与总结复盘
误区一:I2C上拉电阻随意取值。上拉电阻过小(如1kΩ)会增加功耗并可能损坏开漏MOS管;过大(如100kΩ)则上升沿变缓,限制通信速率。应根据总线电容和速率计算,典型4.7kΩ适用于400kHz。
误区二:SPI的CS引脚悬空或复用。CS必须由主设备明确控制,若悬空可能导致从机误触发。在多个SPI从机共享总线时,未选中的从机必须将MISO置为高阻态,否则会与选中从机冲突。
误区三:忽略电平转换。许多加速度计为1.8V或3.3V供电,直接连接5V MCU会损坏传感器。使用双向电平转换芯片(如TXB0104)或选择3.3V版本的MCU(如ESP32、STM32)可避免此问题。
误区四:采样率与总线速率混淆。I2C的400kHz是指时钟频率,实际有效数据速率约为时钟的1/8(因地址、ACK、寄存器地址等开销)。若需3.2kHz采样率且每次读6字节,所需总线速率约为3.2k×6×8=153.6kbps,I2C 400kHz勉强够用,但已接近极限;SPI则轻松胜任。
| 对比维度 | I2C | SPI |
|---|---|---|
| 线数 | 2(SCL+SDA) | 4(SCLK+MOSI+MISO+CS) |
| 通信模式 | 半双工 | 全双工 |
| 多从机支持 | 地址寻址,无需额外引脚 | 每从机需独立CS |
| 典型速率 | 100k/400k/1M Hz | 1M~40M Hz |
| 硬件复杂度 | 需上拉电阻 | 无需上拉,但需CS控制 |
| 适用场景 | 低速、连线少、多从机 | 高速、大数据量、低延迟 |
总结复盘:在TinyML加速度计项目中,硬件接口的选择应基于采样率、CPU负载和布线约束综合决定。I2C适合原型验证和低速率场景,SPI+DMA则是生产级高吞吐采集的标配。无论选择哪种总线,务必先阅读数据手册的时序图,用逻辑分析仪验证波形,再进入驱动开发。下一阶段将进入固件层的数据校准与滤波,但扎实的硬件基础是后续所有算法能够落地的先决条件。