动态地址分配协议细节:START、地址、R/W、ACK/NAK
说实话,I3C 动态地址分配乍一看挺唬人的,各种时序和状态。但说白了,它的核心就是一套非常严谨的握手流程。只要把 START、地址、R/W 位和 ACK/NAK 这几个基石搞明白,排查故障就有方向了。
我个人习惯,在调试任何 I3C 设备前,都会先抓住主控发出的这串序列。
核心要点:动态地址分配的本质是 主机枚举从机 的过程。从机初始地址为 0x7E,主机通过特殊命令为其分配唯一的新地址。
2.1 START 条件:总线活动的发令枪
START 条件可不是随便拉低 SDA 就行。它有一个严格的时序要求:SCL 为高电平时,SDA 从高切换到低。
我遇到过最典型的坑是什么?工程师把 SCL 和 SDA 的上升沿搞反了。示波器上看起来有波形,但从机就是不响应。后来一查,是主控的 GPIO 配置有问题,SDA 下拉速度不够快,导致 START 条件不满足 I3C 的时序窗口。
- 正常时序:SDA 在 SCL 高电平时跳变,建立时间 tHD;STA 和保持时间 tSU;STA 必须满足。
- 常见故障:SDA 跳变发生在 SCL 低电平期间,从机无法识别。
- 我的建议:用逻辑分析仪抓一下 START 时刻 SCL 和 SDA 的相对位置。如果 SDA 下降沿离 SCL 上升沿太近,十有八九是时序违规。
我曾经碰到一个案例,主控芯片的 I3C 控制器内部有个 bug,在发送 START 前会误拉高 SDA,导致产生了一个「伪 START」信号。从机被这个假信号搞蒙了,地址分配根本没反应。解决办法是加了一个 10ns 的软件延迟,让总线稳定后再发真 START。
2.2 地址 + R/W 位:从机在听吗?
START 之后,主机发送 7 位地址加上 1 位 R/W 控制位。对于动态地址分配场景,主机发送的是广播地址 0x7E,R/W 位为 0(写操作)。
你想想看,这条总线上可能有多个从机都监听 0x7E。但没关系,协议规定只有那些还没有固定地址的从机才能响应。这个机制避免了混乱。
| 字段 | 长度 | 发送方 | 接收方 | 描述 |
|---|---|---|---|---|
| START | 1 bit | 主机 | 所有从机 | 表示传输开始 |
| 7-bit 地址 | 7 bits | 主机 | 目标从机 | 广播地址 0x7E 用于动态分配 |
| R/W 位 | 1 bit | 主机 | 所有从机 | 0 表示写,1 表示读 |
| ACK 阶段 | 1 bit | 从机 | 主机 | 拉低 SDA 表示确认 |
这里有个容易忽略的点:R/W 位决定了后续的数据流向。在地址分配阶段,主机发完地址后,需要读取从机发回的 48 位 UID(唯一标识符)。所以后面的数据阶段实际上是主机在读,但地址阶段还是写操作。
2.3 ACK/NAK:是接受还是拒绝?
ACK 机制是 I3C 可靠性的保障。当主机发送完 8 位数据(地址 + R/W)后,会释放 SDA 并产生第 9 个 SCL 时钟。从机在这个时钟周期内,如果拉低 SDA,就是 ACK;如果保持高电平,就是 NAK。
- ACK:从机拉低 SDA。表示「我收到地址了,我准备好参与后续流程」。
- NAK:从机不动作(或拉高 SDA)。表示「我不认识你」或「我现在不方便应答」。
大部分 I3C 从机在动态地址分配时,如果不响应广播地址,会产生 NAK。但注意!有些从机为了省电,在 NAK 后就直接进入低功耗模式,主机的下一个 START 可能都无法唤醒它。这时候必须发一个 RSTACT 动作重置总线状态。
在项目里我遇到过一次奇怪的现象:主机发了 0x7E 后,从机明明在线,却一直回复 NAK。查了三天,最后发现是从机的 I3C 配置寄存器里有个「响应广播地址」的位默认是 0,需要主板上电后先通过 GPIO 拉高使能。说白了,硬件没配好,软件怎么发都没用。
2.4 动态地址分配的完整序列
现在我们把这三个阶段串起来,看看一个成功的动态地址分配瞬间是什么样的:
- 主机发起 START。
- 主机发送 0x7E + W。(0x7E 左移一位,加上写位,就是 0xFC)
- 从机回复 ACK。(拉低 SDA)
- 主机发送 Enter Dynamic Address Assignment(ENTDAA)命令。(具体命令码由协议定义)
- 总线进入数据读取阶段, 从机开始发送 48 位 UID。
在调试时,第一步就是确认第 2 步和第 3 步是否执行正确。你会发现,很多故障归根结底都是 ACK/NAK 出了问题。
每次拿到一个新板子,我不会先跑完整分配流程。而是只发一个 0x7E + W,然后用示波器或分析仪盯着第 9 个 SCL 时钟。如果看到拉低的 SDA,说明物理层通、从机识别到广播地址了。这一步能排除 50% 以上的硬件问题。
2.5 实际调试中的信号捕捉要点
我习惯用逻辑分析仪设触发条件为:SDA 出现 START 条件时触发。 然后对比捕获到的时序是否与协议规范一致。
- SDA 下降沿→SCL 时钟起始: 检查建立时间。太短会导致从机漏检。
- 地址字节后的第 9 个 SCL: 看是从机拉低还是保持高。这是区分 ACK 和 NAK 的唯一方法。
- 如果有多个 ACK: 恭喜,你捕获到了一次成功的握手。
嗯,到这里其实已经掌握了动态地址分配最基础的信号流。剩下的就是通过波形反推,找到具体的故障点。