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)下。
I2C通信流程包含以下关键步骤:
- 起始条件(START): SDA在SCL高电平时由高变低。
- 从设备地址发送: 7位或10位地址 + 读写位(0为写,1为读)。
- 应答位(ACK/NACK): 从设备在第9个SCL周期拉低SDA表示应答。
- 数据字节传输: 每字节8位,高位在前,后跟应答位。
- 停止条件(STOP): SDA在SCL高电平时由低变高。
以下SVG图展示了I2C总线上的典型Sensor寄存器读取时序:
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 | 温湿度、气压计、磁力计 | 加速度计+陀螺仪、摄像头模组 |
以下SVG图展示了SPI总线在Sensor寄存器写操作时的信号关系:
2.3 GPIO中断:Sensor事件通知机制
Sensor通过GPIO中断引脚向SoC报告数据就绪、阈值触发或错误事件。在骁龙平台上,GPIO中断通常连接到TLMM(Tiger Low-Power Mux Manager)模块,支持边沿触发(上升沿/下降沿)和电平触发(高电平/低电平)。
中断上电序列中的常见故障点:
- 中断引脚电平未稳定: Sensor上电后需要一段稳定时间(tready),若SoC在此时间内使能中断,可能收到虚假触发。
- 中断类型配置错误: 部分Sensor使用开漏输出,需要SoC侧配置内部上拉电阻;若配置为推挽输出,可能导致电平冲突。
- 中断共享冲突: 多个Sensor共享同一中断线时,驱动中未正确实现中断处理函数链式调用。
interrupt-names 属性,并在驱动初始化阶段使用 devm_request_threaded_irq() 注册中断。通过 cat /proc/interrupts 检查中断号是否注册成功,以及中断触发次数是否正常增长。
以下SVG图展示了Sensor通过GPIO中断通知SoC数据就绪的流程:
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同时或稍后 |
regulator-boot-on 和 regulator-always-on 属性后问题解决。
以下SVG图展示了正确的Sensor上电序列与故障点: