0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

驱动之路#40:I2C通信机制分析(RK3576视角)

BSP调试从0到1 来源:嵌入式分享 作者:嵌入式分享 2026-06-01 17:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式开发中,I2C 应该算是出场率非常高的一种通信接口。像触摸芯片、PMIC电源管理芯片、摄像头 sensor、RTC、EEPROM 等外设,很多都是通过 I2C 挂到主控上的。

调触摸驱动时,我们经常会看到类似这样的信息:

wKgZO2oYFtKAV1aZAAF5NlxUDLA820.png

这里的i2c2reg = <0x5d>到底是什么意思?主控又是怎么通过两根线找到对应外设的?这篇就以 RK3576 为例,简单捋一捋 I2C 的通信机制。


1. I2C 是什么?

I2C,全称是Inter-Integrated Circuit,直译过来就是“内部集成电路总线”。

不用纠结这个名字,简单理解就是:

I2C 是一种两线制串行通信协议,只需要两根线,就能实现主控和多个外设之间通信。

这两根线分别是:

SDA:SerialData,串行数据线,用来传输数据;SCL:Serial Clock,串行时钟线,用来同步通信节奏。

也就是说,I2C 通信至少需要两根线:一根负责“说话”,一根负责“打节拍”。

wKgZO2oYFtKAWg97AAAWlAdOBbo797.png

在 RK3576 这类 SoC 中,I2C 控制器一般由主控内部提供,比如 I2C0、I2C1、I2C2 等。外部设备则挂在对应的 I2C 总线上。


2. I2C 通信像什么?

为了好理解,可以把 I2C 通信理解成 RK3576 发起的一次“点名对话”。

假设:

主机:RK3576从设备:GT911 触摸芯片设备地址:0x5d

整个过程大概是:

RK3576:大家注意,我要开始通信了!RK3576:地址是0x5d 的设备在不在?GT911:在!RK3576:我要给你写数据 / 我要从你这里读数据。GT911:收到。RK3576:通信结束,总线释放。

I2C 协议看起来有点绕,但核心流程就是这么回事。


3. 起始信号:准备通信

I2C 通信开始前,主机会先发送一个起始信号,也就是Start Condition

条件是:SCL 保持高电平期间,SDA 从高电平跳变为低电平。

这个动作的意思就是:总线上的外设注意,我要开始通信了。

此时挂在这条 I2C 总线上的所有从设备都会“听着”,等待后面的地址匹配。

这里有个关键点:
I2C 总线上,SDA 的变化不是随便什么时候都算有效。一般来说,只有在 SCL 为高电平时,SDA 的跳变才有特殊意义。

比如:

SCL高电平时,SDA 高 -> 低:起始信号SCL 高电平时,SDA 低 -> 高:停止信号

而在数据传输过程中,SDA 通常会在 SCL 低电平期间准备数据,在 SCL 高电平期间保持稳定,供接收方采样。

这些时序一般由 RK3576 的 I2C 控制器自动处理,我们写驱动时通常不用手动去拉高拉低 SDA/SCL。


4. 从设备地址:喊谁谁应答

起始信号之后,RK3576 会发送从设备地址。

I2C 常见地址是 7bit,再加 1bit 读写控制位,组成 8bit 数据。

格式如下:

前 7 位:从设备地址最后 1 位:读写位0:写1:读

比如 GT911 的设备地址是0x5d,那么 RK3576 会在总线上发出这个地址。

总线上所有从设备都会收到这个地址,但只有地址匹配的设备才会应答。这个应答信号叫ACK

ACK 的表现是:接收方在第 9 个时钟周期,将 SDA 拉低。

也就是说,I2C 发送 1 个字节并不是只需要 8 个时钟,而是需要 9 个时钟:

前 8 个时钟:传输 8bit 数据第 9 个时钟:传输 ACK 应答

如果主机没有检测到 ACK,通常说明:

设备地址不对;设备没有上电;I2C 引脚配置不对;外设没有正常工作;总线硬件异常。

所以调 I2C 设备时,如果设备一直不应答,第一反应就应该去查地址、供电、复位、pinctrl、上拉电阻这些基础条件。


5. 数据传输:一个字节一个字节来

地址匹配成功后,就进入真正的数据传输阶段。

I2C 数据传输的单位是字节,也就是 8bit。

并且传输时遵循:高位在前,MSB first。

比如一个字节0xA5,会从最高位 bit7 开始传。

根据读写位不同,通信方向也不同。

写操作

写操作是:RK3576 -> 从设备。比如主控给 GT911 写配置、写寄存器地址等。

过程大概是:

RK3576发送 8bit 数据从设备回复 ACKRK3576 再发送下一个 8bit 数据从设备继续 ACK直到数据发送完成

读操作

读操作是:从设备 -> RK3576。比如主控读取触摸坐标、读取芯片 ID、读取状态寄存器等。

过程大概是:

从设备发送 8bit 数据RK3576 回复 ACK从设备继续发送下一个 8bit 数据RK3576 继续 ACK直到读取完成

