2. Sensor硬件接口基础:I2C/SPI总线协议、GPIO中断、VDD/VDDIO电源域

在骁龙平台进行Sensor驱动移植时,硬件接口的正确理解是排查上电序列故障的前提。本章聚焦于Sensor与SoC交互的三大物理层基础:I2C/SPI总线协议、GPIO中断以及VDD/VDDIO电源域。这些接口的时序、电平与电源管理策略,直接决定了Sensor能否在系统启动过程中被正确枚举与配置。

2.1 I2C总线协议与Sensor通信

I2C(Inter-Integrated Circuit)是Sensor最常用的控制与数据读取总线。它使用两根线:SCL(时钟线)和SDA(数据线),支持多主从设备通信。在骁龙平台上,Sensor通常作为从设备挂载在专用I2C控制器(如QUPv3)下。

关键参数速查: 标准模式100kHz,快速模式400kHz,高速模式可达3.4MHz。Sensor驱动移植时,务必确认SoC侧I2C控制器支持的速率与Sensor规格书匹配。
移植避坑: 骁龙平台的I2C控制器通常支持“时钟拉伸”(Clock Stretching),但部分低功耗Sensor不支持此特性。若驱动中启用了时钟拉伸而Sensor无响应,会导致总线挂死。建议在设备树中显式禁用该特性。

I2C通信流程包含以下关键步骤:

  1. 起始条件(START): SDA在SCL高电平时由高变低。
  2. 从设备地址发送: 7位或10位地址 + 读写位(0为写,1为读)。
  3. 应答位(ACK/NACK): 从设备在第9个SCL周期拉低SDA表示应答。
  4. 数据字节传输: 每字节8位,高位在前,后跟应答位。
  5. 停止条件(STOP): SDA在SCL高电平时由低变高。

以下SVG图展示了I2C总线上的典型Sensor寄存器读取时序:

I2C 总线 Sensor 寄存器读取时序 START 从设备地址+W ACK 寄存器地址 ACK STOP START 从设备地址+R ACK 读取数据字节 NACK STOP 说明: 1. 第一段:主设备(SoC)先发送START + 从设备地址(写方向)+ 寄存器地址。 2. 第二段:主设备再次发送START + 从设备地址(读方向),从设备返回数据字节,主设备以NACK结束。

2.2 SPI总线协议与高速Sensor通信

对于需要高数据吞吐量的Sensor(如摄像头、高精度陀螺仪),SPI(Serial Peripheral Interface)是更优选择。SPI使用四线制:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。骁龙平台的SPI控制器通常集成在QUPv3 IP中,支持DMA传输。

特性 I2C SPI
线数 2(SCL, SDA) 4(SCLK, MOSI, MISO, CS)
传输速率 最高3.4MHz 最高50MHz+
从设备选择 地址寻址 片选信号
通信方式 半双工 全双工
硬件复杂度 低 中
典型Sensor 温湿度、气压计、磁力计 加速度计+陀螺仪、摄像头模组
SPI移植警告: 骁龙平台的SPI控制器支持多种“时钟极性(CPOL)”和“时钟相位(CPHA)”组合。Sensor驱动中配置的SPI模式(0/1/2/3)必须与Sensor数据手册完全一致,否则通信将完全失败。常见Sensor默认使用模式0(CPOL=0, CPHA=0)或模式3(CPOL=1, CPHA=1)。

以下SVG图展示了SPI总线在Sensor寄存器写操作时的信号关系:

SPI 总线 Sensor 寄存器写操作时序(模式0) CS 高→低(选中) SCLK MOSI 寄存器地址 写数据 MISO 高阻态(Z) 模式0:SCLK空闲为低,数据在SCLK上升沿采样。CS拉低后开始传输,拉高后结束。

2.3 GPIO中断:Sensor事件通知机制

Sensor通过GPIO中断引脚向SoC报告数据就绪、阈值触发或错误事件。在骁龙平台上,GPIO中断通常连接到TLMM(Tiger Low-Power Mux Manager)模块,支持边沿触发(上升沿/下降沿)和电平触发(高电平/低电平)。

中断上电序列中的常见故障点:

  • 中断引脚电平未稳定: Sensor上电后需要一段稳定时间(tready),若SoC在此时间内使能中断,可能收到虚假触发。
  • 中断类型配置错误: 部分Sensor使用开漏输出,需要SoC侧配置内部上拉电阻;若配置为推挽输出,可能导致电平冲突。
  • 中断共享冲突: 多个Sensor共享同一中断线时,驱动中未正确实现中断处理函数链式调用。
调试技巧: 在设备树中为Sensor中断添加 interrupt-names 属性,并在驱动初始化阶段使用 devm_request_threaded_irq() 注册中断。通过 cat /proc/interrupts 检查中断号是否注册成功,以及中断触发次数是否正常增长。

以下SVG图展示了Sensor通过GPIO中断通知SoC数据就绪的流程:

Sensor GPIO 中断通知流程 Sensor 数据就绪 GPIO输出高 上升沿 TLMM 中断控制器 映射到GIC GIC 通用中断控制器 分发到CPU CPU Core 执行ISR 读取Sensor数据 中断路径说明: 1. Sensor内部数据就绪后,将GPIO引脚从低电平驱动为高电平(上升沿触发)。 2. TLMM检测到边沿事件,将其映射为SPI中断号,上报给GIC。 3. GIC将中断分发给指定CPU核心,CPU执行驱动中注册的中断服务函数(ISR)。

2.4 VDD/VDDIO电源域:上电序列的核心

Sensor通常需要两个独立的电源输入:

  • VDD(核心电源): 为Sensor内部数字/模拟核心供电,典型电压1.8V或2.8V。
  • VDDIO(I/O电源): 为I2C/SPI/GPIO接口电平供电,典型电压1.8V(与SoC侧I/O电压匹配)。

电源域的上电顺序至关重要。错误的顺序可能导致Sensor内部闩锁(Latch-up)或接口电平不匹配,造成通信失败甚至永久损坏。

电源域 典型电压 供电对象 上电顺序要求
VDD 1.8V / 2.8V Sensor核心电路、ADC、MEMS 通常先于VDDIO或同时上电
VDDIO 1.8V I2C/SPI/GPIO接口缓冲器 通常在VDD稳定后上电
VDD_PLL(可选) 1.8V 内部PLL时钟发生器 与VDD同时或稍后
上电顺序故障案例: 某陀螺仪Sensor在骁龙平台上出现I2C通信偶发失败。排查发现,VDDIO先于VDD上电约2ms,导致I2C接口缓冲器在核心电路未就绪时被外部总线拉高,触发内部ESD保护二极管导通,造成VDD通过I/O引脚反向供电。修正设备树中regulator的 regulator-boot-on 和 regulator-always-on 属性后问题解决。

以下SVG图展示了正确的Sensor上电序列与故障点:

Sensor 上电序列与故障点分析 时间 VDD 上电 tready VDDIO 上电 复位释放 故障区1:VDD未稳 提前操作I2C 故障区2:VDDIO先于VDD 接口电平冲突 正确操作窗口 可安全通信 正确上电顺序:VDD → 等待tready(通常1-10ms)→ VDDIO → 释放复位引脚 → 初始化I2C/SPI通信。 ← 上一章 📖 返回目录 下一章 →