4、传感器数据采集接口:GPIO、I2C、SPI、UART、CAN、USB等接口协议、时序与配置方法
在Edge AI设备中,传感器数据采集是推理决策的“感官输入”,而接口协议则是连接物理世界与数字计算核心的桥梁。不同的传感器(如温湿度、加速度计、激光雷达、工业编码器)因其数据量、实时性、功耗和布线约束,需要匹配不同的通信接口。本章将深入剖析GPIO、I2C、SPI、UART、CAN、USB六大主流接口的物理层特性、协议时序、配置要点及在边缘设备中的选型逻辑,帮助开发者建立从“传感器引脚”到“内存缓冲区”的完整数据通路认知。
上图展示了Edge AI系统中传感器数据采集的完整信号链路。传感器域通过物理接口与协议层交互,再进入边缘计算域进行解析与推理。实际工程中,开发者需要根据传感器输出格式、数据速率、实时性要求和MCU/MPU资源,选择最合适的接口并完成正确的时序配置。下面从各接口的核心原理与配置方法展开。
4.1 GPIO:数字信号采集与事件触发
核心原理:GPIO(通用输入输出)是最基础的接口,直接读取引脚高低电平或输出控制信号。在传感器场景中,GPIO常用于读取数字量传感器(如人体红外PIR、门磁开关)、产生PWM波控制执行器(如舵机、LED),或作为中断源检测事件(如按键、流量计脉冲)。其本质是操作芯片内部寄存器,配置方向(输入/输出)、上下拉电阻、触发方式(上升沿/下降沿/双边沿)和驱动能力。
配置方法:以STM32为例,GPIO配置需完成以下步骤:
- 使能GPIO端口时钟(RCC->AHB1ENR);
- 设置引脚模式(输入/输出/复用/模拟);
- 配置输出类型(推挽/开漏)、速度、上下拉;
- 若使用中断,配置EXTI线、NVIC优先级。
// STM32 GPIO 输入配置示例
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP; // 内部上拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
4.2 I2C:多设备低速总线
核心原理:I2C(Inter-Integrated Circuit)采用两根线(SCL时钟、SDA数据)实现半双工通信,支持多主机多从机,标准模式100kbps,快速模式400kbps,高速模式3.4Mbps。每个设备有7位或10位地址,通过地址寻址区分设备。传感器常用I2C接口的有温湿度(SHT30)、气压(BMP280)、加速度(MPU6050)等。
时序与配置要点:I2C时序包含起始条件(SCL高时SDA下降沿)、停止条件(SCL高时SDA上升沿)、字节传输(MSB先行)和应答位(ACK/NACK)。配置时需注意:
- 时钟频率匹配:从机最高频率需大于主机SCL频率;
- 上拉电阻:通常4.7kΩ~10kΩ,总线电容大时需减小电阻;
- 地址冲突:多个相同地址的传感器需通过ADDR引脚区分或使用TCA9548A多路复用器。
| 参数 | 标准模式 | 快速模式 | 高速模式 |
|---|---|---|---|
| SCL频率 | 100kHz | 400kHz | 3.4MHz |
| 上升时间 | 1000ns | 300ns | 120ns |
| 最大总线电容 | 400pF | 400pF | 100pF |
4.3 SPI:高速全双工通信
核心原理:SPI(Serial Peripheral Interface)使用四根线:SCK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。支持全双工通信,速率可达数十MHz,适合高数据量传感器(如摄像头、SD卡、高分辨率ADC)。SPI有四种模式(CPOL/CPHA组合),需与从机匹配。
配置方法:以Linux下使用SPI设备树为例:
&spi1 {
status = "okay";
spidev@0 {
compatible = "rohm,dh2228fv";
reg = <0>; // CS0
spi-max-frequency = <1000000>; // 1MHz
spi-cpol; // 模式3
spi-cpha;
};
};
案例拆解:某Edge AI项目使用ADXL345加速度计(SPI接口)采集振动数据。初始配置时发现数据错乱,经排查是SPI模式不匹配——ADXL345要求模式3(CPOL=1, CPHA=1),而默认配置为模式0。修改后数据正常。另一个问题是CS片选信号毛刺导致误触发,在CS引脚加10kΩ上拉并增加软件延时后解决。
4.4 UART:异步串行通信
核心原理:UART(Universal Asynchronous Receiver/Transmitter)只需TX和RX两根线,异步传输,需双方约定波特率(如9600、115200)。数据帧包含起始位、数据位(5-8位)、校验位(可选)、停止位。常用于GPS模块、蓝牙模块、激光雷达(部分型号)等。
配置与排障:UART配置核心是波特率设置和帧格式匹配。常见问题包括:
- 波特率误差超过±2%会导致乱码,需检查晶振精度;
- TX/RX交叉连接(A的TX接B的RX);
- 共地问题:两个设备必须共地,否则通信不稳定。
// 嵌入式UART初始化(伪代码)
uart_config.baudrate = 115200;
uart_config.data_bits = 8;
uart_config.parity = UART_PARITY_NONE;
uart_config.stop_bits = 1;
uart_init(&uart_config);
4.5 CAN:工业级可靠总线
核心原理:CAN(Controller Area Network)是差分信号总线(CANH/CANL),具有强抗干扰能力,支持多主通信,速率最高1Mbps(经典CAN)或5Mbps(CAN FD)。广泛应用于工业传感器、汽车电子。CAN帧包含ID、数据场(0-8字节)、CRC校验等。
配置要点:CAN配置需设置波特率(通过分频和同步跳转宽度)、滤波器(只接收特定ID)、工作模式(正常/环回)。终端电阻(120Ω)必须正确连接在总线两端。
| 特性 | CAN 2.0 | CAN FD |
|---|---|---|
| 最大数据场 | 8字节 | 64字节 |
| 速率 | ≤1Mbps | 数据段≤5Mbps |
| 兼容性 | 广泛 | 向下兼容 |
4.6 USB:高速即插即用
核心原理:USB(Universal Serial Bus)支持热插拔,速率从USB 2.0(480Mbps)到USB 3.2(20Gbps)。在传感器采集中,USB常用于连接摄像头(UVC协议)、USB-TTL串口芯片(如CH340)、高速数据采集卡。USB协议复杂,涉及枚举、端点、传输类型(控制/批量/中断/同步)。
配置方法:在Linux系统中,USB设备通常无需驱动即可识别(如UVC摄像头),但需检查设备节点(/dev/video0)和带宽分配。对于自定义USB传感器,需编写内核驱动或使用libusb进行用户态通信。
# 查看USB设备信息
lsusb
# 查看摄像头支持的分辨率和格式
v4l2-ctl --list-formats-ext
4.7 接口选型对比与总结
| 接口 | 速率 | 线数 | 实时性 | 适用场景 | 典型传感器 |
|---|---|---|---|---|---|
| GPIO | 取决于CPU | 1+ | 高(中断) | 数字量/事件 | PIR、按键 |
| I2C | ≤3.4Mbps | 2 | 中 | 低速多设备 | 温湿度、气压 |
| SPI | ≤几十Mbps | 4+ | 高 | 高速数据流 | ADC、显示屏 |
| UART | ≤几Mbps | 2 | 中 | 异步串行 | GPS、蓝牙 |
| CAN | ≤5Mbps | 2 | 高 | 工业/汽车 | 编码器、IMU |
| USB | ≤20Gbps | 4+ | 中 | 高速外设 | 摄像头、采集卡 |
常见误区总结:①忽视电平匹配——3.3V传感器接5V MCU需电平转换;②I2C地址冲突未处理;③SPI模式配置错误导致数据错位;④UART波特率误差累积;⑤CAN总线缺少终端电阻;⑥USB带宽超限导致丢帧。在Edge AI项目中,建议先明确传感器数据速率和实时性要求,再选择接口,并在硬件设计阶段预留调试接口(如测试点、LED指示)。