以上这些通信细节,大部分由 I2C 控制器和 Linux I2C 子系统帮我们处理好了。我们写驱动时,更多是调用类似i2c_transfer()i2c_smbus_read_byte_data()这类接口,而不是手动模拟时序。


6. 停止信号:通信结束

数据传输完成后,主机会发送停止信号,也就是Stop Condition

条件是:SCL 保持高电平期间,SDA 从低电平跳变为高电平。

这个动作表示:本次通信结束,总线释放。

停止信号发出后,从设备回到等待状态,RK3576 的 I2C 控制器也可以继续和其他外设通信。


7. I2C 的三个关键信号

通过前面的“点名对话”,可以总结出 I2C 通信里几个最关键的信号。

wKgZO2oYFtKABq8sAAKpNhEACUo865.png

起始信号 S:SCL 为高电平期间,SDA 由高变低。表示开始通信。

应答信号 ACK:接收方收到 8bit 数据后,在第 9 个时钟周期拉低 SDA。表示数据已收到。

停止信号 P:SCL 为高电平期间,SDA 由低变高。表示通信结束。

理解这三个信号,基本就能看懂 I2C 通信的大致过程了。


8. I2C 地址冲突怎么办?

I2C 是一条总线上挂多个设备,因此每个从设备都需要有自己的地址。

但实际项目中,可能会遇到两个外设地址一样的情况。比如两个相同型号的触摸芯片,默认地址都一样,那就会冲突。

因为主机一喊0x5d,两个设备都应答,总线就乱套了。针对这种情况,一般有两种解决办法。

方案一:挂到不同 I2C 控制器

RK3576 有多个通用 I2C 控制器,比如 I2C0、I2C1、I2C2 等。如果两个设备地址一样,可以把它们分别挂到不同的 I2C 总线上。

比如:

设备A-> I2C2设备B-> I2C3

这样虽然地址一样,但它们不在同一条总线上,就不会冲突。

方案二:修改从设备地址

有些外设支持通过硬件引脚配置地址。比如某些芯片可以通过拉高或拉低地址选择引脚,切换不同的 I2C 地址。这种情况下,只要硬件设计时把地址区分开,就能避免冲突。

所以画原理图时,I2C 地址一定要提前确认,不然后期调试会很难受。


9. 调试 I2C 时重点看什么?

实际调 I2C 外设时,不要一上来就怀疑驱动。

可以先按下面几个点查:

[ ]外设供电是否正常?[ ]reset / enable 引脚是否拉到正确电平?[ ]SDA / SCL 是否配置了正确 pinctrl?[ ]I2C 控制器节点 status 是否为 okay?[ ]从设备 reg 地址是否正确?[ ]SDA / SCL 是否有上拉电阻?[ ]是否存在地址冲突?[ ]i2cdetect 能否扫到设备?

很多 I2C 问题,最后都不是协议本身有多复杂,而是供电、复位、地址、pinctrl 这些基础条件没对上。


10. 总结

I2C 通信总结起来其实就是几个关键词:

两根线:SDA + SCL一个主机:RK3576多个从设备:触摸、PMIC、RTC、EEPROM 等三个信号:Start、ACK、Stop一个地址:通过从设备地址找到目标外设

整个过程就像主控在总线上点名:

开始通信 -> 发送地址 -> 等待应答 -> 读写数据 -> 停止通信

对于驱动开发来说,理解到这一层基本就够用了。再往下深挖,就是更底层的时序、电气特性、模拟电路和数字电路内容了。

wKgZO2oYFtKAVcN0AAAdH3qIzbY134.png

那些当然也重要,但对大多数基于 SDK 做外设适配的开发者来说,先搞懂通信流程、地址匹配和 ACK 应答,已经足够解决大部分 I2C 调试问题。

(完)

下期继续聊:为什么 I2C需要上拉?


