I3C物理层:信号电压、时序、开漏与推挽模式
这一节我们从物理层的角度聊聊I3C。说白了,就是搞清楚I3C的信号长什么样,电平怎么定义,时序怎么卡,以及那个开漏和推挽模式到底是怎么切换的。别看这些是基础,我跟你讲,实际项目中有一半的I2C改I3C翻车,都翻在物理层理解不到位。
信号电压与电气特性
I3C的电压等级,我个人习惯叫它“低电压友好型”。标准供电电压是1.2V或1.8V,当然也能兼容传统I2C的3.3V,但切记:这不是全部都能兼容。
我建议你记住这个原则: I3C在推挽模式下,输出高电平等于VDD(电源电压),输出低电平接近GND(约0.2V以内)。开漏模式下的低电平和I2C一样,但高电平是靠上拉电阻拉上去的。
咱们来对比一下I2C和I3C的电压差异,这是我在一次项目中踩过的坑:
| 参数 | I3C (推挽) | I3C (开漏) | 传统I2C |
|---|---|---|---|
| VIH (输入高) | 0.7 × VDD | 0.7 × VDD | 0.7 × VDD |
| VIL (输入低) | 0.3 × VDD | 0.3 × VDD | 0.3 × VDD |
| VOL (输出低) | ≤ 0.2V | ≤ 0.2V | ≤ 0.4V (3mA时) |
| VOH (输出高) | ≥ VDD − 0.2V | 靠上拉电阻 | 靠上拉电阻 |
| 上升时间 (tr) | ≤ 12ns | 由RC决定 | 由RC决定 |
| 下降时间 (tf) | ≤ 6ns | ≤ 6ns | ≤ 300ns |
个人经验: 你想想看,I3C推挽模式下上升时间能压到12ns以内,而I2C慢速模式动辄微秒级,这差距就是带宽的命门。但我曾经遇到过一个情况,板子上长走线寄生电容太大,12ns死活压不下去,最后改成在从设备端加了施密特触发器整形才搞定。
开漏与推挽模式详解
I3C的驱动模式切换,是它比I2C进步最大的地方。说白了,就是兼顾了I2C的兼容性和高速传输的双重需求。
开漏模式——用于总线启动、地址分配、以及兼容的I2C设备通信。SDA和SCL都是开漏输出,要靠上拉电阻拉高。速度慢,但支持多主机仲裁。
推挽模式——用于正常数据传输(SDR模式以及HDR模式)。主设备主动推高或拉低电平,不再依赖上拉电阻。速度快,功耗低,但多主机仲裁基本停了。
模式切换怎么触发?嗯,这里要注意:
- 从空闲状态进入数据传输时,自动进入推挽模式。
- 当总线进入空闲检测(总线空闲)或需要I2C兼容通信时,自动切回开漏模式。
- CCC(公共命令代码)发送过程中也可能触发模式切换,比如RSTDAA命令。
避坑指南: 我曾经在一个项目中,为了追求速度,强制让I3C从设备一直处于推挽模式,结果在DAA(动态地址分配)阶段,所有设备同时推高SDA,直接导致总线电平冲突,好几个从设备死锁了。后来才明白:DAA阶段必须用开漏,这是硬规则。
再强调一下:不支持推挽模式的设备,在I3C总线上只能在开漏阶段通信,而且速度会被带慢。这也是为什么I3C支持混合总线——但性能损失你心里要有数。
时序要求与总线空闲检测
I3C的时序比I2C严苛得多,咱们列出几个关键参数:
- tCAS :从SCL上升沿到SDA数据有效的建立时间,推挽模式下仅需3ns。你想想看,比I2C的4.7μs快了几个数量级。
- tHD :SDA数据保持时间,推挽模式下为0ns(理论上不需要保持)。
- tBUF :总线空闲时间,推挽模式下允许为0ns,开漏模式下要求至少2μs。
- tR和tF :升降沿时间,上面表格已经列出。
总线空闲检测(Bus Available Condition)是I3C的一个独有机制。主设备在完成一个数据传输后,会拉高SDA并保持≥1个SCL周期,同时SCL也要保持高电平,此时总线进入空闲状态。这个状态是开启下一轮通信的前提。
为什么需要这个?因为只有空闲总线,才能保证下次启动时所有设备都处于开漏模式,不会发生电平冲突。
实测技巧: 我调试I3C时,特别喜欢用逻辑分析仪抓总线空闲序列。你只要看到SDA在SCL高电平后还持续高了一个周期,就知道总线释放成功了。如果没看到这个,说明前一帧没结束,下一帧启动信号会出问题。
好了,为了让你直观理解I3C物理层的整体关系,我画了一张图:
看到这张图,你应该能理清物理层的主线:从电压定义出发,到驱动模式的选择(开漏还是推挽),再到精确的时序控制(尤其是空闲检测)。这三者一起决定了I3C总线能不能稳定跑起来。
嗯,物理层的内容就到这。记住一个核心:推挽让你跑得快,开漏让你活得稳。 项目上别混用,否则你会后悔的。