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)。你在选型时可以二选一,但不能混用——至少在同一个总线段内不能混。
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(高速模式) |
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动态地址分配会避开这个范围。
2.3 主从设备:谁说了算
I3C的主从角色划分,比I2C要细致一些。咱们来逐个拆解。
Primary Master 是总线的核心。上电后,它负责做三件事:
- 设定总线时钟频率(一般在4MHz~12.5MHz之间)
- 发起动态地址分配(DAA,Dynamic Address Assignment)
- 管理总线状态,控制数据流向
Secondary Master 平时处于监听状态,不主动发消息。但当它检测到Primary Master长时间不活动(比如死机了),或者接到Primary Master的显式让权指令,它就会接管总线控制权。这个机制在可靠性要求高的场景里很有用,比如车载系统。
Target(从设备) 就简单了,它不主动发起通信,只响应主设备的命令。但I3C的Target比I2C的从设备多了一个能力:它可以发送带内中断(In-Band Interrupt)。什么意思?就是不需要额外中断引脚,直接在SDA上拉低来通知主设备——"我有事找你"。这个设计省GPIO,省走线,我特别喜欢。
主从设备之间通过动态地址分配来建立通信关系。这是I3C的一大亮点。上电时,每个Target设备都有一个固定的临时地址(或者叫设备ID),Primary Master通过这个临时地址跟它通信,然后给它分配一个唯一的7位动态地址。分配完成后,这个Target就用自己的新地址在总线上活动了。
为什么要动态分配?原因其实很实际:你可以在生产时不关心设备地址,让系统自己去协商。同一个模组换一个厂商的传感器,地址变了也不用改代码。这种灵活性,做消费电子的人最懂。
好了,这一章的内容就讲到这里。物理层看起来基础,但它是后续所有协议动作的载体。搞懂了信号怎么走、设备怎么挂、角色怎么分,咱们才能放心地进入动态地址分配的核心流程。