第3章 I3C时序参数概览:核心时序参数定义
做I3C调试,手里得有张「时序参数地图」。否则信号跳变沿在你眼前晃,你也说不清它是对是错。今天我就把这几个核心参数掰开揉碎讲清楚。
3.1 为什么时序参数这么重要?
I3C是两线制总线——SCL(时钟)和SDA(数据)。所有设备都挂在上面。你想啊,一个主设备、好几个从设备,谁什么时候说话、什么时候闭嘴,全靠这些时序参数来约束。
我刚开始做I3C项目时,总觉得时序差不多就行了。结果有一次板子跑起来,从设备死活不响应。抓波形一看,tHD_DAT不够,从设备根本没采到正确的数据。从那以后,我再也不敢凭感觉配时序了。
3.2 核心时序参数全解析
I3C标准里定义了十几个时序参数,但日常调试中真正高频接触的是下面这6个。我按重要程度排了序。
| 参数 | 全称 | 简单理解 | 典型最小值 |
|---|---|---|---|
| tLOW | SCL低电平时间 | 时钟信号在低电平的保持时间 | 100 ns(普通模式) |
| tHIGH | SCL高电平时间 | 时钟信号在高电平的保持时间 | 100 ns(普通模式) |
| tHD_DAT | 数据保持时间 | SCL下降沿之后,SDA必须保持稳定的时间 | 0 ns(最小值) |
| tSU_DAT | 数据建立时间 | SCL上升沿之前,SDA必须提前稳定的时间 | 2 ns |
| tHD_STA | 起始条件保持时间 | SCL下降沿之后,SDA必须保持低的时间 | 60 ns |
| tSU_STO | 停止条件建立时间 | SCL上升沿之前,SDA必须提前拉高的时间 | 60 ns |
这里有个坑——你可能注意到tHD_DAT的最小值是0 ns。什么意思?SCL下降沿一落下,SDA理论上可以立刻变化。但实际上,线缆电容、驱动能力都会造成延迟。我曾经遇到过一个从设备对tHD_DAT要求很严格,必须≥5 ns,而主设备输出是0 ns。结果就是数据采样错误。怎么解决?加一条串联电阻或调整驱动强度。
3.3 时序参数之间的「跷跷板关系」
你想想看,tLOW和tHIGH加起来就是SCL周期,决定了总线速率。I3C支持动态切换速率:普通模式(SDR)最高12.5 MHz,高频模式(HDR)可以更高。
但速率上去后,tSU_DAT和tHD_DAT的窗口就变得很窄。我做过一个测试,把I3C从10 MHz提到11 MHz,结果tSU_DAT余量从3 ns掉到0.2 ns,几乎失效。所以,不是你配置的速率多高,而是实际波形能不能满足所有参数。
3.4 时序参数的测量方法
测量这些参数,我建议用示波器(至少500 MHz带宽,建议1 GHz以上)。抓取SCL和SDA的波形,打开测量光标,直接量时间差。
关键测量点:
- tLOW/tHIGH:量SCL波形从50%电平到50%电平的时间。
- tHD_DAT:从SCL下降沿(50%电平)到SDA开始变化(50%电平)。注意SDA可能变化在SCL下降沿之前还是之后,要分清。
- tSU_DAT:从SDA最后稳定到SCL上升沿(50%电平)的时间。
- tHD_STA/tSU_STO:测量起始和停止条件时,注意SCL和SDA的相对关系。
我认为最容易被忽视的是tHD_DAT的测量。很多工程师测出来是负数——这意味着SDA在SCL下降沿之前就变了,从设备采到的就是前一拍的数据。
3.5 I3C时序参数的知识体系
下面这张图把核心参数的关系梳理清楚了。你看,所有时序都围绕着SCL的跳变沿展开。数据建立时间(tSU_DAT)紧贴SCL上升沿之前,数据保持时间(tHD_DAT)紧贴SCL下降沿之后。起始和停止条件则发生在SCL高电平期间。
3.6 参数之间的换算关系
很多参数之间有数学关系。比如总线周期 T_SCL = tLOW + tHIGH。速率 f_SCL = 1 / T_SCL。
在普通模式下,I3C要求tLOW和tHIGH都≥100 ns,所以最大频率是 1/(200 ns) = 5 MHz?不对,实际可以达到12.5 MHz,因为高频模式可以压缩tLOW和tHIGH。但压缩的同时,tSU_DAT和tHD_DAT也会跟着变严。
3.7 常见时序问题的排查思路
最后分享几个实际项目里撞过的墙,也算是避坑指南:
- 问题:从设备响应时有时无。
排查:量tHD_DAT——发现主设备输出保持时间不够,从设备需要更长的数据保持。在SDA上加10 pF电容拉慢边沿,解决问题。 - 问题:偶发数据错误。
排查:量tSU_DAT——发现建立时间余量只有0.5 ns,接近时钟抖动。改用更高驱动电流的主设备输出,余量提升到2 ns,故障消失。 - 问题:起始条件无法被从设备识别。
排查:量tHD_STA——发现主设备在SCL下降后太快拉低SDA,不满足从设备的最小保持时间。调整I3C控制器寄存器里的时序参数。
嗯,核心参数就是这些。你把tLOW、tHIGH、tHD_DAT、tSU_DAT这四个先吃透,剩下的就好办了。下次调试时,记得把这篇内容当参考手册用。