SDR模式帧格式:I3C通信的基本单元

很多工程师拿到I3C波形时,第一反应是直接看数据。但我觉得,读懂帧结构才是基本功。帧格式就像一封信的格式,你总得知道哪里是信封、哪里是正文、哪里是签名吧?我们这章就来拆解一下SDR模式下的帧格式。

SDR,全称Single Data Rate,是I3C最基础的数据传输模式。说白了,每个SCL时钟周期只传1bit数据。虽然它速率不算最高,但所有地址分配、配置读写都跑在这个模式上。所以要是这步没吃透,后面排查地址分配失败基本无从下手。

SDR模式帧结构分析 SDR模式帧结构分解 SDR帧格式(从START到ACK/NACK) START SSC T-bit 数据字节 奇偶校验 ACK / NACK 关键说明 START和STOP必选,其余字段根据传输类型可选。地址分配帧中T-bit用于区分广播与定向地址。 各字段属性速查 START SSC T-bit ACK/NACK SCL高沿SDA下降 慢速从机适配 0=广播/1=定向 从机应答 必选字段 可选字段 地址帧必选 每字节后出现 1个SCL宽度 1个SCL宽度 地址字节的第1位 第9个SCL周期 唯一极性 低电平延长 由主机驱动 SDA释放/拉低 必须干净 非必须不用加 读地址帧必须对 关键排查点

START条件:总线交给你了

START条件是一个清晰的电平跳变。SCL在高电平时,SDA从高电平切换到低电平。这个信号由主机发出,告诉所有从机:“总线我占用了,准备接收命令。”

我个人习惯在逻辑分析仪上把START触发配置为SDA下降沿。这样每次抓包都从总线活动开始,不会漏帧头。我记得刚开始调I3C的时候,有一次波形里的SDA跳变特别缓,几乎像斜坡。逻辑分析仪死活不认那个START,后来才发现是SDA的上拉电阻太大,边沿时间超标。

注意: START条件必须满足时序要求。SCL高电平宽度、SDA下降时间等参数在I3C规范中有明确规定。如果边沿过缓,从机可能无法正确识别,导致整个帧被忽略。

我曾经被一个START条件坑过——明明波形用肉眼看着没问题,可从机就是不响应。查了三天,最后发现是SDA线上的电容太大,下降沿被拉成了接近1微秒。换了更强的驱动之后问题立刻消失。嗯,所以排查地址分配问题时,先看看START的边沿质量。

SSC:老设备的低速通道

SSC的全称是Slow Speed Change。说白了,它就是主机给总线上的老设备或慢速设备开的一个“后门”。SSC不是每个帧都必须有,它是可选的。但一旦用了,所有设备都必须理解它。

SSC信号表现为在SCL高电平时SCL被拉低一段时间。它的宽度决定了后续数据传输的速率。怎么理解?你看啊,如果总线上一半设备只支持1MHz,另一半支持12.5MHz,主机总不能为慢设备重发整个帧吧?

核心概念: SSC只在首字节之后插入,用于降低之后数据传输的速率。老设备看到SSC信号后,就知道“ok,这段往后我慢慢读”。

我建议做地址分配的时候尽量先不用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并不参与地址比较。它的作用纯粹是告诉从机“这个帧是不是针对你的”。有人可能会说,这设计是不是有点冗余?其实不然。广播地址的存在让主机能同时命令所有从机,这在总线管理和热连接场景里非常有用。

实操建议: 分析波形时,优先标记出T-bit的状态。如果T-bit=0但只有个别从机响应,那要么是从机自身有问题,要么是总线竞争导致信号被破坏。如果T-bit=1但所有从机都没响应,那就是地址配置完全不对。

ACK/NACK:一次握手定成败

主机发送完一个字节后,会在第九个SCL周期释放SDA。如果从机正常接收数据,它会把SDA拉低一个SCL时钟,这就是ACK。如果从机因为某种原因没能正确接收数据,它会让SDA保持高电平——这就是NACK。

地址分配的时候,从机应答ACK表示它收到了分配请求,并且愿意接受这个地址。如果从机回复NACK,通常是这几个原因之一:

  • 从机自身还在忙(比如正在处理上电初始化)
  • 从机不支持该地址范围
  • 总线误码导致从机识别到的地址与实际不符
  • 从机已经被分配了地址,拒绝重复分配

我常用ACK/NACK状态来判断地址分配是否成功。说白了,只要看到从机在地址字节后给了ACK,那就可以放大半的心了。剩下的就要检查校验位、SSC和后续的数据字段。

避坑指南: 我曾经就踩过这个坑——从机在地址分配时一直返回NACK。我查了半天逻辑分析仪波形,发现地址字节完全正确。后来用示波器一量,发现从机VDD还没稳定。它根本还在上电,CPU都没跑起来,拿什么回复ACK?所以排查时要确认从机电源时序没问题。

帧格式的整体串联

好了,我们把上面这些元素串起来:一个典型的SDR模式帧从START条件开始,然后是地址字节(其中第一个bit是T-bit),接着是数据字节,最后是STOP条件。每个字节后面都跟一bit的ACK/NACK。

所以抓波形时,我建议按这个顺序检查:

  1. START条件是否存在,边沿质量如何
  2. SSC是否意外出现(或是否意外缺失)
  3. T-bit是否与帧类型匹配(广播/定向)
  4. 地址字节内容是否正确
  5. ACK/NACK是否如预期出现

每一个环节都可能成为地址分配失败的根源。学会读懂帧结构,就等于拿了一把精准的刀子,可以一刀刀切到问题的核心。后面排查地址分配案例时,你会发现这个基本功有多值钱。