I3C动态地址分配PCB布局布线实战 - 第1节

1.1 I3C 到底是什么?

咱们做硬件的,谁还没被 I2C 和 SPI 折磨过呢?

我记得刚入行那会儿,调一个 sensor 的 I2C 接口,地址冲突、速率上不去、中断还得单独拉一根线,板子上密密麻麻的飞线,那个酸爽。再到后来做高速采集,SPI 虽然快,但线多啊,一个设备就要四根线,主控引脚都不够用。

所以在 MIPI 联盟推出 I3C 的时候,我第一反应是:又来个新总线?但仔细看完 spec ,嗯,这玩意儿真香。

I3C,全称 Improved Inter-Integrated Circuit,说白了就是 I2C 的全面升级版。它不是革命,是进化。它保留了 I2C 的两线制(SCL + SDA)精髓,但把性能和灵活性拉高了一大截。

一句话总结: I3C = I2C 的兼容性 + SPI 的高速率 + 动态地址分配 + 带内中断。一个总线搞定传感器、摄像头、音频、电源管理等几乎所有低速外设。

1.1.1 I3C 的物理层长啥样?

还是那两根线:SCL(时钟)和 SDA(数据)。但驱动方式变了。

  • 推挽输出(Push-Pull): 高速传输时用,速率能到 12.5MHz 甚至更高。我做过一个项目,I3C 跑在 10MHz,完全没问题。
  • 开漏输出(Open-Drain): 兼容 I2C 设备时用,也是低速模式(比如 1MHz 以下)。
  • 电压: 支持 1.2V 和 1.8V,低功耗场景很友好。我建议新项目直接上 1.2V,省电还干净。

你可以把 I3C 想象成一辆混动车——市区低速用电(开漏),上了高速就切换到油(推挽)。两种模式自动切换,你都不用操心。

1.1.2 核心特点有哪些?

我挑几个最关键的说说,这些也是你在做 PCB Layout 时必须牢记的。

特点说明我的感受
动态地址分配设备上电后由主控分配地址,不用硬连接或写死「这个功能救过我,不用再对着原理图改 A0/A1 了」
带内中断(In-Band Interrupt)从设备直接在 SDA 上发中断信号,不用额外引脚「省引脚、省走线、省 BOM,太爽了」
多主多从支持多个主控仲裁,比 I2C 更高效「多主场景不多,但有了总比没有强」
CRC 校验每个数据包都带校验,可靠性高「高速传输时 CRC 非开不可,不然数据错都不知道」
I2C 向后兼容老 I2C 设备可以直接挂到 I3C 总线上「兼容旧设计,产品迭代成本低」
高带宽推挽模式下可达 12.5MHz 以上「简单的摄像头、音频流都能走 I3C,不用上并行总线」

你想想看,以前用 I2C 时,一个总线上挂五六个设备,地址不够用还得加个 GPIO 做片选。用 SPI 呢,一条时钟、一条数据输出、一条数据输入,再加一根片选线,四个脚一个设备。主控的引脚很快就用完了。

I3C 就一根时钟一根数据,动态分配地址,带内中断,CRC 保证不出错。这不是降维打击是什么?

1.2 I3C vs I2C vs SPI:一张表看清楚

我刚开始用 I3C 时,也困惑过:到底什么时候该用 I3C ?什么时候用 I2C 或 SPI 就够了?

下面这张表是我自己整理的,项目选型时对着看,基本不会错。

对比项I3CI2CSPI
信号线数量2 根 (SCL, SDA)2 根 (SCL, SDA)3+N 根 (SCLK, MOSI, MISO, 每设备一根 CS)
最大速率12.5MHz (推挽) / 可达 30MHz+3.4MHz (高速模式)50MHz ~ 100MHz+
功耗低(推挽模式静态功耗低)中(开漏上拉电阻功耗大)高(常开时钟,线多寄生大)
中断方式带内中断(无需额外引脚)需外部中断引脚需外部中断引脚
地址分配动态地址分配固定地址(7位/10位)靠片选引脚区分
数据校验CRC 可选无无(需应用层处理)
多主功能支持多主仲裁支持多主仲裁单主(除特殊设计外)
向后兼容兼容 I2C 设备不兼容 I3C不兼容
典型应用sensor hub、摄像头、音频、电源管理低速 sensor、EEPROM、RTC闪存、LCD、高速 ADC/DAC

