1. I3C 总线概述:从 I2C 到 I3C 的演进之路

各位好,我是老周。做了十几年嵌入式总线开发,今天来聊聊 I3C。

你可能已经用过 I2C 了。它简单、好用,但有个问题——太慢了。

现在的传感器动不动就几百 KHz 的数据率,多摄像头、多麦克风的应用越来越多。I2C 那根线上挂四五个设备就开始吃力,地址冲突、信号质量下降、速度上不去。说白了,I2C 是 80 年代的设计,那时候没人想到今天一个手机里能塞十几个传感器。

所以 MIPI 联盟在 2014 年推出了 I3C。嗯,不是 I2C 的升级版,是全新的总线协议。

1.1 发展历程:为什么要做 I3C?

上世纪 80 年代,飞利浦搞出了 I2C。两根线,多主多从,简单到几乎不用学就会用。但它的瓶颈也很明显:

  • 标准模式下最高 100 KHz,快速模式 400 KHz,快速+模式 1 MHz — 就这,还不够
  • 7 位地址,最多挂 127 个设备,但你想想看,实际能挂 10 个就不错了
  • 上拉电阻功耗高,低速时还好,高速时简直灾难

我记得 2015 年做一个手机项目,用了 6 个 I2C 传感器。为了不冲突,折腾了三天地址映射表。最后还得加一个 I2C 多路复用器。硬件成本上去了,调试时间也上去了。

所以我个人很早就关注 I3C 了。2014 年 MIPI 发布第一个版本,2016 年出 v1.0,2019 年 v1.1,2021 年 v1.2。现在主流的传感器、MCU 都已经支持了。说实话,迟早在消费电子和工业领域取代 I2C。

1.2 I3C 与 I2C 的核心对比

我直接列个表格,大家一目了然。

I2C vs I3C 核心特性对比
特性 I2C I3C
最大速率 1 MHz(快速+模式) 12.5 MHz(SDR 模式)
功耗 高(外部上拉电阻) 低(推挽输出 + 动态端接)
地址分配 固定硬件地址,冲突多 动态地址分配,无冲突
多主支持 有,但仲裁复杂 有,且更高效
In-Band Interrupt 不支持 原生支持
热插拔 不友好 支持
向后兼容 I2C — 是(可挂 I2C 从设备)

看到这个表,你可能问:为什么不干脆继续用 I2C 呢?

我举个实际例子。我十年前做的一个医疗设备,用 I2C 挂了三个温度传感器。数据采集频率只有 100Hz,I2C 完全够用。但换到现在的自动驾驶域控制器,摄像头和激光雷达的数据流是 Mbit 级别的。I2C 根本吃不消——就算你只做配置管理,一百多个设备挂在一根 I2C 总线上,那地址分配就是个噩梦。

1.3 核心特性归纳

我挑几个最重要的说。这些会在后续章节里反复用到。

1.3.1 高速传输

I3C 标准 SDR(单数据率)模式能跑到 12.5 MHz。HDR(高数据率)模式更是远超这个数。为什么能这么快?因为它用推挽输出代替了 I2C 的开漏输出。嗯,物理层改了,效果立竿见影。

我在项目中测过,用 I3C 配置一个 8 通道的 ADC,时序窗口从 I2C 的 2ms 降到了 50μs。这不是线性提升,是量级提升。

1.3.2 动态地址分配

这是 I3C 最核心的特性,也是咱们这门课的重点。每个设备不需要在出厂时烧死地址。启动时,主设备会给从设备依次分配唯一地址。整个过程走总线协议帧,不需要额外引脚,也不需要外部 EEPROM。

关键点: I3C 的动态地址分配(DAA)过程是可靠的、确定性的。我们这门课就是讲怎么验证这个过程的正确性。

1.3.3 In-Band Interrupt(IBI)

I2C 里,从设备要通知主设备,得额外拉一根中断线。I3C 可以直接在数据线上发中断请求,主设备也能立即响应。省引脚,省布线,也省软件层面的轮询逻辑。

我曾经调试过一个智能门锁,I2C 版本的中断线走线过长,信号受干扰了。换 I3C 后直接用总线中断,问题迎刃而解。

1.3.4 向后兼容 I2C

这是很务实的考量。你现有的 I2C 外设不用扔掉,I3C 主设备可以降级成 I2C 模式去访问它们。一次采购,两代兼容——硬件团队很喜欢这个特性。

1.3.5 低功耗设计

跟 I2C 比,I3C 在功耗上优势明显。动态端接技术可以自动调节总线端接电阻,没有 I2C 那始终流过电流的上拉电阻。对于电池供电的 IoT 设备,这可能是选型的关键决策因素。

1.4 知识体系总览图

这一章的内容比较多,我画了一张图把 I3C 的核心知识体系串起来。你看完后应该对整个课程结构有个大致印象。

I3C 知识体系框架 I3C 地址分配通过性验证知识体系 I3C 总线核心概念 高速传输 动态地址分配(DAA) In-Band Interrupt 低功耗 & 向后兼容 DAA 协议流程 ENTDAA 命令 设备返回 UID 分配动态地址 确认 & 重复 地址分配验证方法 时序片段抓取 地址冲突检测 协议状态机验证 边界 / 压力测试 目标:确保 DAA 在任何条件下正确、可靠、无冲突

1.5 开始之前要注意什么

给新手的建议: I3C 的物理层虽然比 I2C 复杂,但它的协议层设计得很清晰。建议先熟悉这个总线的状态机和命令帧格式,再动手做验证。别一上来就调硬件抓波形——你会被时序细节淹没的。
注意: I3C 虽然向后兼容 I2C,但不可在 I2C 从设备上运行 I3C 的动态地址分配指令。混合总线上,I2C 设备的地址必须是固定且不冲突的。我曾经在一个项目上吃过这个亏——以为都是 I2C,挂了个 I3C 从设备,结果 ENTDAA 指令下去,I2C 从机没响应,主设备一直等应答,总线卡死了五分钟。后来加了个地址映射表才好。

好了,这一章就到这儿。接下来说实话,后面才是真正的硬核内容——你会一步步看到 DAA 协议怎么工作,怎么抓波形,怎么验证通过性。别急,一件事一件事来。