关于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 ns | 400 ~ 480 ns | 525 ns | COMRESET/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左右。太短了容易误触发,太长了又会拖慢初始化流程。
| 参数 | 最小值 | 典型值 | 最大值 | 说明 |
|---|---|---|---|---|
| T2 | 320 ns | 480 ns | — | COMRESET到COMINIT之间的静默间隙 |
| T3 | — | 1 ~ 3 ms | 10 ms | COMRESET结束到COMINIT回复的最晚时间 |
| T4 | 525 ns | 525 ns | 525 ns | COMINIT有效检测窗口(固定) |
| T5 | 1 μs | 2 μs | — | 连续COMRESET之间的最小间隔 |
综合时序参数与链路初始化的关系
把这五个参数放在一起看,就能画出完整的时序锚点。COMRESET发出去(T1),等T2过去后,接收端开始计算T3窗口来回复COMINIT。主机端拿到COMINIT,在T4内完成对齐判定。如果这一轮失败了,至少要等T5才能再发下一轮COMRESET。
- 第一步:主机发COMRESET脉冲(T1宽度320~525ns)。
- 第二步:进入T2静默期(大于320ns),保证COMRESET信号与后续COMINIT不重叠。
- 第三步:设备回复COMINIT(T3窗口期内)。
- 第四步:主机在T4窗口(525ns)内对齐和识别COMINIT。
- 第五步:环路结束,等待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的每个细节应该都覆盖到了。这张时序图配合表格,基本可以当作你调试链路初始化时的速查卡。