4、设备端基础通信协议:UART、SPI、I2C协议原理与在设备配置中的应用
在物联网设备端,MCU与传感器、执行器、无线模块以及配置接口之间的数据交换,依赖底层硬件通信协议。UART、SPI、I2C是三种最基础、最通用的有线串行通信协议。理解它们的电气特性、时序差异以及适用场景,是进行设备端配置与RemoteCommand指令调试的前提。
4.1 协议核心对比
三种协议在总线拓扑、同步方式、数据速率和硬件引脚占用上存在本质区别。下表从调试与配置视角归纳关键差异:
| 特性 | UART | SPI | I2C |
|---|---|---|---|
| 通信方式 | 异步串行 | 同步串行 | 同步串行 |
| 总线拓扑 | 点对点 | 一主多从(片选) | 多主多从(地址寻址) |
| 信号线数量 | 2线(TX, RX) | 4线(SCLK, MOSI, MISO, CS) | 2线(SCL, SDA) |
| 最大速率(典型) | ~1 Mbps | ~50 Mbps | ~3.4 Mbps(高速模式) |
| 数据帧结构 | 起始位+数据位+校验位+停止位 | 全双工,无固定帧格式 | 地址+读写位+数据+应答位 |
| 硬件流控 | 可选(RTS/CTS) | 无 | 无 |
| 配置调试优势 | 简单直连,日志输出首选 | 高速批量配置,适合传感器寄存器读写 | 多设备共享总线,适合板级参数校准 |
4.2 UART协议原理与配置应用
UART(Universal Asynchronous Receiver/Transmitter)是异步串行通信协议,通信双方不需要共享时钟信号,而是通过约定相同的波特率(Baud Rate)来同步数据采样点。每个数据帧包含1位起始位(低电平)、5~8位数据位、可选的奇偶校验位以及1~2位停止位(高电平)。
在设备配置场景中,UART常被用作CLI(命令行接口)或AT指令通道。调试人员通过USB转串口工具连接设备的UART引脚,即可发送配置指令并接收响应。
下面是一个UART数据帧传输的时序示意图:
在调试过程中,UART配置的常见问题包括波特率不匹配、电平不兼容(3.3V vs 5V)以及TX/RX交叉连接错误。建议在设备端固件中增加串口回环测试指令,用于快速验证物理连接。
4.3 SPI协议原理与配置应用
SPI(Serial Peripheral Interface)是同步全双工通信协议,由主设备提供串行时钟(SCLK),通过片选信号(CS)选择从设备。数据线分为主出从入(MOSI)和主入从出(MISO),允许同时发送和接收数据。
在设备配置中,SPI常用于高速读写外部Flash、配置Wi-Fi/BLE模块或驱动LCD屏幕。由于SPI没有内置的应答机制,调试时需要依赖示波器或逻辑分析仪观察时钟与数据线的时序关系。
SPI有四种工作模式(CPOL/CPHA组合),配置时必须确保主从设备模式一致,否则数据采样会错位。
下面是一个SPI单次读写操作的时序结构图:
在设备配置中,SPI的典型应用是读取传感器ID或校准系数。例如,配置加速度计之前,通常先通过SPI读取WHO_AM_I寄存器(地址0x0F),验证通信链路是否正常。
// SPI 读取传感器ID示例(伪代码)
uint8_t spi_read_register(uint8_t reg_addr) {
uint8_t tx_data = reg_addr | 0x80; // 读操作,最高位置1
uint8_t rx_data = 0;
CS_LOW(); // 拉低片选
spi_transfer(&tx_data, &rx_data, 1); // 发送地址,接收dummy
tx_data = 0x00; // 发送任意数据,读取寄存器值
spi_transfer(&tx_data, &rx_data, 1);
CS_HIGH(); // 拉高片选
return rx_data;
}
4.4 I2C协议原理与配置应用
I2C(Inter-Integrated Circuit)是同步半双工通信协议,仅需两根线:串行时钟线(SCL)和串行数据线(SDA)。总线上的每个设备都有唯一的7位或10位地址,主设备通过地址寻址来发起通信。I2C协议内置应答机制(ACK/NACK),从设备可以在每字节传输后反馈接收状态。
在设备配置中,I2C非常适合连接多个传感器、ADC/DAC或EEPROM,因为只需两根线即可挂载数十个设备。调试时,I2C总线上的上拉电阻(通常4.7kΩ)至关重要,缺少上拉电阻会导致总线锁死或通信失败。
下面是一个I2C写寄存器操作的完整流程示意图:
I2C读操作比写操作多一个重复起始条件(Repeated Start),流程为:起始条件 → 设备地址+写 → ACK → 寄存器地址 → ACK → 重复起始条件 → 设备地址+读 → ACK → 读取数据 → NACK → 停止条件。
在设备配置中,I2C常用于读取传感器的校准参数或写入配置寄存器。例如,配置温湿度传感器SHT30的测量模式:
// I2C 写配置寄存器示例(SHT30)
uint8_t config_cmd[2] = {0x2C, 0x06}; // 高重复性,每秒10次测量
i2c_write(0x44 << 1, config_cmd, 2); // 设备地址0x44,左移1位
// 等待测量完成
delay_ms(20);
uint8_t raw_data[6];
i2c_read(0x44 << 1, raw_data, 6); // 读取温度+湿度原始数据
4.5 协议选择与联合调试策略
在实际设备中,三种协议可能同时存在。下表总结了在联合调试场景下,每种协议的典型用途与调试工具:
| 协议 | 典型配置用途 | 推荐调试工具 | 常见故障 |
|---|---|---|---|
| UART | CLI指令交互、日志输出、固件升级 | USB转串口模块、串口终端(PuTTY, screen) | 波特率不匹配、TX/RX接反、电平不兼容 |
| SPI | 射频模块配置、Flash读写、LCD驱动 | 逻辑分析仪、示波器 | CPOL/CPHA模式不匹配、CS电平错误、MISO无输出 |
| I2C | 传感器校准、PMIC配置、EEPROM读写 | 逻辑分析仪、I2C总线扫描工具(i2cdetect) | 上拉电阻缺失、地址冲突、总线锁死(SCL被拉低) |