3. 传感器接口与通信协议基础
XENSIV 系列环境传感器(如 BME280 温湿度气压传感器、SGP40 气体传感器、PAS CO2 传感器等)对外提供的数字接口并不统一:有的以 I2C 为主,有的同时支持 I2C 与 SPI,部分模组还保留 UART 用于固件升级或简化调试。接口选型与电气配置直接决定传感器能否被正确寻址、能否稳定读出数据。本节从时序、电平、上拉三个层面展开,并给出一个可复现的 I2C 通信实例。
一、三种接口的时序特征与适用场景
I2C 是两线制同步串行总线,由 SCL(时钟)和 SDA(数据)构成,主机发起起始条件(SCL 高时 SDA 由高变低),随后发送 7 位从机地址加 1 位读写方向位,从机以 ACK 拉低 SDA 应答。I2C 的关键时序参数包括:SCL 频率(标准模式 100 kHz、快速模式 400 kHz、快速+ 1 MHz)、起始/停止条件的建立与保持时间、数据建立时间 tSU;DAT 与保持时间 tHD;DAT。XENSIV 传感器多数在快速模式 400 kHz 下工作,BME280 的 I2C 最高支持 3.4 MHz(高速模式),但实际布线较长时建议降到 400 kHz 以保证裕量。
SPI 是四线制同步全双工总线,包含 SCLK、MOSI、MISO、CS。其核心是时钟极性(CPOL)与时钟相位(CPHA)组合出的四种模式。XENSIV 传感器常用 SPI 模式 0(CPOL=0,CPHA=0)或模式 3(CPOL=1,CPHA=1),即数据在时钟空闲电平后的第一个边沿采样。SPI 没有地址机制,靠片选 CS 区分设备,因此速率可远高于 I2C,BME280 的 SPI 时钟可达 10 MHz。代价是引脚多、无内建应答,读回数据需自行校验。
UART 是异步串行接口,只有 TX、RX 两根信号线,无时钟线,收发双方依靠约定的波特率同步。典型帧结构为:1 位起始位(低电平)、8 位数据位(LSB 先发)、可选校验位、1 位停止位(高电平)。XENSIV 部分模组用 UART 输出测量结果或接收命令,常用 9600、115200 波特率。UART 无需上拉,但要求双方电平一致,且波特率误差通常需控制在 2% 以内,否则采样点漂移会导致误码。
二、电平匹配:不可忽视的“隐形杀手”
XENSIV 传感器常见供电与 IO 电平为 1.8V 或 3.3V,而主控 MCU 多为 3.3V 或 5V。若 3.3V 主机的推挽输出直接接到 1.8V 器件的输入引脚,会通过其内部 ESD 保护二极管灌入电流,轻则通信异常,重则永久损坏。因此电平匹配必须显式处理。
对于 I2C,由于总线本身是开漏结构,天然适合双向电平转换:在两侧分别用各自电源上拉,中间串接一个 N 沟道 MOSFET(栅极接低压侧电源),即可实现 3.3V 与 1.8V 之间的双向透明传输。对于 SPI,SCLK、MOSI、CS 是主机到从机的单向信号,可用电阻分压(如 1.8V 侧取 1kΩ 下拉、3.3V 侧取 2kΩ 上拉)或专用电平转换芯片;MISO 是从机到主机方向,若从机为 1.8V 输出而主机为 3.3V 输入,通常 1.8V 可被 3.3V 的 VIH 识别,但需查数据手册确认,否则仍需转换。UART 同理,TX/RX 交叉连接,电平不一致时同样需要转换。
三、上拉电阻的计算与选型
I2C 总线的上拉电阻 Rp 不是随便取一个 4.7kΩ 就万事大吉。它受两个边界约束:下限由总线电容和上升时间决定,上限由漏电流和输入高电平阈值决定。快速模式(400 kHz)要求上升时间 tr ≤ 300 ns,若总线电容 Cb 估算为 100 pF,则 Rp ≤ tr / (0.847 × Cb) ≈ 300 ns / (0.847 × 100 pF) ≈ 3.5 kΩ。上限方面,若总线漏电流 Ileak 为 10 μA,要求高电平不低于 0.7×VDD=2.31V,则 Rp ≤ (3.3−2.31)/10 μA ≈ 99 kΩ。综合取 2.2k~4.7kΩ 是常见安全区。总线电容超过 400 pF 时,应降低速率或使用 I2C 缓冲器/中继器。
四、XENSIV 传感器 I2C 通信实例
以 BME280 为例,其 I2C 从机地址由 SDO 引脚决定:SDO 接地为 0x76,接 VDDIO 为 0x77。假设 SDO 接地,主机地址为 0x76。读取芯片 ID 寄存器(地址 0xD0)应返回 0x60,这是验证通信链路是否打通的最快手段。
// 伪代码:I2C 读取 BME280 芯片 ID
i2c_start();
i2c_write_byte(0x76 << 1 | 0); // 写地址
i2c_write_byte(0xD0); // 寄存器地址
i2c_start(); // 重复起始
i2c_write_byte(0x76 << 1 | 1); // 读地址
uint8_t id = i2c_read_byte(NACK);
i2c_stop();
// 预期 id == 0x60
若读回 0x60,说明地址、上拉、电平均正常。随后配置测量:向 0xF2 写入 0x01(湿度 oversampling ×1),向 0xF4 写入 0x27(温度与气压 oversampling ×1,进入正常模式),向 0xF5 写入 0xA0(待机 500 ms,IIR 滤波系数 16)。配置完成后,从 0xF7 开始连续读取 8 个字节,即可得到气压、温度、湿度的原始 ADC 值,再按数据手册中的补偿公式换算为物理量。
若读回 0x00 或 0xFF,通常意味着:从机未应答(地址错误或器件未供电)、SDA 被拉死(上拉缺失或总线冲突)、或电平不匹配导致从机无法识别。此时应先用示波器观察 SCL/SDA 波形,确认起始条件、ACK 位和上升沿是否正常,再逐项排查。
五、SPI 与 UART 的补充要点
SPI 模式下,BME280 的 CS 必须在每次传输前拉低、传输后拉高,且 SCLK 空闲电平由 CPOL 决定。若主机 SPI 模式配置为 CPOL=0/CPHA=0,则数据在 SCLK 上升沿采样、下降沿变化。SPI 读操作需先发送带读标志的寄存器地址(最高位置 1),再发送空字节以时钟出数据。由于 SPI 无 ACK,建议读回芯片 ID 做一次确认。
UART 用于 XENSIV 模组时,重点检查波特率误差和帧格式。例如主机用 115200 波特率、8N1 格式,传感器侧也必须一致。若出现乱码,优先用示波器测量一位的宽度:115200 波特率下一位约 8.68 μs,若实测偏差超过 2%,应检查时钟源分频设置。UART 无需上拉,但 TX/RX 必须交叉连接,且共地。
接口配置的最终验证标准只有一个:能稳定读回正确的芯片 ID 和测量数据,且波形干净、无过冲和振铃。把地址、上拉、电平三件事逐一确认,XENSIV 传感器的通信问题绝大多数都能在十分钟内定位。