Skip to main content
内部集成电路总线(I²C)是一种双向两线串行总线,用于集成电路之间的短距离通信,设备通过分配的总线地址进行通信。

概述

主要特点

  • 双向 2 线串行总线(SDA + SCL)
  • 7 位或 10 位目标寻址
  • 支持多控制器模式

工作模式

通信时序

数据包结构: Start → 地址帧(7/10 位)→ R/W 位 → ACK/NACK → 数据帧(8 位)→ Stop 信号规则:
  • SCL 为高电平时:SDA 必须保持稳定
  • SCL 为低电平时:SDA 可以变化
  • 例外:START 和 STOP 序列可以在 SCL 为高电平时改变 SDA

按子系统划分的传输模式

接口组件

设备树源文件

API

软件设备树配置

Linux 设备树示例

GPIO pinctrl:

QUPAC 访问控制

确保在 QUPAC_Access.c 中设置了正确的协议:

配置步骤

1

启用内核配置

编辑 kernel_platform/kernel/arch/arm64/configs/qcom_defconfig
2

在设备树中启用 I2C 节点

3

编译并烧写

编译内核和设备树变更,然后将镜像加载到设备。

验证

检查设备节点

使用 i2c-tools

调试

启用调试日志

启用 I2C 跟踪

检查时钟与 GPIO

故障排查

症状: i2cdetect 未显示任何设备;/dev/i2c-X 不存在。检查设备树状态:
检查内核模块:
检查时钟:
检查 GPIO pinmux:
症状:
原因与解决方法:
  • 缺少上拉电阻 — 在 SDA/SCL 上添加 4.7 kΩ 上拉电阻
  • 从设备无响应 — 确认从设备电源和复位;检查初始化时序
  • 时钟频率错误 — 在设备树中调整 clock-frequency
  • 总线卡死在低电平 — 对设备重新上电,或发送时钟脉冲以释放总线
症状:
步骤:
  1. 确定板卡类型:dmesg | grep "CDT Version"
  2. QUPAC_Access.xml 中查找平台 ID
  3. 确认 QUPAC_Access.c 中设置了 QUPV3_PROTOCOL_I2CAC_HLOSbAllowFifo=TRUEbLoad=TRUE
  4. 如做了修改,重新构建 TEE 固件
症状: 读取的数据不正确;间歇性失败。解决方法:
  • 降低总线速率
  • 缩短线缆长度;添加 22–100 Ω 串联电阻
  • 在设备附近添加去耦电容
  • 使用示波器验证建立时间和保持时间
症状:
解决方法: 确认 CONFIG_QCOM_GPI_DMA=m;检查 DMA 通道分配;确保内存对齐满足 DMA 安全要求。在不使用 DMA 的情况下测试:
检查运行时 PM 配置,验证电源域依赖关系,并添加正确的挂起/恢复处理程序。

快速诊断命令

资源