1. 项目缘起与方案选型
1.1 为什么要在PCIe与SATA之间做转换
手头有一块老旧的Mini-ITX主板,CPU性能够用,DDR4内存也插满了,唯独SATA接口只有两个。想组一个轻量级NAS,两块4TB的机械盘做存储池,再加一块SSD做缓存,接口数量立刻捉襟见肘。USB转SATA的方案我试过,ASM1153E和JMS578都用过,轻负载下没问题,但一旦多盘并发读写,USB总线的中断开销和协议转换延迟就暴露出来了,SMART信息读取也经常出问题。这时候最稳妥的路子,就是从PCIe通道上想办法。
PCIe转SATA的本质,是在PCIe总线和SATA控制器之间搭一座桥。主机侧看到的是一个标准的PCIe端点设备,设备侧则挂载一到多个SATA通道。操作系统加载对应的AHCI驱动后,这些SATA口就和主板原生口没有区别,热插拔、NCQ、TRIM(针对SSD)都能正常支持。这个方案的核心价值在于:用主板空闲的PCIe通道,换取额外的SATA接口,且性能损耗极小。
适合读这篇内容的人,大致有三类:一是DIY NAS玩家,主板SATA口不够用;二是工控机或软路由用户,需要扩展存储接口但机箱空间有限;三是硬件爱好者,想理解PCIe转SATA桥接芯片的工作原理和电路设计要点。不管你是哪一类,下面的内容都会从芯片选型一路讲到PCB布局,尽量把每个环节的“为什么”说清楚。
1.2 88SE9215与ASM1061的定位差异
市面上常见的PCIe转SATA桥接芯片,主要来自Marvell(现属NXP)和ASMedia两家。88SE9215是Marvell的经典四口方案,ASM1061则是ASMedia的双口方案,后来还有ASM1062、ASM1064等衍生型号。这两颗芯片我都实际做过板子,下面从几个维度做个对比。
| 对比项 | 88SE9215 | ASM1061 |
|---|---|---|
| PCIe接口 | PCIe 2.0 x2 | PCIe 2.0 x1 |
| SATA通道数 | 4 | 2 |
| 最大带宽 | 约1000MB/s(x2) | 约500MB/s(x1) |
| 封装 | 128-pin LQFP | 48-pin QFN |
| 供电需求 | 1.0V核心 + 3.3V IO | 1.0V核心 + 3.3V IO |
| 外部晶振 | 25MHz | 25MHz |
| 典型功耗 | 约1.5W | 约0.8W |
| 参考价格 | 较高 | 较低 |
88SE9215的PCIe 2.0 x2接口意味着理论带宽约10Gbps,四口SATA 3.0共享这个带宽,单口跑满6Gbps时其余口会争抢,但实际机械盘根本跑不满,所以四口同时读写也不会成为瓶颈。ASM1061是x1接口,理论5Gbps,两口SATA共享,接两块SSD做RAID 0时可能会碰到带宽天花板,但接机械盘完全够用。
选型逻辑很直接:需要三个以上SATA口,选88SE9215;只需要两个口且对成本敏感,选ASM1061。另外,88SE9215的LQFP封装焊接难度低于ASM1061的QFN,手焊的话前者更友好,但QFN占板面积小,适合紧凑型设计。
1.3 整体方案框架
一个完整的PCIe转SATA扩展卡,硬件上包含以下几个部分:PCIe金手指接口、桥接芯片、SATA接口、电源电路、晶振电路、配置电路(EEPROM或strap引脚)、以及可选的LED指示灯。信号流向是:主板PCIe插槽 → 金手指 → 桥接芯片PCIe侧 → 芯片内部协议转换 → SATA侧 → SATA接口 → 硬盘。
电源方面,PCIe插槽提供3.3V和12V,但桥接芯片核心需要1.0V,IO需要3.3V,所以需要一个LDO或DC-DC把3.3V降到1.0V。SATA接口的5V和12V通常直接从电源取,不走PCIe插槽,因为PCIe插槽的12V电流有限(x1插槽约5.5W,x4约25W),带多块机械盘启动时电流不够。
注意:如果你打算从PCIe插槽取12V给硬盘供电,务必确认插槽的供电能力。x1插槽通常只有10W左右,一块3.5寸机械盘启动瞬间电流可达2A(12V),两块盘同时启动就可能触发过流保护。稳妥做法是从电源直接引SATA供电线。
2. 核心电路设计细节拆解
2.1 PCIe接口电路与金手指设计
PCIe金手指是整块卡与主板通信的物理通道。以x1为例,金手指有36个引脚(A面18个,B面18个),其中关键信号包括:REFCLK+/-(参考时钟)、PERp0/PERn0(发送差分对)、PETp0/PETn0(接收差分对)、PRSNT1#/PRSNT2#(存在检测)、JTAG引脚(通常悬空或下拉)、3.3V和12V供电、以及SMBus(可选)。
差分对的走线是重点。PCIe 2.0的差分阻抗要求是85Ω±10%,走线必须等长、等距、包地。我一般用四层板,顶层走差分线,第二层完整地平面,第三层电源,底层走低速信号。差分对的线宽和间距根据叠层计算,以常见的1.6mm四层板为例,介质厚度约0.2mm,Er约4.3,线宽0.2mm、间距0.2mm时差分阻抗约85Ω,具体数值需要用阻抗计算工具确认。
REFCLK是100MHz差分时钟,来自主板,走线同样需要差分处理,但速率较低,要求可以放宽。PRSNT1#和PRSNT2#需要在金手指端短接,告诉主板“卡已插入”。JTAG引脚(TCK、TDI、TDO、TMS、TRST#)不用时全部下拉到地,避免浮空。
实操心得:金手指的斜边倒角一定要做,否则插拔时容易刮伤主板插槽。倒角角度一般45度,深度约1mm。另外,金手指镀金厚度建议不低于0.5μm,太薄了插拔几次就磨损露铜。
2.2 桥接芯片外围电路
以88SE9215为例,外围电路包括:25MHz晶振、复位电路、EEPROM(可选)、SATA接口、电源去耦。
晶振电路:25MHz无源晶振,负载电容根据晶振规格书选,通常是12pF到18pF。晶振走线尽量短,远离差分对和电源开关节点。我习惯在晶振下方挖空铜皮,减少寄生电容。
复位电路:芯片有一个RST#引脚,低电平复位。通常用一个10kΩ上拉到3.3V,再并一个0.1μF电容到地,配合一个复位按钮或来自PCIe的复位信号。PCIe的PERST#信号可以直接驱动这个引脚,但注意电平匹配,PERST#是3.3V逻辑。
EEPROM:88SE9215支持通过EEPROM配置PCIe设备ID、SATA端口映射等参数。如果不用EEPROM,芯片会用默认配置。我一般留一个I2C EEPROM的焊盘,调试阶段方便改配置,量产时根据需求决定是否贴片。
SATA接口:每个SATA通道有TX+/-和RX+/-两对差分线,外加地线。SATA 3.0速率6Gbps,差分阻抗100Ω。走线要求比PCIe稍宽松,但也不能马虎。SATA接口的金属外壳要接地,屏蔽层单点接地。
电源去耦:芯片的每个电源引脚都要配0.1μF陶瓷电容,尽量靠近引脚。核心电源1.0V还需要一个大容量电容(10μF到22μF)做储能。IO电源3.3V同样需要去耦。我通常会在芯片周围放一圈0.1μF电容,再加两三个10μF电容。
2.3 电源电路设计:从3.3V到1.0V
桥接芯片的核心电压通常是1.0V或1.2V,具体看型号。88SE9215的核心是1.0V,ASM1061也是1.0V。PCIe插槽提供3.3V,所以需要一个降压电路。
方案一:LDO。优点是简单、无开关噪声、纹波小。缺点是效率低,压差2.3V,如果核心电流500mA,LDO自身功耗1.15W,发热明显。适合电流需求小的场景。
方案二:DC-DC降压。效率高,发热小,但需要电感、电容和反馈电阻,布局要求高,开关噪声可能干扰PCIe和SATA信号。
我一般选DC-DC,因为88SE9215的核心电流在1A左右,LDO发热太大。以TPS5430为例,输入3.3V,输出1.0V,开关频率500kHz。反馈电阻计算:Vout = 0.8V × (1 + R1/R2),要得到1.0V,R1/R2 = 0.25,选R1=2.5kΩ,R2=10kΩ。电感选4.7μH,饱和电流至少2A。输出电容选22μF陶瓷电容加一个100μF钽电容。
注意:DC-DC的开关节点(SW引脚)是主要的噪声源,走线要短而粗,远离晶振和差分对。电感下方不要走信号线,必要时在电感下方铺地并打过孔。
2.4 SATA接口与信号完整性
SATA接口有7个引脚:GND、TX+、TX-、GND、RX-、RX+、GND。差分对之间用地线隔开,减少串扰。SATA 3.0的差分阻抗要求100Ω,走线等长误差控制在5mil以内。
如果SATA接口离芯片较远(超过5cm),建议加共模扼流圈或ESD保护器件。ESD保护选低电容型号,结电容小于1pF,否则会影响信号完整性。我常用的是SRV05-4或类似型号。
SATA接口的5V和12V供电,如果从板子上走,需要足够的线宽。1A电流下,1oz铜厚,线宽至少1mm。更稳妥的做法是SATA电源直接从电源引,板子上只走信号。
2.5 配置引脚与LED指示
88SE9215有几个strap引脚,在上电复位时采样,决定PCIe设备ID、SATA端口使能等。这些引脚通常需要上拉或下拉电阻,具体看数据手册。我一般留0Ω电阻跳线,方便调试。
LED指示:每个SATA通道可以接一个LED,指示活动状态。LED串联限流电阻,接到芯片的Activity引脚。限流电阻计算:LED正向压降约2V,电流5mA,3.3V供电,电阻=(3.3-2)/0.005=260Ω,选270Ω或330Ω。
3. 实操过程与核心环节实现
3.1 原理图设计要点
原理图阶段,我习惯先画电源树,再画芯片外围,最后画接口。电源树要标注每路电压的电流需求,方便选型。88SE9215的1.0V核心电流约1A,3.3V IO电流约200mA,总功耗约1.5W。
PCIe差分对在原理图上要标注差分属性,方便PCB工具识别。SATA差分对同理。晶振电路要标注负载电容值,这个值必须和晶振规格书一致,否则频偏可能导致PCIe链路不稳定。
EEPROM如果要用,I2C总线上拉电阻选4.7kΩ,地址引脚根据需求接高或接低。复位电路要确保上电时RST#保持低电平至少1ms,可以用RC延时实现。
3.2 PCB布局与叠层设计
四层板叠层:顶层信号、第二层地、第三层电源、底层信号。板厚1.6mm,顶层到第二层介质0.2mm,第二层到第三层0.8mm,第三层到底层0.2mm。这个叠层下,顶层走线的差分阻抗容易控制在85Ω到100Ω。
布局顺序:先放PCIe金手指,再放桥接芯片,再放SATA接口,最后放电源电路。金手指到芯片的差分对尽量短,最好控制在5cm以内。晶振紧贴芯片,走线不超过1cm。DC-DC远离差分对和晶振,电感朝板边放置。
SATA接口如果放在板边,注意接口方向,方便插线。四个SATA口可以并排,也可以两两一组。我一般并排,间距2.54mm,方便插拔。
3.3 关键走线规则
PCIe差分对:线宽0.2mm,间距0.2mm,差分阻抗85Ω。等长误差5mil以内。包地处理,地线每隔5mm打过孔。避免过孔,如果必须过孔,两个差分线要对称过孔。
SATA差分对:线宽0.2mm,间距0.2mm,差分阻抗100Ω。等长误差5mil以内。TX和RX对之间保持3倍线宽以上的间距,减少串扰。
晶振走线:尽量短,不超过1cm。下方挖空铜皮。负载电容紧贴晶振。
DC-DC走线:SW节点短而粗,反馈线远离SW节点,电感下方铺地。
3.4 焊接与调试
QFN封装的ASM1061手焊难度较大,建议用热风枪加焊膏。LQFP的88SE9215相对好焊,拖焊即可。焊接前先检查焊盘是否平整,焊膏量要适中。
上电前先测各路电源对地阻抗,确认没有短路。上电后先测1.0V、3.3V是否正常,再测晶振是否起振。晶振起振后用示波器看波形,频率应为25MHz,幅度约1Vpp。
PCIe链路训练:上电后,主板会尝试与卡进行链路训练。如果链路训练失败,系统可能无法识别设备。用lspci命令查看是否识别到桥接芯片。如果没识别到,检查REFCLK是否有输出,PERST#是否正常释放,差分对是否接反。
SATA设备识别:链路训练成功后,加载AHCI驱动,SATA口应该出现在系统里。接上硬盘,用smartctl查看SMART信息,确认通信正常。
踩过的坑:有一次REFCLK的差分对走线没有等长,差了20mil,结果链路训练时好时坏。后来重新走线,等长控制在5mil以内,问题消失。PCIe对时序非常敏感,差分对的等长和阻抗控制不能马虎。
3.5 实测数据与性能评估
用88SE9215做的四口卡,接四块4TB机械盘,同时读写,总带宽约450MB/s,单盘约120MB/s,符合机械盘性能预期。接一块SATA SSD,单口读写约520MB/s,接近SATA 3.0的实际上限。
ASM1061的双口卡,接两块SSD做RAID 0,总带宽约800MB/s,受限于PCIe 2.0 x1的5Gbps带宽。接机械盘则完全够用。
功耗方面,88SE9215卡空载约1.2W,满载约2W。ASM1061卡空载约0.6W,满载约1.2W。发热都在可接受范围内,不需要额外散热片。
4. 常见问题与排查技巧实录
4.1 系统不识别卡
这是最常见的问题。排查顺序:先看PCIe插槽供电是否正常,3.3V和12V是否到位。再测REFCLK是否有100MHz输出。然后测PERST#是否在上电后释放。最后检查差分对是否接反,TX和RX不能交叉。
如果以上都正常,可能是EEPROM配置问题。有些卡需要EEPROM才能被识别,检查EEPROM是否焊接良好,I2C地址是否正确。
4.2 识别到卡但SATA口不工作
先确认AHCI驱动是否加载。Linux下用lspci -k查看驱动绑定情况。如果驱动没绑定,可能是设备ID不匹配,需要改EEPROM或驱动。
如果驱动绑定了但SATA口没出现,检查SATA差分对是否接反。SATA的TX和RX是交叉连接的,主机的TX接设备的RX,主机的RX接设备的TX。如果接反,链路无法建立。
4.3 传输速度不达标
先确认PCIe链路速率。用lspci -vv查看LnkSta,确认速率是5GT/s还是2.5GT/s。如果只有2.5GT/s,检查差分对阻抗和等长。
SATA侧,确认硬盘本身速度。机械盘120MB/s左右正常,SSD 500MB/s左右正常。如果SSD只有300MB/s,可能是SATA链路降速到3Gbps,检查SATA差分对。
4.4 多盘并发时掉盘
通常是电源问题。多块机械盘同时启动,12V电流需求大,如果从PCIe插槽取电,可能过流。解决办法是从电源直接引SATA供电线。
也可能是散热问题。桥接芯片温度过高会降速或复位。摸一下芯片表面,如果烫手,加散热片。
4.5 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 系统不识别卡 | 供电异常 | 测3.3V/12V | 检查金手指和电源 |
| 系统不识别卡 | REFCLK无输出 | 示波器测时钟 | 检查主板插槽 |
| 系统不识别卡 | 差分对接反 | 目视检查 | 重新焊接 |
| 识别到卡但无SATA | 驱动未加载 | lspci -k | 安装AHCI驱动 |
| 识别到卡但无SATA | SATA差分对接反 | 目视检查 | 交叉TX/RX |
| 速度不达标 | PCIe降速 | lspci -vv | 检查差分对阻抗 |
| 速度不达标 | SATA降速 | dmesg查看 | 检查SATA走线 |
| 多盘掉盘 | 电源过流 | 测12V电流 | 从电源直接供电 |
| 多盘掉盘 | 芯片过热 | 摸芯片温度 | 加散热片 |
独家避坑技巧:调试PCIe转SATA卡时,建议先只焊电源和晶振,确认1.0V和25MHz正常后再焊芯片。这样如果电源有问题,不会烧芯片。另外,PCIe金手指的PRSNT1#和PRSNT2#一定要短接,否则主板认为卡没插好,不给供电。
4.6 设计检查清单
投板前对照以下清单检查:电源树是否完整,每路电压电流是否满足;差分对阻抗是否计算,等长是否满足;晶振负载电容是否匹配;复位电路RC值是否合适;EEPROM上拉电阻是否到位;SATA接口ESD保护是否加;金手指倒角是否做;丝印是否清晰。
5. 设计延伸与个人体会
这套PCIe转SATA的方案,除了做扩展卡,还可以集成到NAS主板或工控板上。如果板子空间允许,把桥接芯片直接画在主板上,省去金手指和插槽,成本更低,可靠性更高。我做过一版集成88SE9215的NAS主板,四个SATA口直接从芯片引出,配合两个原生口,总共六个口,带六块盘很稳。
另一个延伸方向是PCIe Switch。如果主板只有一个x1插槽,但想同时扩展SATA和网口,可以用PCIe Switch芯片(如ASM1182e)把x1拆成两个x1,一个接SATA桥,一个接网卡芯片。这样一块卡解决两个需求,适合软路由或迷你主机。
我个人在实际操作中的体会是,PCIe转SATA的难点不在芯片本身,而在信号完整性和电源设计。差分对的阻抗和等长控制好了,链路训练基本一次过。电源设计留足余量,多盘并发就不会掉盘。另外,调试时耐心很重要,PCIe链路训练失败的原因可能很隐蔽,比如一个过孔没打好,或者一个电容放远了,都会导致问题。用示波器和lspci工具逐步排查,总能找到原因。
最后分享一个小技巧:如果手头没有PCIe协议分析仪,可以用一块已知良好的PCIe转SATA卡做对比测试。把可疑卡的差分对接到良好卡的对应引脚上,看是否能识别,快速定位是卡的问题还是主板的问题。这个方法我用了很多次,省了不少时间。