个人选型建议: 如果你做的是物联网设备、手机、平板、车载传感器集线器(Sensor Hub),我强烈建议你用 I3C。要是项目简单,只有一两个低速器件,I2C 也没问题。如果是大批量数据传输(比如刷屏、写 flash),那还是上 SPI 更稳妥。

1.3 I3C 协议栈概览

了解了 I3C 的特点和对比后,咱们看看它的协议栈长什么样。这部分对后面的 PCB Layout 很重要——你只有知道信号怎么传,才能知道怎么布线。

我画了一张协议栈的框架图,帮你理清层级关系。

I3C 协议栈框架 应用层 传感器数据流 / 摄像头配置 / 音频控制 / 电源管理命令 传输层 数据包封装 / 地址管理 / 命令码 (CCC) / 动态地址分配流程 链路层 帧格式 / 开始条件 / 停止条件 / 重复启动 / 仲裁机制 物理层 推挽 / 开漏模式 / 电平标准 (1.2V / 1.8V) / 上拉电阻选择 / 信号完整性 🔍 重点:动态地址分配发生在传输层,但信号质量受物理层布局影响最大。这就是本课程的核心。——后面布局布线时,物理层是你的战场。

从上到下,层层递进。应用层只管数据是什么;传输层管怎么发、发给谁;链路层管帧格式和仲裁;物理层管电平、驱动、线长、阻抗。

我为什么要画这个图?因为做 Layout 时,你主要跟物理层打交道。但如果你不理解上层协议,你可能不知道某些走线为什么必须等长、为什么有些组跳变沿要控制斜率。后面的实战章节,我会带着你一张图一张图地看。

1.4 动态地址分配:I3C 的灵魂

说了这么多,咱们得讲讲这个课程的主题——动态地址分配。

I2C 最让我头疼的一个问题:地址冲突。两个 sensor 用同一个厂家的芯片,地址重复,要么换芯片,要么加一片 GPIO 改地址,要么改 PCB 板子。怎么看都麻烦。

I3C 怎么解决的?主控上电后,发送一条 ENTDAA(进入动态地址分配)命令。挂在总线上的从设备,每个会返回自己唯一的 48 位临时 ID(由厂商制定)。主控收到后,依次给它们分配新的 7 位动态地址。

整个过程完全自动化,不需要你操心。

注意: 动态地址分配依赖于每个设备的 48 位临时 ID 是唯一的。如果两个设备用了相同的临时 ID(虽然厂商一般不会犯这种错),那仲裁时会出问题。我在项目里就遇到过山寨 sensor 的临时 ID 重复,多亏上电后地址分配失败,我排查了两天才发现是芯片的问题。后来我再也不敢用非正规渠道的片子了。

1.5 我的第一点布局建议

这一章快结束了,我提前给你一个布局建议——只针对于 I3C 的物理层:

  1. SCL 和 SDA 必须走在一起,尽量等长。 尤其是在 10MHz 以上时,不等长会引入时序偏差,严重时导致采样错误。
  2. 上拉电阻要选对。 对于推挽模式,上拉电阻可以很大甚至不用(因为驱动强);但对于开漏模式,一般用 2.2kΩ ~ 10kΩ。具体值取决于总线上挂几个设备和走线长度。
  3. 远离高频噪声源。 比如 DC-DC 电感、RF 天线、高速时钟线。I3C 再快也是信号线,被干扰了照样出错。
  4. 注意总线电容。 每个设备都会贡献一些电容,加起来超过 50pF 就可能影响信号质量。我以前有个项目挂了 7 个设备,总电容超了,结果 10MHz 根本跑不动,后来换成了 5MHz 才稳定。

一个小技巧: 如果总线电容大,可以把上拉电阻改小一点,但同时功耗会升高。平衡点需要慢慢调。我的经验是:先按 4.7kΩ 上拉,跑一下仿真,再根据眼图结果调整。

好了,第一章就到这里。I3C 的定义、特点、对比、协议栈、动态地址分配的概念,你都了解了。接下来,我们要真正开始动手了——从原理图到 PCB,我会带你一步步走过每一个坑。