本人专注Linux 嵌入式全栈开发,可提供从硬件方案评估与设计、Linux/AndroidBSP 适配、驱动开发、外设调试、系统移植到产品交付的全流程技术支持。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5213

    文章

    20871

    浏览量

    339891
  • I2C通信
    +关注

    关注

    0

    文章

    33

    浏览量

    9475
  • rk3576
    +关注

    关注

    1

    文章

    332

    浏览量

    1787
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    驱动之路#43:一文理清I2C子系统架构

      前面几篇文章,我们已经简单聊过 I2C 通信机制I2C 为什么要上拉,以及 I2C 和 SMBus 的关系。 到这里,如果只是理解
    的头像 发表于 06-10 16:05 258次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#43:一文理清<b class='flag-5'>I2C</b>子系统架构

    工业级设计揭秘:迅为RK3576如何保证-40℃到85℃稳定运行?

    工业级设计揭秘:迅为RK3576如何保证-40℃到85℃稳定运行?
    的头像 发表于 02-28 15:56 351次阅读
    工业级设计揭秘:迅为<b class='flag-5'>RK3576</b>如何保证-<b class='flag-5'>40</b>℃到85℃稳定运行?

    RK3576平台PCA9548 I2C开关设备树配置与生效全解析

    嵌入式开发中,单路I2C总线往往无法满足多外设的挂载需求,NXP的PCA9548(8通道I2C Switch)是解决该问题的常用方案,尤其在RK3576等嵌入式平台的摄像头、VCM等多I2C
    的头像 发表于 02-28 11:18 2025次阅读
    <b class='flag-5'>RK3576</b>平台PCA9548 <b class='flag-5'>I2C</b>开关设备树配置与生效全解析

    RK3576的MIPI CSI-2接口,4K视频输入与兼容实现技巧

    瑞芯微RK3576芯片作为一款中高端的八核Arm架构SoC,引入了新一代完全基于硬件的16M像素ISP(图像信号处理器),可支持多路MIPICSI-2视频输入。本文将基于RK3576芯片特性,介绍
    的头像 发表于 01-27 07:57 812次阅读
    <b class='flag-5'>RK3576</b>的MIPI CSI-<b class='flag-5'>2</b>接口,4K视频输入与兼容实现技巧

    RK3576开发板OpenGL性能大起底,这数据我真的服了

    瑞芯微RK3576芯片作为一款中高端的八核Arm架构嵌入式处理器,集成Mali-G52MC3的GPU。本次OpenGL性能测试,基于触觉智能RK3576开发板PurplePiOH2演示。为了回馈大家
    的头像 发表于 01-16 17:20 1986次阅读
    <b class='flag-5'>RK3576</b>开发板OpenGL性能大起底,这数据我真的服了

    迅为RK3576对比RK3568:AI算力与接口的全面跃迁

    迅为RK3576对比RK3568:AI算力与接口的全面跃迁
    的头像 发表于 12-22 15:24 2866次阅读
    迅为<b class='flag-5'>RK3576</b>对比<b class='flag-5'>RK</b>3568:AI算力与接口的全面跃迁

    基于米尔RK3576的环视实时性方案解析

    帧率下,系统必须在40ms内完成一帧的所有处理。假设GPU流水线稳定在25ms完成环视基础处理,那么系统还剩下约15ms的时间裕度。NPU的用武之地: 这15ms的宝贵时间,正是留给RK3576内置
    发表于 11-28 16:57

    迅为如何在RK3576上部署YOLOv5;基于RK3576构建智能门禁系统

    迅为如何在RK3576开发板上部署YOLOv5;基于RK3576构建智能门禁系统
    的头像 发表于 11-25 14:06 2186次阅读
    迅为如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>构建智能门禁系统

    360环视硬件平台为什么推荐使用米尔RK3576开发板?

    画面,天然契合 360 环视的多视角覆盖诉求。低延迟 RTSP 推流:在米尔优化方案中,RK3576 将多路视频进行 RGA 图像预处理与 VPU 硬件编码(H.264),经网络 RTSP 推流 到
    发表于 09-19 17:38

    【作品合集】米尔RK3576开发板测评

    】米尔RK3576开发板免费试用 作者:EPTmachine【米尔RK3576开发板免费体验】1、开发环境、镜像烧录、QT开发环境搭建以及应用部署 【米尔RK3576开发板免费体验】2
    发表于 09-11 10:19

    【作品合集】灵眸科技EASY EAI Orin Nano(RK3576)开发板测评

    RK3576处理器设计,集成了4个Cortex-A72和4个Cortex-A53及支持NEON指令集,支持8K@30fps的H.265,VP9AVS2 和 AV1解码器,4k@60fps的H.264 解码器
    发表于 09-09 09:59

    RK3576助力智慧安防:8路高清采集与AI识别

    :多路实时监控,结合人脸识别门禁。 • 城市交通:路口多角度监控+车辆检测。 • 工业园区:重点区域实时巡检。5. 未来趋势随着AI算法与边缘计算的融合,安防监控将从单一的“记录回放”走向“实时分析+智能响应”。米尔RK3576凭借卓越的性能和扩展性,将在智慧安防领域持续
    发表于 08-22 17:41

    瑞芯微RK3576RK3576S有什么区别,性能参数配置与型号差异解析

    瑞芯微第二代8nm高性能AIOT平台RK3576家族再添新成员-RK3576S,先说结论:相较主型号的RK3576/RK3576J,性能略有缩减,而功耗有所降低。主要应用于商显终端、智
    的头像 发表于 08-14 23:57 2997次阅读
    瑞芯微<b class='flag-5'>RK3576</b>与<b class='flag-5'>RK3576</b>S有什么区别,性能参数配置与型号差异解析

    RK2款旗舰芯片RK3588 PK RK3576,谁是最优选

    架构来看,RK3588 的 Cortex - A75 和 Cortex - A55 核心在缓存配置上更为先进,尤其是 L3 缓存的共享机制可能使其在多核心协作和数据读取方面具有优势。RK3576
    发表于 07-10 18:24

    迅为RK3576开发板NPUrknn-toolkit2环境搭建和使用docker环境安装

    迅为RK3576开发板NPUrknn-toolkit2环境搭建和使用docker环境安装
    的头像 发表于 06-18 15:22 1629次阅读
    迅为<b class='flag-5'>RK3576</b>开发板NPUrknn-toolkit<b class='flag-5'>2</b>环境搭建和使用docker环境安装