【I3C路书-2】动态地址分配波形
Talk is cheap. 我们直接来看一下 I3C Controller 如何实现动态地址分配。
图中C2: SCL, C3: SDA
看起来着实有点抽象,我们先用简图理解一下动态地址分配都需要经过哪些步骤,再结合实测波形逐个击破。
广播:“Pay attention please,Controller要说话了,各单位注意接听”。
RSTDAA:“现在大家的户口都注销了,一夜回到解放前了哈。”
ENTDAA:“现在Controller会重新给大家分发身份,先到先得哈。”
Target:“我我我,我有一个梦想。”
Controller:“要得,你就叫007吧。”
Target:“Good,我喜欢这个名字,以后我就叫007了。”
Controller:“还有其他牛马么?没人说话?ok,那就酱了,散会。”
PS: 如果不RSTDAA,已有动态地址的设备将不再响应ENTDAA,只为新加入的设备分配地址。
以上就实现了动态地址的分配,接下来只需要像I2C那样用刚才分配到的地址来读写数据就可以了。ok,我们按顺序来看一看。
“广播地址”:0b1111110即0x7E, 这里的地址与I2C一样,仅有七位;
“写”:第8位是“读/写”功能位。0代表写,1代表读。这个很好记忆,0=Output, 1=Input。
“ACK”:第9位代表“ACK/NACK”位,用来表示从机是否响应。
“CCC:0x06”: 0x06对应的是RSTDAA(Reset Dynamic Address Assignment) 复位/清除 已有的动态地址。
“校验位”:这里既不是“读/写”位,也不是“ACK”位,而是I3C新引入的校验机制,采用的是奇校验,即:
数据中1的个数为偶数,校验位写1
数据中1的个数为奇数,校验位写0
如果简洁一点描述:
校验位=XOR(Data[7:0], 1)
还是不好理解?那看通俗版:
奇校验=用 校验位 来凑奇数个1
比如上面的0x06=0b00000110 里面有偶数个1,就需要校验位的1来凑奇数。举一反一,如果CCC是0x07=0b00000111,就不需要校验位来凑奇数个1,因此校验位就是0了。
为什么上面又写了0x7E? 因为写了CCC:0x06后,从机是不会有响应的,所以这里直接写下一个CCC:0x07就是了。——对,写CCC前就需要先写广播指令:0x7E, pay attention please. 然后紧跟一个校验位0,上面已经详细说明了。
0x07: 即ENTDAA。(Enter Dynamic Address Assignment)
前面我们复位了总线上的所有动态地址,现在我们开始重新分配动态地址,这很好理解,对吧。紧接着再写一次 0x7E, 从机们就可以凭本事来获取动态地址了。某一个从机反应最快,率先拉低了SDA,获得优先分配权。不过大家也不能一直等,因此该从机以最快速度发出自己的PID,以进行下一步流程。
主机接收到从机发来的PID信息后,就根据自己的分配策略,将地址list中的0x0D分配给了从机。从机拉低SDA回ACK,表明接受地址。紧接着,主机又发送了0x7E,企图给其他从机分配地址,可是并没有响应,事实上这里我们只挂载了一个从机。既然没其他从机了,主机发送Stop结束了动态地址分配的流程。下面是Specification for I3C BasicSM 中的说明:
ok,有了实测波形,对照着SPEC,理解起来棒棒哒!
注:本文内容基于个人理解整理,如有疏漏或错误之处,欢迎在评论区留言指正,共同探讨 I3C 的技术细节。
公粽号:HardwareABC
