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,那问题基本出在链路层或传输层本身。
命令协议的完整流程(以读操作为例):
- 主机发Register FIS (H2D),写入命令、LBA地址、长度等。
- 设备收到后回Register FIS (D2H),报告命令接收状态(通常填BSY=1)。
- 设备开始寻址、读盘,然后通过DMA引擎主动发送Data FIS给主机。
- 数据传输完成后,设备再发一个Register FIS (D2H),把status改成DRDY(无错误)或ERROR。
- 主机检查status,读扇区完成。
这里有一个常见的坑:主机在收到Data FIS之前,可能发一个HOLD去控制流。如果流控时机不对,导致接收缓冲区满,就会丢Data FIS。这个我踩过——不是链路层CRC报错,而是传输层根本接收不完整数据,测试的结果就是间歇性读数据失败。
注意:传输层的FIS是可变长度的。你不要以为所有FIS都是固定5个Dword。Data FIS可以大到256K Dword(约1MB)。如果你的逻辑分析仪只抓了前256字节,可能看丢后面大部分内容。
层次关系速览
下面这张图能帮你把三个层次串起来。你从上往下读,就是一个命令从软件到硬件的完整流;从下往上读,就是信号怎么变成数据的还原过程。
我个人觉得,精通过这三层,SATA兼容性测试就抓住了主干。后面章节我们会深入到每一层的具体测试方法,但地基一定要夯实。你以后在排查问题时,永远记住:从物理层开始,一路往上捯。这个顺序救过我很多次。