一、物理层与时序核心差异
1. 输出驱动方式不同
| 特性 | I2C | I3C |
|---|---|---|
| SDA 驱动 | 纯开漏(OD),全程靠上拉电阻 | 开漏 + 推挽混合:地址 / ACK 阶段开漏,数据阶段推挽 |
| SCL 驱动 | 主设备推挽,从设备可拉低(时钟拉伸) | 主设备推挽,从设备仅在开漏阶段可拉低 |
| 上升沿 | 慢,受 RC 充放电限制 | 快,推挽主动驱动上升沿 |
2. 地址阶段的时序差异
I2C 地址阶段(全程开漏):
SCL: ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐
SDA: [ A7 ][ A6 ][ A5 ][ A4 ][ A3 ][ A2 ][ A1 ][R/W][ACK]
开漏 开漏 开漏 开漏 开漏 开漏 开漏 开漏 开漏
- 9 个时钟(7 位地址 + R/W + ACK),全部开漏
- 从设备在第 9 个时钟拉低 SDA 表示 ACK
I3C 地址阶段(开漏 + 推挽切换):
SCL: ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐
SDA: [ A7 ][ A6 ][ A5 ][ A4 ][ A3 ][ A2 ][ A1 ][R/W][ACK]
开漏 开漏 开漏 开漏 开漏 开漏 开漏 开漏 开漏
↑ 前7位地址阶段保持开漏,用于仲裁和兼容I2C从设备
- 地址阶段仍然是开漏(为了总线仲裁和兼容 I2C 设备)
- 但地址 ACK 之后 ,如果是 I3C 从设备响应,SDA 切换到推挽传输数据
3. ACK 阶段的关键差异
| 特性 | I2C | I3C |
|---|---|---|
| ACK 由谁发 | 接收方(从设备或主设备) | 接收方,但有奇偶校验位 |
| 第 9 位 | ACK/NACK | ACK/NACK |
| 第 10 位 | 无 | 奇偶校验位(PAR),发送方驱动 |
| 第 11 位 | 无 | ACK 校验位(ACK-Checksum),接收方回应 |
| I3C 在每个字节后多了两位: |
I2C: [8位数据] → [ACK] → 下一字节
I3C: [8位数据] → [ACK] → [PAR] → [T-Bit/ACK-Checksum] → 下一字节
- PAR:发送方计算的奇偶校验位(偶数校验)
- T-Bit:接收方对 PAR 的回应(0 = 校验通过,1 = 校验失败)
这让 I3C 有了链路层错误检测 ,I2C 完全没有。
注意PAR和T-Bit不是每个阶段一定会有,它俩成对出现:
①SDR 数据阶段必须有
I3C SDR 模式下,每个数据字节的完整格式固定为 11 位:
[8位数据] → [ACK] → [PAR] → [T-Bit]
发送方 接收方 发送方 接收方
| 位 | 名称 | 谁驱动 | 作用 | 必须? |
|---|---|---|---|---|
| bit 0-7 | 数据 | 发送方 | 有效数据 | 是 |
| bit 8 | ACK | 接收方 | 应答 / 非应答 | 是 |
| bit 9 | PAR | 发送方 | 对「数据 + ACK」做偶校验 | 是 |
| bit 10 | T-Bit | 接收方 | 回应 PAR 校验是否通过 | 是 |
PAR 的计算范围是**前面 9 位(8 位数据 + ACK)**的偶校验:
- 9 位里
1的个数为偶数 → PAR = 0 - 9 位里
1的个数为奇数 → PAR = 1
接收方收到后自己算一遍奇偶,和 PAR 对比:
- 一致 → T-Bit 拉低(0),表示继续
- 不一致 → T-Bit 拉高(1),表示校验失败,主设备应终止或重试
②地址阶段没有PAR
地址字节只有 9 位,和 I2C 完全一样:
[7位地址] → [R/W] → [ACK]
地址阶段故意保持开漏、不加 PAR/T-Bit,原因是:
- 兼容总线上的 I2C 从设备(I2C 设备不认 PAR)
- 支持总线仲裁(多个主设备竞争时需要开漏线与)
所以抓波形时,地址后面看不到 PAR 是正常的,数据后面看不到才有问题。
③HDR 模式:不用 PAR,改用 CRC
I3C 进入 HDR(高速)模式后,帧格式完全不同:
- 不用 PAR + T-Bit
- 改用 16 位 CRC 校验整个数据块
- 校验能力更强(能检错,不只是奇偶)
4. 和 I2C 从设备通信:没有 PAR和T-Bit
I3C 总线可以挂 I2C 从设备。当主设备和 I2C 设备通信时:
- 主设备知道它是 I2C 设备(通过 DCR 或静态配置)
- 自动切换到纯 I2C 格式,不加 PAR/T-Bit
- 速率也限制在 400kHz 以下
5. 特定 CCC 命令:格式可能有例外
少数 CCC 命令有特殊时序,比如:
- ENTDAA(动态地址分配):有专属的 48-bit ID 传输格式,不按普通数据字节走
- 广播 CCC 写:多个从设备同时响应时,T-Bit 的行为是线与结果,不是单个设备的回应
但这些都是特殊场景,普通的读写温感数据走标准 SDR 格式。
4. START / STOP / Sr 的差异
| 信号 | I2C | I3C |
|---|---|---|
| START (S) | SCL 高时 SDA 下降沿 | 相同,但有专用 START 信号 |
| STOP § | SCL 高时 SDA 上升沿 | 相同 |
| 重复起始 (Sr) | SCL 高时 SDA 下降沿(和 START 一样) | 相同,但 Sr 后必须重新发地址 |
| 总线空闲 | SDA/SCL 都高 | 相同,但 I3C 有总线可用条件的更严格定义 |
时序波形上看起来一样,但 I3C 对时间参数的定义更精确,且 Sr 之后的地址阶段规则不同(I3C 可以在 Sr 后切换到 HDR 模式)。
5. 数据传输阶段
I2C(全程开漏):
每个字节:8位数据(MSB先)+ ACK
速率受限于上拉电阻和总线电容
I3C SDR 模式(地址后推挽):
地址阶段(开漏)→ ACK → 数据阶段(推挽)→ ACK → PAR → T-Bit
数据阶段 SCL 可以跑到 12.5MHz
I3C HDR 模式(可选高速模式):
HDR-Exit 命令进入 → 双倍数据率(DDR,SCL上下沿都传数据)
速率可达 25+ Mbps
HDR-Exit 命令退出 → 回到 SDR
I2C 完全没有 HDR 模式。
二、I3C 特有的时序机制
1. 动态地址分配(ENTDAA)------ I3C 独有的时序
这是 I3C 最复杂的时序,I2C 完全没有:
主设备发广播 CCC "ENTDAA" (0x7E写 + 0x01)
→ 所有 I3C 从设备进入地址分配模式
→ 主设备发 START + 0x7E写(保留地址7'h7E用于分配)
→ 从设备按 ID 优先级竞争,逐个发送 48-bit Provisional ID
→ 主设备分配 7位动态地址给每个从设备
→ 分配完成,从设备用新地址通信
整个过程涉及多轮 START/Sr/STOP,是 I3C 初始化时独有的时序。
2. 中断(In-Band Interrupt)------ I3C 独有的时序
I2C 从设备不能主动发起通信,必须靠额外的中断引脚。
I3C 从设备可以在总线空闲时主动拉低 SDA 发起中断:
总线空闲(SDA=1, SCL=1)
→ 从设备拉低 SDA(产生类似 START 的信号)
→ 主设备检测到,发起 START + 该从设备地址(读)
→ 从设备返回中断原因
这在时序上是从设备发起的 START,I2C 不可能做到。
3. 多主仲裁
I2C 也有多主仲裁(SDA 开漏,线与),但 I3C 的仲裁更完善:
- 主设备有主设备优先级
- 支持主设备切换(Master Hand-off)
- 仲裁失败的主设备能收到通知
三、I3C 不是每次通信都要用 0x7E 广播地址
0x7E 只在发送 CCC 通用命令 时使用,普通的读写单个从设备用的是该设备的动态地址。
0x7E 的使用场景
| 场景 | 用 0x7E 吗? | 说明 |
|---|---|---|
| 发送广播 CCC(所有从设备都收) | 用 | 如 RSTDAA、DISEC、SETMWL 等 |
| 发送定向 CCC(只给一个从设备) | 不用 | 用从设备的动态地址 + CCC 命令 |
| 普通读单个从设备数据 | 不用 | 直接用动态地址读 |
| 普通写单个从设备数据 | 不用 | 直接用动态地址写 |
| 动态地址分配(ENTDAA) | 用 | 必须用广播地址发起 |
| 从设备发起中断后响应 | 不用 | 主设备直接读中断从设备的地址 |
两种 CCC 模式的时序对比
广播 CCC(用 0x7E):
START → 0x7E(写) → ACK → CCC命令码 → ACK → [参数] → Sr/STOP
↑ 广播地址,所有从设备都监听
定向 CCC(不用 0x7E):
START → 从机动态地址(写) → ACK → CCC命令码 → ACK → [参数] → Sr/STOP
↑ 只有目标从设备响应