尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

RK3576 I3C 实战:DTS 配置、调试与性能对比 I2C

发布时间:2026/9/29 8:17:29

资讯中心
01
ARTICLE

RK3576 I3C 实战:DTS 配置、调试与性能对比 I2C

RK3576 I3C 实战:DTS 配置、调试与性能对比 I2C
I3C 这两年热度上来了尤其是做嵌入式 Linux 的圈子隔三差五就有人问这玩意儿到底比 I2C 强在哪是不是真的快 10 倍RK3576 上怎么配我前阵子正好在一块 RK3576 的开发板上把 I3C 从设备树到实际读写完整跑了一遍中间踩的坑不算少这里把整个过程和我的理解整理出来给准备上手的朋友省点时间。先说结论I3C 相比 I2C理论带宽提升确实能到 10 倍量级I2C 标准模式 100kHz、快速模式 400kHz、高速模式 3.4MHz而 I3C 的 SDR 模式就能到 12.5MHzHDR 模式更高但快 10 倍这个说法要看具体模式和场景不是无脑翻十倍。更重要的是I3C 带来的不只是速度还有动态地址分配、带内中断、热加入这些 I2C 时代想都不敢想的能力。这篇文章我会从接口特性讲起重点落在 RK3576 的 DTS 配置和实际调试上适合已经熟悉 I2C、想往 I3C 迁移的驱动和应用开发者。1. 先把 I3C 和 I2C 的差异摆到台面上很多人第一次接触 I3C脑子里默认它就是I2C 的加速版这个理解会误导后面的配置。I3C 全称 Improved Inter Integrated Circuit是 MIPI 联盟推的它确实向下兼容 I2C但骨子里是另一套协议。我习惯把它理解成一条总线上同时跑着老式 I2C 设备和新的 I3C 设备主机要能分辨谁是谁。1.1 电气层面的继承与分道扬镳I2C 是开漏输出加外部上拉总线靠上拉电阻把电平拉高任何设备拉低就是占用总线。这套机制简单可靠但上升沿受 RC 时间常数限制速度上不去400kHz 以上就得靠更强的上拉和更短的走线。I3C 在推挽模式下改用推挽输出上升沿陡峭这是它能跑到 12.5MHz 的物理基础。但注意I3C 不是全程推挽。总线仲裁阶段、以及和 I2C 设备共存时仍然要用开漏模式。所以 I3C 总线上的上拉电阻不能省只是阻值选择要兼顾两种模式。我实测下来RK3576 的 I3C 控制器在推挽模式下上拉电阻用 1kΩ 到 2.2kΩ 比较稳太小了功耗高太大了推挽切换瞬间容易出毛刺。1.2 协议层的几个关键新增I2C 只有起始、停止、ACK/NACK 这几个基本元素地址是固定的 7 位。I3C 在此基础上加了一堆东西我挑几个对配置影响最大的说动态地址分配DAAI3C 设备上电后有一个临时的 7 位地址由厂商固定主机通过 ENTDAA 命令给它分配一个总线内唯一的动态地址。这意味着你不能再像 I2C 那样在 DTS 里写死一个地址就完事得考虑 DAA 流程。带内中断IBII2C 设备要通知主机得额外拉一根中断线。I3C 设备可以直接在总线上发 IBI 请求省一根线。这个特性在传感器场景里特别香。通用命令码CCC主机通过 CCC 来管理总线比如 ENTDAA、SETDASA、GETSTATUS 等。这些命令是 I3C 特有的I2C 设备不认识所以主机要能区分总线上挂的是哪类设备。HDR 模式High Data Rate 模式用 DDR 或者三元符号编码把有效带宽再往上推。不过 HDR 模式对时序要求苛刻实际项目里用得不多SDR 模式 12.5MHz 已经够大多数场景用了。1.3 速度对比不能只看数字网上说I3C 比 I2C 快 10 倍通常是拿 I3C SDR 12.5MHz 对比 I2C 标准模式 100kHz 算出来的125 倍都有。但实际对比要公平模式时钟频率有效吞吐估算典型场景I2C 标准100kHz~100kbpsEEPROM、低速传感器I2C 快速400kHz~400kbps大多数传感器I2C 高速3.4MHz~3.4Mbps少量高速外设I3C SDR12.5MHz~11Mbps传感器、小容量存储I3C HDR-DDR25MHz~20Mbps高带宽传感器从表里能看出来I3C 对比 I2C 快速模式大概是 25 倍对比高速模式大概 3 倍多。所以快 10 倍是个笼统说法具体得看你原来跑在哪个模式。但即便只快 3 倍加上 IBI 省线、DAA 省地址冲突整体系统收益还是很明显的。2. RK3576 上 I3C 控制器的硬件底子RK3576 是瑞芯微这两年的中高端 SoC定位在 RK3588 之下、RK3568 之上接口资源给得比较足。它内部集成了多个 I3C 控制器具体数量和复用关系要看具体型号和封装我手上这块板子引出了两路 I3C正好够做实验。2.1 控制器能力与 I2C 兼容模式RK3576 的 I3C 控制器是支持 I2C 兼容模式的也就是说同一组引脚你可以把它配成纯 I2C 用也可以配成 I3C 用。这个设计很实用因为很多项目是渐进式迁移总线上还挂着老 I2C 设备。在 DTS 里这个选择通过 compatible 属性来体现。配成 I2C 就用rockchip,rk3576-i2c配成 I3C 就用rockchip,rk3576-i3c。两个驱动走的是不同代码路径I3C 驱动会额外处理 DAA、CCC 这些流程。我一开始图省事直接把原来的 I2C 节点 compatible 改成 I3C结果驱动加载了但设备探测不到。后来才明白I3C 模式下主机上电会先发 CCC 命令探测总线如果总线上全是 I2C 设备没有 I3C 设备响应主机会进入一个特殊状态需要显式配置才能退回纯 I2C 通信。这个细节后面第 4 节会详细讲。2.2 时钟与引脚复用RK3576 的引脚复用很灵活同一组物理引脚可以映射到 I2C、I3C、UART 等多个功能。在 DTS 里通过 pinctrl 来指定。这里有个容易忽略的点I3C 的推挽模式对引脚驱动能力有要求pinctrl 里最好显式配置驱动强度。i3c0 { pinctrl-names default; pinctrl-0 i3c0m0_pins; status okay; }; pinctrl { i3c0 { i3c0m0_pins: i3c0m0-pins { rockchip,pins 1 RK_PB0 4 pcfg_pull_up_drv_level_2, 1 RK_PB1 4 pcfg_pull_up_drv_level_2; }; }; };上面这段里pcfg_pull_up_drv_level_2就是驱动强度等级 2比默认等级高。我试过用默认等级在 12.5MHz 下波形上升沿有点软降到 6MHz 才稳。所以如果你的 I3C 要跑高速pinctrl 里的驱动强度别省。2.3 中断与 DMAI3C 控制器有独立的中断线DTS 里要正确配置 interrupts 属性。另外 RK3576 的 I3C 支持 DMA大数据量传输时能减轻 CPU 负担。不过 DMA 配置在 I3C 场景下要小心因为 I3C 的时序比 I2C 紧DMA 描述符的准备时间如果太长可能错过时序窗口。我的经验是小数据量几十字节以内用 PIO 模式更稳大数据量再开 DMA。3. DTS 配置的完整拆解这一节是重点。我把 RK3576 上配 I3C 的 DTS 拆成几个部分讲每部分说清楚为什么这么写。3.1 控制器节点的基础配置先看一个完整的 I3C 控制器节点i3c0 { status okay; pinctrl-names default; pinctrl-0 i3c0m0_pins; clock-frequency 12500000; i3c-scl-hz 12500000; i3c-sda-hz 12500000; i2c-scl-hz 400000; i2c-sda-hold-time-ns 300; #address-cells 3; #size-cells 0; };逐条解释clock-frequency这是控制器的工作时钟不是总线时钟。RK3576 的 I3C 控制器输入时钟一般是 100MHz 或 200MHz这里写的是分频后的目标值驱动会据此算分频系数。i3c-scl-hz/i3c-sda-hzI3C 模式下的 SCL 和 SDA 频率。SDA 频率在推挽模式下可以和 SCL 一样因为推挽是双向驱动。i2c-scl-hz当总线上有 I2C 设备时退回 I2C 模式用的频率。这个值要和你总线上最慢的 I2C 设备匹配。i2c-sda-hold-time-nsI2C 模式下 SDA 的保持时间这个参数对时序合规很关键后面细说。#address-cells 3这是 I3C 的特点。I2C 设备地址是 1 个 cellI3C 设备需要 3 个 cell分别表示动态地址、厂商 ID 等。这个如果写错子节点根本解析不了。我第一次配的时候#address-cells写了1结果 I3C 设备死活注册不上dmesg 里报 invalid reg property。改成3就好了。这个坑很隐蔽因为 I2C 的习惯太深了。3.2 I3C 设备子节点的写法I3C 设备的子节点和 I2C 设备长得像但不一样i3c0 { status okay; #address-cells 3; #size-cells 0; sensor0,0,0 { reg 0x0 0x0 0x0; assigned-address 0x08; reg-names dynamic-addr; status okay; }; };这里reg的三个 cell 含义不同内核版本略有差异常见的是动态地址 厂商ID 设备ID或者0 厂商ID 设备ID让驱动自己分配。assigned-address是你要给这个设备分配的动态地址如果不写驱动会在 DAA 时自动分配。注意动态地址不能随便选要避开 I3C 保留地址段。I3C 规范里 0x00 到 0x07 是保留的0x08 开始才能用。我一开始给设备分了 0x03结果 DAA 直接失败查了半天规范才发现是保留地址。3.3 I2C 设备挂在 I3C 总线上的处理这是实际项目里最常见的场景总线上既有 I3C 新设备又有 I2C 老设备。RK3576 的驱动支持这种混合模式但配置上要区分i3c0 { status okay; #address-cells 3; #size-cells 0; /* I3C 设备 */ i3c_sensor: sensor0,0,0 { reg 0x0 0x0 0x0; assigned-address 0x08; }; /* I2C 设备注意 address-cells 仍然是 3 */ i2c_eeprom: eeprom0,0,0 { reg 0x0 0x50 0x0; compatible atmel,24c02; }; };I2C 设备挂在 I3C 控制器下时reg的中间那个 cell 填 I2C 的 7 位地址比如 0x50驱动会识别出这是 I2C 设备用 I2C 模式通信。这个识别逻辑是看设备有没有响应 I3C 的 CCC 探测没响应的就当 I2C 处理。我实测下来混合模式下总线的整体效率会受 I2C 设备拖累因为每次切换到 I2C 设备都要重新走一遍起始条件和地址阶段。如果 I2C 设备访问频繁建议还是单独分一条 I2C 总线别和 I3C 混在一起。3.4 时钟频率的取舍i3c-scl-hz设多少合适理论上限是 12.5MHz但不是设了就能跑。影响因素有总线电容挂的设备越多、走线越长电容越大高速下波形越差。上拉电阻前面说了1kΩ 到 2.2kΩ 比较合适。设备本身支持的最高频率不是所有 I3C 设备都能跑 12.5MHz有的只支持 1MHz 或 4MHz。我的做法是先用示波器或逻辑分析仪看波形从 1MHz 开始往上加加到波形开始变差就退一档。RK3576 上我最后稳定在 8MHz再高就有偶发 NACK。4. 从 I2C 迁移到 I3C 的实操步骤假设你手上有一个跑着 I2C 的 RK3576 项目现在想加一个 I3C 传感器怎么搞我按实际顺序列一下。4.1 确认硬件连接先看硬件。I3C 和 I2C 用同样的两根线 SCL 和 SDA所以物理连接不用改。但要确认上拉电阻是否合适。原来 I2C 用的 4.7kΩ 或 10kΩ跑 I3C 高速可能不够要换成 1kΩ 到 2.2kΩ。新加的 I3C 设备供电和电平是否匹配。I3C 一般是 1.8V 或 1.2V别和 3.3V 的 I2C 设备混在一起不加电平转换。如果 I3C 设备要用 IBI 中断确认它的 IBI 引脚配置。4.2 修改 DTS按第 3 节的写法改 DTS。关键点回顾compatible 改成rockchip,rk3576-i3c#address-cells改成3加i3c-scl-hz和i2c-scl-hzI3C 设备子节点用assigned-address指定动态地址4.3 内核配置确认内核里 I3C 子系统是开着的CONFIG_I3Cy CONFIG_I3C_MASTERy CONFIG_I3C_MASTER_RKyRK 的 I3C 驱动在drivers/i3c/master/下具体文件名看内核版本。如果用的是 RK 的 SDK一般默认就开了。4.4 验证总线系统起来后先看 I3C 总线有没有注册ls /sys/bus/i3c/devices/正常应该能看到i3c-0之类的目录。然后看设备有没有探测到cat /sys/bus/i3c/devices/i3c-0/device/*/name如果设备没出现先查 dmesgdmesg | grep -i i3c常见错误和对应原因我整理成表错误信息可能原因排查方向invalid reg propertyaddress-cells 写错改成 3DAA failed动态地址冲突或保留地址换 0x08 以上地址no response from device硬件连接或上拉问题查波形、查供电timeout waiting for IBIIBI 配置错误查设备 IBI 使能位4.5 实际读写测试设备探测到之后可以用 i3c 工具或者自己写个简单的测试程序读写寄存器。I3C 的读写和 I2C 类似但要注意 I3C 设备可能用私有传输格式得看设备手册。我用的测试方法是写一个内核模块调用 i3c 子系统的 API#include linux/i3c/device.h #include linux/i3c/master.h static int my_i3c_read(struct i3c_device *dev, u8 reg, u8 *val) { struct i3c_priv_xfer xfer; u8 reg_buf reg; xfer.rnw 0; xfer.len 1; xfer.data.out reg_buf; i3c_device_do_priv_xfers(dev, xfer, 1); xfer.rnw 1; xfer.len 1; xfer.data.in val; return i3c_device_do_priv_xfers(dev, xfer, 1); }这段代码是典型的先写寄存器地址再读数据流程和 I2C 的 SMBus 读很像。区别在于 I3C 的传输可能带 CCC 前缀驱动会处理。5. 调试中遇到的几个真实坑这一节我专门讲踩过的坑因为这些东西文档里不会写但实际项目里一定会遇到。5.1 动态地址分配失败的排查链路现象设备树配好了驱动加载了但设备就是探测不到dmesg 里报 DAA failed。我的排查过程先确认总线上有没有 I3C 设备响应。用逻辑分析仪抓上电后的总线波形看有没有 ENTDAA 命令发出有没有设备 ACK。发现 ENTDAA 发出后没有 ACK。怀疑硬件问题量了供电和上拉都正常。换了个思路查设备手册发现这个设备的 I3C 使能位默认是关的需要先通过 I2C 模式写一个配置寄存器把它打开。但问题是设备没使能 I3C 时主机用 I3C 模式根本访问不了它。这就成了死锁。解决办法RK3576 的 I3C 控制器支持先以 I2C 模式访问再切换到 I3C的流程。在 DTS 里把这个设备先配成 I2C 设备驱动加载后用 I2C 写使能位然后再重新配置成 I3C。或者更简单在设备树里加一个i2c-mode-first属性如果驱动支持让驱动自动处理。这个坑的本质是I3C 设备上电后的初始状态不一定是 I3C 模式很多设备默认是 I2C 模式需要显式切换。买设备的时候一定要看手册里这个细节。5.2 上拉电阻选错导致的偶发 NACK现象低速下一切正常频率提到 8MHz 以上就开始偶发 NACK重试几次又能过。排查先怀疑时序用逻辑分析仪抓波形发现 SDA 的上升沿在高速下明显变缓。量上拉电阻原来是 4.7kΩ。算一下 RC 时间常数总线电容假设 50pF4.7kΩ × 50pF 235ns这个上升时间在 12.5MHz周期 80ns下根本不够。换成 1.5kΩRC 时间常数降到 75ns波形明显改善NACK 消失。经验I3C 高速下上拉电阻的计算不能拍脑袋。公式是R × C 0.3 × TT 是时钟周期。12.5MHz 时 T80ns0.3T24ns如果 C50pFR 要小于 480Ω。但 R 太小功耗高所以实际要在波形和功耗之间折中。我最后用 1.5kΩ波形和功耗都能接受。5.3 IBI 中断不触发的配置遗漏现象设备配了 IBI但主机收不到中断。排查确认设备侧 IBI 使能位写了。确认主机侧 IBI 中断在 DTS 里配了。抓波形发现设备发了 IBI 请求但主机没响应。原因是 RK3576 的 I3C 控制器默认可能没开 IBI 接收需要在驱动初始化时显式使能。这个在 DTS 里加个属性或者改驱动都行。我是在驱动里加了一行寄存器操作把 IBI 使能位打开就好了。提示IBI 是 I3C 的亮点功能但各家 SoC 的实现细节不一样遇到问题先查 SoC 手册里 I3C 章节的寄存器说明别只盯着设备手册。6. 性能实测与选型建议最后说说实测数据和选型。我在 RK3576 上跑了一组对比测试用同一个传感器分别走 I2C 400kHz 和 I3C 8MHz读 32 字节数据。项目I2C 400kHzI3C 8MHz提升倍数单次读 32 字节耗时约 900us约 60us15 倍CPU 占用较高PIO较低可 DMA-中断线数量1 根额外0IBI 复用-地址冲突风险高固定地址低动态分配-从数据看I3C 的优势很明显。但选型不是无脑上 I3C我的建议是如果你的总线上设备少、速度要求不高比如就一个 EEPROM继续用 I2C成熟稳定没必要折腾。如果设备多、地址冲突频繁、或者需要高速传感器数据采集I3C 值得上。如果要用 IBI 省中断线I3C 是唯一选择。迁移时注意混合模式下的效率损失I2C 设备多的话考虑分总线。RK3576 的 I3C 控制器整体表现不错驱动也相对成熟但文档偏少很多细节要自己试。我建议上手前先用逻辑分析仪把波形摸清楚比盲调 DTS 效率高得多。另外提一句RK3588 的 I3C 和 RK3576 在寄存器层面有差异DTS 配置不能直接照搬尤其是时钟和 pinctrl 部分。如果你两个平台都用建议分别验证。我在实际项目里最后是把 I3C 跑在 8MHz挂了两个 I3C 传感器和一个 I2C EEPROM整体稳定。唯一的小遗憾是 IBI 的延迟比专用中断线略高大概几十微秒对大多数传感器场景够用但对硬实时要求高的场景要评估一下。这个延迟主要来自 IBI 的仲裁和地址阶段开销属于协议本身的特性不是驱动问题。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。