SATA协议基础:三层架构归纳总结

做SATA兼容性测试,最怕的就是对协议一知半解。很多人测了半天,信号过不了或者设备不识别,其实根子都在协议理解上。我个人习惯把SATA协议拆成物理层、链路层、传输层来看。这三层各管一摊儿,但咬合得很紧。今天我们就捋一遍,你不能光知道有“三层”这个说法,还得知道每一层在测试中卡你脖子的点在哪。

1. 物理层(PHY Layer)—— 信号能“通”,靠它

物理层说白了就是信号的搬运工。它负责把比特流变成电信号,跑过线缆和连接器,再在接收端还原回来。你想想看,如果这一层就塌了,上层再完美的协议也没用。

核心知识点:

  • 差分信号:SATA用两对差分线(Tx+/-、Rx+/-),抗共模干扰能力比单端强很多。我在项目里遇到过好几次,用户自己做的SATA线缆交叉拧在一起,结果眼图全糊了……嗯,差分对必须等长、紧耦合,这个没商量。
  • 信号速率:一代(1.5 Gbps)、二代(3.0 Gbps)、三代(6.0 Gbps)。当你调试三代速率不稳定时,我建议先降回二代看看物理层是否残废——这是排查问题的惯用手段。
  • OOB(带外)信号:这是物理层最容易被忽略的点。COMRESET、COMINIT、COMWAKE,三个信号搞不定,链路根本建不起来。我曾经遇到一个案子,主机端OOB时序偏了零点几个纳秒,结果某些硬盘就是认不到。
  • 电气特性:摆幅、上升时间、抖动、眼图模板,每一相都是死线。特别是三代,眼图余量普遍吃紧,低成本的线缆在高温下一测就露馅。

我的经验:测物理层时别只看近端眼图。插上线缆,去远端看——很多信号完整性问题都在远端爆发。

2. 链路层(Link Layer)—— 数据能“稳”,靠它

物理层把电信号接上了,但传上来的数据乱七八糟怎么办?链路层就是干这个的。它负责原语协商、CRC校验、扰码、流控,保证数据在链路上不出错、不丢帧、不撞车。

原语(Primitive):SATA的原语我特别喜欢——它只有4个字节,却能表达几乎所有链路控制意图。比如:

  • ALIGN:对齐,重建时钟和数据边界。链路刚建好的时候满天飞ALIGN。
  • SYNC:同步保持,告诉对端我还活着,别超时。
  • R_RDY:接收端准备好,开始吐数据给我。
  • HOLD/HOLDA:流控。有一次我排查一个偶尔丢数据的硬盘,最后发现是HOLD时序不对,接收端来不及吞数据就丢了。

CRC校验:链路层的CRC是32位的,从FIS(帧信息结构)的第一个字节算到最后一个字节之前。我曾经见过一个案例,CRC在发送端算对了,但接收端报出错——原因是扰码序列和CRC计算没对齐。这个坑,你踩到一次就能记一辈子。

扰码(Scrambling):SATA用LFSR(线性反馈移位寄存器)对数据进行扰码,避免频谱中出现固定频率的峰值,以减少EMI。我调试时喜欢先关掉扰码,看看到底是码间干扰还是EMI问题——分步排查是王道。

链路层状态机:SATA链路层有7个状态:断电 → 休眠 → 部分 → 活动 → 减速 → 空闲 → 恢复。你用逻辑分析仪抓一次原语,就能看到这些状态的跳变。我建议所有测试工程师都抓一次看,比背一百遍文档都管用。

3. 传输层(Transport Layer)—— 命令能“通”,靠它

传输层是最高的一层,它把主机和设备的命令、数据、状态封装成FIS(帧信息结构)。传输层不关心物理层怎么跑,也不管链路层怎么握手,它只管一件事:这一次交互,数据该不该发,发什么内容。

FIS类型:

FIS类型 作用 长度(Dword)
Register FIS - Host to Device 主机发命令寄存器值给设备 5
Register FIS - Device to Host 设备返回状态寄存器值给主机 5
Data FIS 传输数据载荷(上行或下行) 可变(最多1MB)
Set Device Bits FIS 设备主动通知主机中断状态 2
BIST Activate FIS 进入BIST模式(诊断/调试用) 4

我调试时最常抓的就是Register FIS - Device to Host,因为它里边的status寄存器直接告诉你设备是成功还是报错。如果报错是CRC错误或ABRT,那问题基本出在链路层或传输层本身。

命令协议的完整流程(以读操作为例):

  1. 主机发Register FIS (H2D),写入命令、LBA地址、长度等。
  2. 设备收到后回Register FIS (D2H),报告命令接收状态(通常填BSY=1)。
  3. 设备开始寻址、读盘,然后通过DMA引擎主动发送Data FIS给主机。
  4. 数据传输完成后,设备再发一个Register FIS (D2H),把status改成DRDY(无错误)或ERROR。
  5. 主机检查status,读扇区完成。

这里有一个常见的坑:主机在收到Data FIS之前,可能发一个HOLD去控制流。如果流控时机不对,导致接收缓冲区满,就会丢Data FIS。这个我踩过——不是链路层CRC报错,而是传输层根本接收不完整数据,测试的结果就是间歇性读数据失败。

注意:传输层的FIS是可变长度的。你不要以为所有FIS都是固定5个Dword。Data FIS可以大到256K Dword(约1MB)。如果你的逻辑分析仪只抓了前256字节,可能看丢后面大部分内容。

层次关系速览

下面这张图能帮你把三个层次串起来。你从上往下读,就是一个命令从软件到硬件的完整流;从下往上读,就是信号怎么变成数据的还原过程。

SATA协议三层架构与数据流 传输层(Transport Layer) 核心职能:封装FIS → 处理命令/数据/状态 关键元素:Register FIS、Data FIS、Set Device Bits FIS 链路层(Link Layer) 核心职能:原语控制 → CRC校验 → 扰码 → 流控 关键元素:ALIGN、SYNC、R_RDY、HOLD、CRC-32 物理层(PHY Layer) 核心职能:差分信号 → OOB协商 → 时钟恢复 关键元素:COMRESET、COMINIT、COMWAKE、眼图模板 FIS下发 原语+数据 每层独立测试,但问题往往跨层爆发。建议按自上而下顺序排查:先查物理层眼图,再查链路层原语,最后找传输层FIS。

我个人觉得,精通过这三层,SATA兼容性测试就抓住了主干。后面章节我们会深入到每一层的具体测试方法,但地基一定要夯实。你以后在排查问题时,永远记住:从物理层开始,一路往上捯。这个顺序救过我很多次。