第2章 I3C物理层:信号线定义、电压规范与上拉电阻选择
咱们做I3C信号测量,首先得把物理层搞清楚。物理层就像房子的地基,地基没打好,后面时序分析再漂亮也是白搭。我个人习惯是,拿到一个新的I3C器件,第一件事就是翻数据手册看它的物理层参数——SCL和SDA到底怎么接、电压范围多少、上拉电阻选多大。
2.1 信号线定义:SCL与SDA
I3C和I2C一样,也是两根线:SCL(时钟)和SDA(数据)。但你别觉得它俩跟I2C一模一样,没那么简单。
- SCL:时钟线,由主设备驱动。数据跳变沿的采样基准全靠它。
- SDA:数据线,双向的。主设备发地址、命令,从设备回ACK或者数据。
嗯,这里要注意:I3C的SDA在高速模式(HDR)下会有不同的驱动强度要求,后面时序部分我们会细说。我遇到过一款从设备,SDA上升沿特别慢,结果在4MHz下读数据全是错的——后来发现是PCB走线太长,寄生电容太大。
📌 小贴士:SCL和SDA在PCB上尽量等长、等宽,差分走线对I3C不是必须的,但两根线间距保持一致能减少串扰。个人建议控制在5~10mil间距。
2.2 电压电平规范
I3C的电压范围比I2C宽泛不少。标准化组织规定了几个关键电平阈值,咱们直接看表。
| 参数 | 1.2V (VDD=1.2V) | 1.8V (VDD=1.8V) | 3.3V (VDD=3.3V) | 说明 |
|---|---|---|---|---|
| VIL (低电平输入) | ≤ 0.3×VDD | ≤ 0.3×VDD | ≤ 0.3×VDD | 固定比例,不是固定电压 |
| VIH (高电平输入) | ≥ 0.7×VDD | ≥ 0.7×VDD | ≥ 0.7×VDD | 同上 |
| VOL (低电平输出) | ≤ 0.2×VDD | ≤ 0.2×VDD | ≤ 0.2×VDD | 一般≤0.4V (3.3V下) |
| VOH (高电平输出) | ≥ 0.8×VDD | ≥ 0.8×VDD | ≥ 0.8×VDD | 注意是弱上拉,不是rail-to-rail |
| 上升/下降时间 | ≤ 3ns@10pF | ≤ 3ns@10pF | ≤ 6ns@10pF | 负载不同会变 |
为什么用比例而不是固定电压?说白了就是为了兼容不同电压域。你想想看,1.2V系统里0.36V就是低电平了,但在3.3V系统里0.36V还是低电平——比例设计让IP核可以跨电压复用。
⚠️ 避坑指南:我曾经碰到一个项目,主设备用1.8V,从设备用3.3V,中间没有电平转换。结果从设备死活不响应——因为它认为主设备输出的“高电平”0.9V根本达不到它的VIH门槛(2.31V)。老老实实加了TXB0104电平转换芯片才搞定。
2.3 上拉电阻选择
上拉电阻这事,看着简单,实际坑很多。I3C总线上拉电阻的取值直接影响上升沿时间,进而影响时序裕量。
基本公式还是RC充放电:
t_rise ≈ 2.2 × R_pullup × C_bus
其中 C_bus = C_pin_master + ΣC_pin_slave + C_trace
I3C规范要求上升时间在不同速度模式下有上限(比如10MHz SDR模式要求t_rise ≤ 8ns)。我们反推一下R_pullup的上下限:
- 下限:由驱动器的灌电流能力决定。比如驱动器能拉4mA,VDD=1.8V,那R_min = (VDD - VOL_max) / I_OL ≈ (1.8 - 0.36)/0.004 ≈ 360Ω。别选比这个还小的,否则数据线拉不低。
- 上限:由上升时间要求决定。假定C_bus=30pF,t_rise_max=8ns,则R_max = t_rise / (2.2 × C_bus) ≈ 8e-9 / (2.2 × 30e-12) ≈ 121Ω。嗯,这里要注意——这么小的电阻意味着总线静态功耗会比较大,但为了时序只能忍。
我整理了一个常见场景的推荐值,大家可以参考:
| VDD (V) | 总线电容 C_bus (pF) | 推荐 R_pullup (Ω) | 备注 |
|---|---|---|---|
| 1.2 | 10~20 | 1k ~ 2k | 低频≤1MHz可用 |
| 1.8 | 20~30 | 500 ~ 1k | 普通SDR模式 |
| 3.3 | 30~50 | 200 ~ 500 | 高速HDR模式推荐取小 |
❌ 常见误区:有人直接套I2C的4.7kΩ上拉电阻给I3C用。在3.3V、50pF负载下,4.7kΩ算出来上升沿时间约517ns——I3C在10MHz下周期才100ns,上升沿就占掉5个周期,根本没法用。记住:I3C的上拉电阻通常比I2C小一个数量级!
2.4 知识结构图
下面这张图把物理层三个核心模块的关系串起来了,方便你对照理解。
2.5 关于上拉电阻的实操建议
选电阻不能光看计算,还得看实际测试波形。我教大家一个土办法:用示波器钩住SDA,看上升沿是不是干净的单斜率,有没有回勾、台阶。如果有台阶,说明阻值偏大,寄生电容在某个阈值附近充不上电。
- 先估算:拿到总线电容(查器件手册,PCB寄生按4~5pF/inch估算),用公式算出R的理论范围。
- 再仿真:用LTspice搭个简单RC网络,把驱动器open-drain模型带上,跑瞬态看上升沿。
- 最后实测:在板上焊个可调电阻或者预留多个焊盘,换不同阻值看波形。我通常备0402封装的220Ω、470Ω、1kΩ各两个,现场换着测。
🛠️ 我的实测习惯:在总线上挂一个逻辑分析仪(比如Saleae),同时看SCL和SDA。如果SDA的上升沿超过了SCL半个周期,那时序肯定出问题。这时候别纠结理论值,直接降阻,直到上升沿小于1/4周期为止。