关于OOB信号的时序参数 T1~T5

讲完了COMRESET和COMINIT的基本握手流程,咱们现在得把目光聚焦到那些“看不见摸不着”、但一错就翻车的时序参数上。SATA协议规定了几组关键的时间窗口,分别是T1、T2、T3、T4、T5。这些参数决定了链路在初始化阶段的每个动作,从“发脉冲”到“等响应”,再到“切速率”,都必须卡在特定的时间范围内。

我早年在一款硬盘控制器项目上吃过T1的亏。当时自测环境一直通过,结果送到客户那边,设备死活不认盘。查了一周才发现,是RTT(往返时间)估算偏大,COMRESET发出去后,主控在T1超时前没等到COMINIT,直接判定链路不通。说白了,时序参数调不对,链路就起不来。

T1:COMRESET脉冲宽度与检测窗口

T1是COMRESET信号在发送端持续的时间。协议规定,这个突发脉冲必须持续至少320 ns,但不超过525 ns。太短了,接收端可能误认为是普通毛刺;太长了,又可能被接收端当作其他信号。

你想想看,一颗6 Gbps的链路,一个UI(单位间隔)才160 ps左右。320 ns相当于2000个UI的宽度,设计师不能简单用“延时几拍”来凑数,通常需要借助内部计时器或状态机来精确控制。

参数最小值典型值最大值说明
T1 (脉宽)320 ns400 ~ 480 ns525 nsCOMRESET/COMINIT突发脉冲宽度
T1 (检测)2 x T1脉宽——接收端必须能在2倍脉宽内识别到OOB信号

实战提示:我个人习惯在COMRESET发射端留一个可编程的寄存器,用来微调T1宽度。试产阶段把这个值设在450 ns左右,留足安全边际。遇到不同厂家硬盘,T1检测灵敏度差异还挺大的。

T2 与 T3:COMRESET与COMINIT间的死区

T2是COMRESET脉冲结束,到开始等待COMINIT之间的静默期。协议要求这个间隔必须大于320 ns,但一般建议做到1 μs左右。

T3则是从COMRESET结束到成功检测到COMINIT之间的最大允许时间。这个参数有点意思——它是不可超时的最大值。意思是接收端必须在T3窗口内回复,否则发送端就认定链路连接失败。

  • T2 静默期:大于320 ns,典型设计留480 ns ~ 1 μs。
  • T3 响应窗口:最大值10 ms,实际环境中大部分设备在1 ~ 3 ms内回复。

我曾经碰过一个坑:某个固态硬盘在低温环境下T3响应时间飙到了8 ms,而主控端T3超时设在了5 ms。结果就是常温一切正常,一进冷箱就掉盘。所以我对T3的建议是:设计时做到10 ms阈值,但测试时也要压低到7 ms看看系统扛不扛得住。

T4:COMINIT的同步对齐窗口

T4是主机端收到COMINIT后,用于对齐和确认COMINIT信号有效的时间窗口。这个窗口长度定义为525 ns,也就是说检测到COMINIT脉冲后,要在525 ns内判定脉冲是否完整、是否满足OOB识别条件。

这里有件事你得注意:T4窗口的计算起点是从COMINIT的上升沿还是下降沿?协议其实没有强制要求。我一般讲课时会跟学员说:“看你的边缘检测逻辑设计,我用的是上升沿触发计数器,这样省一个边沿判断。”实际验证时两种方式都可以,但别混用。

关键参数总结: T4 = 525 ns 固定窗口(检测窗口),不是可配的。

T5:COMRESET与COMINIT的复位间隔

T5定义的是从一次COMRESET结束到下一次COMRESET开始之间的间隔。这个参数的主要作用是防止链路因为噪声或异常反复触发复位。

协议规定T5最小值为1 μs。我一般设计到2 μs左右。太短了容易误触发,太长了又会拖慢初始化流程。

参数最小值典型值最大值说明
T2320 ns480 ns—COMRESET到COMINIT之间的静默间隙
T3—1 ~ 3 ms10 msCOMRESET结束到COMINIT回复的最晚时间
T4525 ns525 ns525 nsCOMINIT有效检测窗口(固定)
T51 μs2 μs—连续COMRESET之间的最小间隔
OOB信号时序参数(T1~T5)关系图 COMRESET T1=320~525ns COMINIT T1=320~525ns T2 >320ns T3 ≤10ms T4=525ns检测窗口 T5 ≥1μs 时序参数说明 T1: OOB脉冲宽度 T2: 脉冲间静默期 T3: 响应最大等待时间 T4: COMINIT检测窗口 T5: 连续复位间隔

综合时序参数与链路初始化的关系

把这五个参数放在一起看,就能画出完整的时序锚点。COMRESET发出去(T1),等T2过去后,接收端开始计算T3窗口来回复COMINIT。主机端拿到COMINIT,在T4内完成对齐判定。如果这一轮失败了,至少要等T5才能再发下一轮COMRESET。

  1. 第一步:主机发COMRESET脉冲(T1宽度320~525ns)。
  2. 第二步:进入T2静默期(大于320ns),保证COMRESET信号与后续COMINIT不重叠。
  3. 第三步:设备回复COMINIT(T3窗口期内)。
  4. 第四步:主机在T4窗口(525ns)内对齐和识别COMINIT。
  5. 第五步:环路结束,等待T5后再尝试下一轮复位。

特别注意: T4窗口是固定525 ns,而不是很多设计师以为的“配多大都行”。如果你在检测逻辑里用了一个自由跑计数器,当计数器溢出时间不等于525 ns时,实际是改变了对COMINIT信号的容忍度,可能导致误判或漏判。

实战中如何确保T1~T5不出错?

硬件工程师最关心的事无非是“给我一个能抄的配置表”。我个人习惯在PHY层的寄存器配置里列出一份专门的时序矩阵。

// 典型时序寄存器配置示例(伪代码)
// PHY层OOB时序寄存器基地址 0x3C
Reg0x3C[7:0] = T1_CNT    // 设为450 (450ns @ 1ns/step)
Reg0x3D[7:0] = T2_CNT    // 设为480 (480ns)
Reg0x3E[15:0] = T3_CNT   // 设为1000000 (1ms @ 1ns/step)
Reg0x3F[7:0] = T4_CNT    // 固定525 (525ns)
Reg0x40[7:0] = T5_CNT    // 设为2000 (2μs)

当然,上面仅仅是单组示例。遇到多端口SATA控制器,每个端口的物理走线长度不同,寄生电容和RTT也会有差异。我就见过某个8端口SATA扩展器,最远的两个端口T3响应时间差了几乎2倍。这种情况下,最好的做法是对每个PHY独立配置时序参数,而不是共用一套默认值。

嗯,聊到这里,T1~T5的每个细节应该都覆盖到了。这张时序图配合表格,基本可以当作你调试链路初始化时的速查卡。