SDR模式帧格式:I3C通信的基本单元
很多工程师拿到I3C波形时,第一反应是直接看数据。但我觉得,读懂帧结构才是基本功。帧格式就像一封信的格式,你总得知道哪里是信封、哪里是正文、哪里是签名吧?我们这章就来拆解一下SDR模式下的帧格式。
SDR,全称Single Data Rate,是I3C最基础的数据传输模式。说白了,每个SCL时钟周期只传1bit数据。虽然它速率不算最高,但所有地址分配、配置读写都跑在这个模式上。所以要是这步没吃透,后面排查地址分配失败基本无从下手。
START条件:总线交给你了
START条件是一个清晰的电平跳变。SCL在高电平时,SDA从高电平切换到低电平。这个信号由主机发出,告诉所有从机:“总线我占用了,准备接收命令。”
我个人习惯在逻辑分析仪上把START触发配置为SDA下降沿。这样每次抓包都从总线活动开始,不会漏帧头。我记得刚开始调I3C的时候,有一次波形里的SDA跳变特别缓,几乎像斜坡。逻辑分析仪死活不认那个START,后来才发现是SDA的上拉电阻太大,边沿时间超标。
我曾经被一个START条件坑过——明明波形用肉眼看着没问题,可从机就是不响应。查了三天,最后发现是SDA线上的电容太大,下降沿被拉成了接近1微秒。换了更强的驱动之后问题立刻消失。嗯,所以排查地址分配问题时,先看看START的边沿质量。
SSC:老设备的低速通道
SSC的全称是Slow Speed Change。说白了,它就是主机给总线上的老设备或慢速设备开的一个“后门”。SSC不是每个帧都必须有,它是可选的。但一旦用了,所有设备都必须理解它。
SSC信号表现为在SCL高电平时SCL被拉低一段时间。它的宽度决定了后续数据传输的速率。怎么理解?你看啊,如果总线上一半设备只支持1MHz,另一半支持12.5MHz,主机总不能为慢设备重发整个帧吧?
我建议做地址分配的时候尽量先不用SSC。把总线强制跑在较低频率(比如1MHz)完成地址分配和CCC命令,等所有从机都确认上线了,再切换高速模式。这样可以减少SSC引入的时序不确定性。
我记得有一个项目,从机里混了一颗十年前的老芯片。地址分配帧发出去后它老是不应,最后发现是SSC位置和宽度都不对。那老芯片的SSC容限很窄,差一点就识别不出来。你说这Bug查起来多恶心?
T-bit:区分广播还是定向
T-bit是地址字节的第一个bit(MSB)。它的定义很简单:T-bit = 0 表示广播地址,所有的从机都要响应;T-bit = 1 表示定向地址,只有地址匹配的那个从机才响应。
你想想看,在I3C里,地址分配的时候用的是定向地址还是广播地址?其实两种都有。但如果你在抓波形时看到T-bit搞反了——定向被当成了广播,或者反过来——那排查地址分配失败的时候就要多花不少时间。
我最初以为T-bit是地址的一部分。后来翻了I3C规范才发现,T-bit并不参与地址比较。它的作用纯粹是告诉从机“这个帧是不是针对你的”。有人可能会说,这设计是不是有点冗余?其实不然。广播地址的存在让主机能同时命令所有从机,这在总线管理和热连接场景里非常有用。
ACK/NACK:一次握手定成败
主机发送完一个字节后,会在第九个SCL周期释放SDA。如果从机正常接收数据,它会把SDA拉低一个SCL时钟,这就是ACK。如果从机因为某种原因没能正确接收数据,它会让SDA保持高电平——这就是NACK。
地址分配的时候,从机应答ACK表示它收到了分配请求,并且愿意接受这个地址。如果从机回复NACK,通常是这几个原因之一:
- 从机自身还在忙(比如正在处理上电初始化)
- 从机不支持该地址范围
- 总线误码导致从机识别到的地址与实际不符
- 从机已经被分配了地址,拒绝重复分配
我常用ACK/NACK状态来判断地址分配是否成功。说白了,只要看到从机在地址字节后给了ACK,那就可以放大半的心了。剩下的就要检查校验位、SSC和后续的数据字段。
帧格式的整体串联
好了,我们把上面这些元素串起来:一个典型的SDR模式帧从START条件开始,然后是地址字节(其中第一个bit是T-bit),接着是数据字节,最后是STOP条件。每个字节后面都跟一bit的ACK/NACK。
所以抓波形时,我建议按这个顺序检查:
- START条件是否存在,边沿质量如何
- SSC是否意外出现(或是否意外缺失)
- T-bit是否与帧类型匹配(广播/定向)
- 地址字节内容是否正确
- ACK/NACK是否如预期出现
每一个环节都可能成为地址分配失败的根源。学会读懂帧结构,就等于拿了一把精准的刀子,可以一刀刀切到问题的核心。后面排查地址分配案例时,你会发现这个基本功有多值钱。