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

概述

主要特性

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

工作模式

通信时序

数据包结构: 起始位 → 地址帧(7/10 位)→ 读/写位 → ACK/NACK → 数据帧(8 位)→ 停止位 信号规则:
  • 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)配置,确认电源域依赖关系,并添加正确的挂起/恢复处理程序。

快速诊断命令

资源