一、SATA 协议概述与历史
我第一次接触 SATA 协议是在 2007 年,那时候刚入行做存储控制器验证。说实话,当时看到一堆差分信号和 8b/10b 编码,头都大了。后来调了几个月的眼图,才慢慢摸到门道。
1.1 为什么需要 SATA?
2000 年之前,硬盘接口主流是 PATA(Parallel ATA,也叫 IDE)。PATA 用了 40 针并口线缆,信号线密密麻麻,抗干扰能力差。随着速率提高到 ATA/133(133 MB/s),并行传输的时序问题越来越难搞——线间串扰、地弹、信号偏移,每一条都是硬伤。
SATA(Serial ATA)就是冲着这些痛点来的。它改用串行差分信号,只用一对发送 + 一对接收就能跑,线缆减少到 7 针,带宽却从 1.5 Gbps 起步。
1.2 发展历程:从 1.5Gbps 到 16Gbps
SATA 协议最早由 Serial ATA Working Group 在 2001 年发布规范,2003 年正式量产。我用表格列一下主要版本,方便你理解演进逻辑:
| 版本 | 发布年份 | 速率 (Gbps) | 编码方式 | 有效带宽 (MB/s) |
|---|---|---|---|---|
| SATA 1.0 | 2003 | 1.5 | 8b/10b | 150 |
| SATA 2.0 | 2004 | 3.0 | 8b/10b | 300 |
| SATA 3.0 | 2009 | 6.0 | 8b/10b | 600 |
| SATA 3.2 | 2013 | 16.0 (SATA Express) | 8b/10b + PCIe | 1969 (PCIe 3.0 x2) |
我调试过一块 SATA 3.0 的桥接芯片,实测链路训练偶尔失败。后来发现是主机端的 OOB(带外信号)时序不满足规范。你想想看,速率越高,对眼图余量的要求越苛刻。
1.3 协议栈的核心层次
SATA 协议分了四层,但最核心的是物理层和链路层。我画一张结构图帮你理清思路:
物理层处理 OOB 信号(COMWAKE、COMINIT、COMRESET),链路层负责帧定界和 CRC,传输层封装 FIS(Frame Information Structure)。我个人的经验是:链路训练卡住的 case,90% 出在物理层的 OOB 时序或阻抗不匹配上。
1.4 应用场景:你以为只有硬盘?
- 消费级存储:2.5 寸机械硬盘、SATA SSD、光驱——这是 SATA 的大本营。即使现在 NVMe 崛起,SATA SSD 依然便宜好用。
- 企业级存储:早期服务器用 SATA 做大容量冷数据存储,现在逐步被 SAS 或 NVMe 取代。但很多中低端 NAS 仍然在用 SATA。
- 嵌入式与工控:我在一个工控项目里用过 DOM(Disk on Module),就是 SATA 接口的闪存盘,直接焊在主板上。
- 消费电子:机顶盒、游戏机(比如 PS3、Xbox 360)都用过 SATA 硬盘。
1.5 小结:为什么还要学 SATA?
你可能会问:NVMe 都普及了,学这个过时协议还有用吗?说实话,现在芯片验证、主板 Debug、以及很多存量设备维护,SATA 仍然是必修课。我去年还帮一个客户解决了 SATA SSD 在 6Gbps 下间歇性断连的问题——根源是 VSA(VCO 开关放大器)的抖动超标。
SATA 的链路训练机制很像一个微型握手协议:从 OOB 序列、到速度协商(Gen1/Gen2/Gen3)、再到 Pattern 对齐和 CRC 校验。理解了 SATA 的链路训练,再去看 PCIe 或 SAS 的链路协商,会发现很多设计思路是相通的。