I3C 接口(MIPI):动态地址、CCC、in-band 中断与 I2C 兼容
更新时间:2026-09-19。前置:I2C 主机设计、I2C EEPROM 页写。I3C(Improved Inter-Integrated Circuit)由 MIPI 联盟定义,目标是在同一套两线上替代 I2C 并补上面向传感器的短板。
本文要回答的问题
- I3C 比 I2C 快在哪,为什么还能后向兼容老 I2C 设备?
- 动态地址分配(DAA/ENTDAA)怎么消除引脚地址冲突?
- 没有独立中断脚时,从设备怎么用带内中断(IBI)通知主机?
- 控制器状态机和混合总线(I3C+I2C)有哪些坑?
一、I3C vs I2C 概览
| 维度 | I2C | I3C |
|---|---|---|
| 时钟/数据 | SCL/SDA 全程开漏+上拉 | 地址/仲裁仍开漏,数据阶段切推挽,速率高 |
| 典型速率 | 100k/400k/1M/5M | SDR ~12.5MHz,HDR-DDR/TSP/TSL 更高 |
| 地址 | 7/10 位,静态(引脚/熔丝) | 64 个动态地址,上电自动分配,可保留静态 |
| 中断 | 需额外 INT 引脚 | IBI 带内中断,从机主动拉 SDA 请求 |
| 事件 | 主机轮询 | 热接入 hot-join、控制器请求 |
| 功耗 | 上拉充放电大 | 推挽+可控制上拉,省电 |
关键机制:总线空闲/仲裁/地址阶段保持 I2C 式开漏线与以支持多主仲裁和兼容;一旦主从确定、进入数据传输,切换为推挽驱动,免除上拉 RC 慢沿,因此能跑到 12.5MHz。时钟可由控制器停止(时钟暂停)做节能/流控。
二、动态地址分配 ENTDAA
I2C 每颗同类传感器要靠 A0/A1 引脚或不同地址避免冲突;I3C 主设备上电后通过枚举分配唯一动态地址:
1. 主机发 CCC 命令 ENTDAA(Enter Dynamic Address Assignment)
2. 每个 I3C 从机驱动其 48 位唯一 ID(PID:厂商ID+部件ID+实例),按线与仲裁
3. 仲裁出的最低 PID 设备先被选中,主机分配一个 7 位动态地址
4. 重复直到所有 I3C 设备都拿到地址PID 保证物理唯一性,仲裁天然排出顺序,省掉地址引脚。老 I2C 设备用静态地址(SETDASA 可把某静态地址绑定为动态地址),主机在混合总线上记录哪些地址是 I2C legacy(这些段必须降速、开漏)。
三、CCC 通用命令
CCC(Common Command Codes)是 I3C 定义的标准化广播/直选命令集,主机用统一码做总线管理,例如:
ENTDAA/SETDASA:动态地址分配;SETNEWDA:改地址。ENEC/DISEC:使能/禁止事件(IBI、热接入等)。MWL/MRL:设最大写/读长度。SETMWL/GETSTATUS/GETBCR:状态、总线特性寄存器。- 广播(所有从机)或直选(指定动态地址)两类。
设备私有寄存器读写仍走普通私有写/读传输,但传输头里用动态地址+命令位,比 I2C 少一个起始周期。
四、IBI 带内中断与热接入
I2C 从机要发事件只能靠额外中断脚或被轮询。I3C 从机可在总线空闲时发起 IBI(In-Band Interrupt):拉低 SDA 产生 START 样式并送上自己的动态地址,主机仲裁识别后决定是否 ACK 并响应(可附带 IBI 数据)。这让一根中断线都不用。Hot-Join 允许设备运行中插入后请求分配地址;控制器还支持 controller role 请求(主角色转移)。
空闲总线 ─ 从机拉 SDA(START) ─ 发自身动态地址 ─ 主机 ACK ─ 可选 IBI payload五、控制器实现要点
- 开漏/推挽输出驱动需可切换(OD for START/地址/仲裁,PP for 数据)。
- 速率/模式状态:I2C legacy 段按 ≤FM+ 开漏,I3C SDR 推挽,HDR-DDR 双沿。
- 维护动态地址表、PID 表、每设备能力(BCR/DCR)、待处理 IBI 队列。
- 上拉:I3C 定义可控上拉/开漏切换,硬件不能只放传统强上拉,否则推挽阶段浪费电甚至冲突。
六、常见的坑
- 混用强上拉:I3C 推挽阶段传统 I2C 上拉造成额外功耗/电平问题,需按规范用弱/可控上拉。
- 把 I3C 从机当 I2C 轮询:没做 ENTDAA、设备无静态地址,主机找不到。
- 混合总线不分 legacy 段:对老 I2C 设备用 I3C 推挽/高速,直接不识别或冲突。
- IBI 未使能(ENEC)就等事件:DISEC 后从机请求被忽略。
- 动态地址变化后缓存旧地址:重新枚举后地址变,私有访问打空。
- PID 仲裁理解错:多设备同时 IBI/DAA 靠线与,硬件必须支持开漏仲裁与逐位比较。
- 时钟暂停未处理:从机不支持时钟延长却被主机停 SCL,状态错乱。
- 电压/电平混用:I3C 与老 I2C 设备 VIO 不同需电平转换。
- HDR 模式无设备支持却进入:需先经 CCC 协商能力,盲进 DDR/TSP 死总线。
- 热接入抖动:hot-join 去抖未做,反复触发重枚举。
- 地址 0/保留地址误用:动态地址范围受限,分配器须避开保留值。
相关与延伸
开漏线与、时钟拉伸、多主仲裁基础见 I2C 主机;存储型从机见 I2C EEPROM;引脚复用见 PinMux。
总结
I3C 在保留两线与 I2C 兼容(地址/仲裁仍开漏)的基础上,数据阶段切推挽跑到 12.5MHz SDR,并用电上电 ENTDAA 基于 48 位唯一 PID 仲裁自动分配 7 位动态地址、用 CCC 通用命令做总线管理、用 IBI 让从机无需中断脚即可请求、用 hot-join 支持热插入;混合总线上必须为 legacy I2C 段降速开漏并处理可控上拉——上拉、漏做 DAA、IBI 未使能和盲进 HDR 是四大坑。