动态地址分配协议:START、地址字节、命令结构
动态地址分配,说白了,就是给挂在总线上的设备发一个“身份证”。I3C 总线上可能挂着好几个设备,主设备得知道谁是谁,才能精准地跟它们说话。
我个人习惯,在调试动态地址分配时,会紧盯着 START 条件、地址字节和命令结构这三个东西。顺序搞错一个,整个分配流程就会乱套。今天我们就来细看这部分。
1. START 条件:一切通信的开始
START 条件,就是主设备告诉所有从设备:“注意了,我要开始发数据了。” 在 I3C 总线上,这个信号跟在 I2C 里类似,但时序要求更严。
- 电平变化:SCL 在高电平时,SDA 从高电平跳变为低电平。
- 时序要求:SCL 高电平的保持时间(tHIGH)要够长,否则从设备可能识别不到。
- 避坑:我曾经遇到过一块从设备死活不响应,最后发现 START 建立时间(tSU;STA)差了十几纳秒。嗯,这里要注意,跟 I2C 比,I3C 的时序窗口更窄。
我的小技巧:测量 START 条件时,用示波器同时抓 SCL 和 SDA,触发条件设为 SDA 的下降沿,这样能一次性看清时序。
2. 地址字节:设备的“身份证编号”
START 结束后,主设备会发送地址字节。这个字节包含 7 位从设备地址和 1 位读写位。但在动态地址分配中,这个地址字节有特殊含义。
- 7 位地址:主设备用“0x7E”(即 1111110)作为动态地址分配的广播地址。
- 读写位:地址分配时,读写位是“0”(写操作)。
- 从设备回应:收到广播地址的从设备,会在第 9 个时钟周期拉低 SDA 作为 ACK。
- 避坑:我建议,发送地址字节前,最好再次确认主设备的 SDA 驱动是否已释放。我之前碰到过一个案例,主设备在发送地址时 SDA 还在输出高电平,结果地址字节根本发不出去。
注意:地址字节必须是 8 位,不能多也不能少。示波器解码时,如果只看到 7 个时钟,那肯定有问题。
3. 命令结构:分配流程的“规则手册”
有了 START,有了地址,还得有命令结构,否则从设备不知道接下来要干什么。动态地址分配的核心命令是“ENTDAA”(Enter Dynamic Address Assignment)。
说白了,主设备发出这个命令,从设备就知道:“现在要给我分配新地址了。”
- 命令结构:主设备先发 START + 广播地址(0x7E),然后是 ENTDAA 命令码(0x01)。
- 从设备响应:从设备识别出 ENTDAA 后,就会开始发送自己的设备标识符,用于地址分配。
- 避坑:恩,这里要提醒一下,ENTDAA 命令码必须在广播地址后立即发送,中间不能插入任何 STOP 条件。我之前就因为这个疏忽,导致从设备一直卡在等待状态。
完整的命令结构示例(用文字表示):
START + 0x7E(W) + ACK + 0x01(ENTDAA) + ACK + 从设备标识符 + ...
4. 知识体系框架图
为了更直观地看明白整个流程,我画了下面的框架图。你会看到从 START 到地址分配完成的三个关键阶段。
5. 实际调试中需要注意的点
这段时序,说白了,就是一次“握手”过程。主设备主动发起,从设备被动响应。但一上信号线,很多问题就冒出来了。
- 示波器设置:用 4 通道示波器,同时看 SCL、SDA。触发条件设为 SDA 下降沿,可以稳住波形。
- 时序裕量:我建议,在设计时,把 tHIGH 和 tSU;STA 的时序裕量留大 20% 左右。你想想看,PCB 走线、温度变化都会影响实际信号。
- ACK 检查:如果发送地址字节后,SDA 在第 9 个时钟没有被拉低,别继续往下发了。那说明从设备没收到,或者地址错了。
一个小总结:START 是门铃,地址是敲门,命令是进门。三件事缺一不可,顺序也不能搞反。