2、I3C物理层:信号电平、总线拓扑、主从设备

做嵌入式这些年,我调试过不少总线协议。从最早的UART、SPI,到后来的I2C,再到现在的I3C。每次换新总线,第一件事就是先摸透它的物理层。为啥?因为物理层决定了你的电路能不能正常工作,信号能不能传稳,设备能不能挂上去。说白了,物理层是地基。地基没打好,上层协议再牛也白搭。

I3C的物理层跟I2C比,变化挺大的。它保留了I2C的两线制(SCL和SDA),但在信号电平、驱动方式、总线拓扑上都做了不少升级。我个人的经验是,如果不搞清楚这些差异,直接按I2C的老套路去画板子、写驱动,十有八九要踩坑。

这一章咱们就掰开揉碎了,把I3C物理层的三个核心问题讲清楚:信号电平怎么定、总线拓扑怎么连、主从设备怎么分。


2.1 信号电平:不只是电压高低那么简单

I3C的信号电平,比I2C要讲究得多。它支持两种电压域:1.2V域(典型1.2V,范围1.1V~1.3V)和1.8V域(典型1.8V,范围1.7V~2.5V)。你在选型时可以二选一,但不能混用——至少在同一个总线段内不能混。

我个人的习惯:如果系统里已经有1.8V的器件,我就直接选1.8V域。如果系统是低功耗场景,比如可穿戴设备,那就倾向1.2V域。省电嘛,能省一点是一点。

I3C跟I2C一个很大的不同,在于驱动方式。I2C从头到尾都是开漏(Open-Drain),靠上拉电阻把电平拉高。I3C不一样,它在高速数据传输时用推挽(Push-Pull),只在仲裁和低速模式下才切回开漏。

为什么要这么麻烦?你想想看,开漏输出虽然方便做线与仲裁,但上升沿靠上拉电阻拉,速度上不去。推挽输出的上升沿陡得多,速率可以拉到10MHz以上。I3C最高能跑到12.5MHz甚至更高,靠的就是推挽。

下面这个表,是我在实际项目中经常用来对照的I3C与I2C信号参数对比,你可以保存一份参考:

参数 I3C(1.2V域) I3C(1.8V域) 传统I2C
VDD范围 1.1V ~ 1.3V 1.7V ~ 2.5V 1.8V ~ 5.5V
VIH(高电平阈值) 0.7 × VDD 0.7 × VDD 0.7 × VDD
VIL(低电平阈值) 0.3 × VDD 0.3 × VDD 0.3 × VDD
高速驱动方式 推挽(Push-Pull) 推挽(Push-Pull) 开漏(Open-Drain)
最大时钟频率 12.5 MHz 12.5 MHz 3.4 MHz(高速模式)
我曾经踩过一个坑:在一个项目里,I3C主设备用的是1.2V域,从设备却是一颗只支持1.8V的I2C兼容芯片。我想当然地以为中间加个电平转换就完事了,结果I3C推挽输出的上升沿太陡,经过电平转换后波形严重过冲。后来不得不在信号线上串联了一个22Ω的阻尼电阻才算搞定。所以,电压域的选择一定要在设计阶段就定好,别等到调板子再改。

2.2 总线拓扑:多主多从怎么连

I3C的总线拓扑,从外观上看跟I2C很像:一条SCL时钟线,一条SDA数据线,所有设备都挂在这两条线上。但它的多主能力比I2C强很多。

I2C虽然也支持多主,但仲裁机制比较重,实际项目中很少看到两个主设备同时跑。I3C就不一样了,它原生支持多主多从架构,而且主设备之间切换非常平滑。主设备可以动态交接控制权,这在需要低功耗管理的系统里特别实用。

具体来说,I3C总线上可以挂的设备包括:

  • Primary Master:总线的老大,负责初始化、动态地址分配、时钟控制。整个总线只有一个Primary Master。
  • Secondary Master:备胎主设备。当Primary Master挂了或者主动让权时,它可以接替控制权。可以有多个。
  • I3C Target:原生I3C从设备,支持动态地址分配,性能最好。
  • I2C Target:传统I2C从设备,I3C总线为了兼容而保留它们,但它们的速度会拖慢整条总线。

这里有一个关键点,我建议你在设计时特别注意:I2C从设备是静态地址的,I3C从设备是动态地址的。如果你的总线上挂了I2C设备,那它们的地址必须跟I3C动态地址池错开,否则会冲突。我记得在MIPI I3C规范里,I2C设备的地址范围是0x08~0x77,I3C动态地址分配会避开这个范围。

一句话总结总线拓扑:一条总线,两根线,多个主设备轮流管,大量从设备动态挂。向后兼容I2C,但别让老设备拖了后腿。

2.3 主从设备:谁说了算

I3C的主从角色划分,比I2C要细致一些。咱们来逐个拆解。

Primary Master 是总线的核心。上电后,它负责做三件事:

  1. 设定总线时钟频率(一般在4MHz~12.5MHz之间)
  2. 发起动态地址分配(DAA,Dynamic Address Assignment)
  3. 管理总线状态,控制数据流向

Secondary Master 平时处于监听状态,不主动发消息。但当它检测到Primary Master长时间不活动(比如死机了),或者接到Primary Master的显式让权指令,它就会接管总线控制权。这个机制在可靠性要求高的场景里很有用,比如车载系统。

Target(从设备) 就简单了,它不主动发起通信,只响应主设备的命令。但I3C的Target比I2C的从设备多了一个能力:它可以发送带内中断(In-Band Interrupt)。什么意思?就是不需要额外中断引脚,直接在SDA上拉低来通知主设备——"我有事找你"。这个设计省GPIO,省走线,我特别喜欢。

我建议你在初期设计时,先把Primary Master的角色定好,然后根据系统冗余需求决定要不要Secondary Master。如果只是做简单的传感器数据采集,一个Primary Master就够了。如果是做汽车域控制器或者基站管理,那至少配一个Secondary Master做热备份。

主从设备之间通过动态地址分配来建立通信关系。这是I3C的一大亮点。上电时,每个Target设备都有一个固定的临时地址(或者叫设备ID),Primary Master通过这个临时地址跟它通信,然后给它分配一个唯一的7位动态地址。分配完成后,这个Target就用自己的新地址在总线上活动了。

为什么要动态分配?原因其实很实际:你可以在生产时不关心设备地址,让系统自己去协商。同一个模组换一个厂商的传感器,地址变了也不用改代码。这种灵活性,做消费电子的人最懂。


本章核心知识体系:下面的SVG结构图把I3C物理层的三个模块——信号电平、总线拓扑、主从设备——以及它们的关键子项梳理清楚了。你可以用它做快速回顾,也可以画到你的设计文档里。
第2章 I3C物理层 知识体系 I3C 物理层 信号电平 总线拓扑 主从设备 1.2V / 1.8V 双电压域 开漏 + 推挽混合 多主多从共享总线 兼容 I2C 从设备 主 / 备 Master 切换 Target 动态地址分配 📌 核心要点 信号电平决定电路兼容性,总线拓扑决定设备挂载方式,主从角色决定控制权归属。 三者共同构成了I3C动态地址分配的物理基础。

好了,这一章的内容就讲到这里。物理层看起来基础,但它是后续所有协议动作的载体。搞懂了信号怎么走、设备怎么挂、角色怎么分,咱们才能放心地进入动态地址分配的核心流程。