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 | 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。
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 的核心知识体系串起来。你看完后应该对整个课程结构有个大致印象。
1.5 开始之前要注意什么
好了,这一章就到这儿。接下来说实话,后面才是真正的硬核内容——你会一步步看到 DAA 协议怎么工作,怎么抓波形,怎么验证通过性。别急,一件事一件事来。