1. 项目缘起与方案选型逻辑
手里攒了几块闲置的SATA硬盘,机箱里的SATA口早就插满了,主板上的M.2插槽还空着——这种场景估计不少折腾硬件的朋友都遇到过。把M.2插槽利用起来转出几个SATA口,最直接的路径就是找一颗PCIe转SATA的桥接芯片。市面上能买到的方案里,88SE9215和ASM1061这两颗出镜率最高,前者常见于各种四口扩展卡,后者则大量出现在主板板载和廉价双口卡上。我前后用这两颗芯片各做了几版板子,踩了不少坑,这里把整个硬件实现过程完整梳理一遍。
先说清楚这个项目到底在做什么。简单讲,就是设计一块PCB,一头插在主板的PCIe插槽上(物理形态可以是标准PCIe x1卡或者M.2 2280),另一头引出若干个标准SATA接口,让系统能像识别原生SATA控制器一样识别挂上去的硬盘。核心工作围绕三块展开:PCIe接口的物理层与协议层对接、SATA PHY的走线与信号完整性、整板的电源树设计。适合有一定硬件基础、想自己画一版扩展卡或者想搞明白这类桥接芯片内部逻辑的读者。如果你只是想把硬盘插上能用,直接买成品卡更省事;但如果你想搞清楚为什么有的卡跑得稳有的卡老掉盘,那自己走一遍设计流程是最快的理解方式。
选型上,88SE9215和ASM1061的定位差异很明显。88SE9215是Marvell家的四口方案,PCIe 2.0 x2上行,四个SATA口都能跑到6Gbps,内部带一个ARM核做协议转换,需要外挂SPI Flash存放固件。ASM1061是ASMedia的双口方案,PCIe 2.0 x1上行,两个SATA口也是6Gbps,但它不需要外挂固件,配置信息通过strapping电阻在复位时采样。从硬件设计难度看,ASM1061外围更干净,适合做小尺寸的M.2转双SATA;88SE9215通道多,但布线和电源复杂度上一个台阶。我两个方案都做了板子,下面分别拆解。
注意:这两颗芯片的datasheet在官方渠道都不容易拿到完整版,网上流传的版本有些关键章节缺失。建议先找FAE或者代理渠道确认引脚定义和参考设计,不要完全依赖来路不明的PDF。
2. PCIe接口硬件设计的关键细节
2.1 金手指与差分对走线
PCIe x1的物理接口有36个引脚(A面18个,B面18个),其中真正跑高速信号的只有TX和RX两对差分线。以标准PCIe CEM连接器为例,A面第14、15脚是PETp0/PETn0(发送对),第16、17脚是PERp0/PERn0(接收对)。M.2接口的引脚定义不同,但差分对的位置和阻抗要求是一致的。
差分阻抗要求100Ω±10%,这个不是随便说说的。我第一版板子用嘉立创的默认四层板叠层(信号-地-电源-信号),差分线宽6mil、间距6mil,用Polar SI9000算出来是98Ω,实测眼图勉强能看但裕量不大。后来改成线宽5.5mil、间距7mil,算出来101Ω,眼图明显干净了。这里的关键是叠层参数必须和板厂确认,不同板厂的半固化片厚度和介电常数有差异,同样的线宽间距算出来的阻抗可能差5Ω以上。
走线长度方面,PCIe Gen2的差分对长度匹配要求是对内±5mil,对间±10mil。这个精度手工布线很难保证,必须用EDA工具的差分对布线功能。我用的KiCad 7,在布线前先设置好差分对规则,走线时按快捷键就能自动保持等长。如果是Allegro或者Altium,规则设置更细,但核心逻辑一样:先定阻抗,再定线宽间距,最后约束长度。
2.2 参考时钟与复位信号
PCIe接口需要外部提供100MHz参考时钟。标准PCIe卡从金手指的A13/A14脚取时钟,但M.2接口的时钟引脚位置不同。这里有个容易翻车的点:参考时钟的抖动要求。PCIe Gen2对时钟抖动的容忍度比Gen1低不少,如果直接从主板取时钟,走线过长或者经过连接器多次转接,抖动可能超标。我的做法是在靠近芯片端加一颗零延迟缓冲器(比如PI6C557),把时钟重新整形后再送给芯片。
复位信号PERST#是另一个关键。这个信号从金手指A11脚进来,低电平有效。芯片内部有上电复位电路,但外部还是建议加一个RC延时,确保电源稳定后再释放复位。我用的参数是10kΩ上拉加100nF到地,时间常数1ms,实测下来比直接连复位引脚稳定得多。ASM1061的复位引脚内部有施密特触发器,对边沿要求不高;88SE9215则要求复位低电平至少保持100μs,这个在时序设计时要留够裕量。
2.3 耦合电容与ESD保护
PCIe的TX和RX差分对上必须串联交流耦合电容,典型值100nF。这个电容的位置有讲究:TX端的电容应该靠近发送端芯片,RX端的电容靠近接收端芯片。我见过有人把电容放在连接器中间,结果信号反射严重,链路训练都过不了。电容封装用0201或者0402,X7R材质,耐压16V以上。注意不要用Y5V,温漂太大会导致容值变化影响信号。
ESD保护方面,PCIe接口是热插拔场景,静电风险不低。我一般在差分对靠近连接器端加超低电容TVS阵列,比如SRV05-4,结电容0.5pF左右,对信号影响很小。但要注意TVS的钳位电压不能太低,否则可能影响正常信号摆幅。实测下来,加了TVS之后眼图高度会掉10%左右,如果链路裕量本来就不大,可以考虑省掉或者换更低电容的型号。
3. SATA PHY与电源树设计
3.1 SATA差分信号走线要点
SATA的物理层和PCIe类似,也是差分信号,但阻抗要求是100Ω,速率6Gbps。从芯片出来的SATA TX/RX对,到SATA连接器之间,走线要尽量短。我一般控制在5cm以内,超过这个长度眼图就开始闭合。如果实在要走长线,中间不能有过孔,必须换层的话要在过孔旁边加回流地过孔。
SATA连接器有7个引脚:3个地、2对差分、1个+5V。差分对在连接器上的位置是固定的,布线时注意不要交叉。我见过有人把TX和RX接反了,结果硬盘识别不到,查了半天才发现是连接器引脚定义看错了。这里提醒一句:SATA连接器的引脚编号从板边往里数,不同厂家的封装可能镜像,画封装时一定要对着实物确认。
3.2 电源树设计与LDO选型
整板电源需求分三档:3.3V(PCIe接口供电和芯片IO)、1.2V(芯片内核)、1.0V(部分芯片的PHY供电)。88SE9215还需要1.8V给DDR2内存接口(对,它内部有DDR2控制器做数据缓冲)。ASM1061简单一些,只要3.3V和1.2V。
从PCIe插槽取电的话,3.3V最大能拿到3A(x1插槽的3.3V供电能力),但实际芯片功耗不高。88SE9215满载大概2W左右,ASM1061不到1W。我一般用两级降压:先从3.3V用LDO降到1.2V给内核,再用LDO降到1.0V给PHY。LDO选型看两个参数:压差和噪声。压差要小于输入输出电压差的一半,比如3.3V转1.2V,压差2.1V,选压差300mV以内的LDO就很充裕。噪声方面,PHY供电对电源纹波敏感,建议选PSRR在100kHz处大于40dB的型号,比如TPS7A系列。
如果是从M.2接口取电,3.3V的电流能力通常只有1A左右(M.2 Key M的3.3V引脚限流),这时候要算一下总功耗。88SE9215加四块硬盘的PHY功耗,1A可能不够,需要从其他地方取电或者换ASM1061方案。
3.3 晶振与配置电阻
ASM1061需要一颗25MHz晶振,精度±50ppm以内。晶振的负载电容要匹配,一般选12pF或者15pF,具体看晶振规格书。我试过用陶瓷谐振器省钱,结果SATA链路训练偶尔失败,换回石英晶振就稳了。88SE9215用25MHz晶振或者外部时钟输入,内部PLL倍频到所需频率。
配置电阻方面,ASM1061的strapping引脚在复位时采样,决定PCIe lane宽度、SATA端口映射等。这些电阻的阻值不能随便选,必须按datasheet的表格来。我一般用1%精度的电阻,布局时尽量靠近芯片引脚,走线短而直。有个坑是:strapping引脚在复位后可能变成其他功能,如果外部电路有冲突,会导致芯片工作异常。画原理图时一定要看清楚引脚复用表。
4. PCB布局与信号完整性实战
4.1 叠层选择与阻抗控制
四层板是这类设计的最低配置,叠层建议:信号-地-电源-信号。顶层走高速差分对和关键信号,底层走低速控制和电源。中间的地平面要完整,不能有跨分割。我试过用两层板做ASM1061方案,结果SATA眼图一塌糊涂,换成四层板后立刻改善。如果预算允许,六层板更好:信号-地-信号-电源-地-信号,这样高速信号两边都有参考平面,回流路径更短。
阻抗控制方面,除了前面说的差分100Ω,单端信号线一般控制50Ω。PCIe的参考时钟是单端100MHz,走线阻抗50Ω,包地处理。SATA的差分对阻抗100Ω,和PCIe一样。板厂做阻抗控制时,一般会提供阻抗计算报告,收到板子后最好用TDR实测一下,确认和设计值偏差在10%以内。
4.2 电源分割与去耦电容布局
电源平面的分割要按电压域来,3.3V、1.2V、1.0V各自一块,不要交叉。如果空间紧张,可以用星型连接从主电源点分别拉线到各芯片引脚,中间加磁珠隔离。去耦电容的布局是另一个重点:每个电源引脚旁边放一个100nF,容值小的靠近引脚,容值大的(10μF)放在芯片外围。我一般还会在整板电源入口放一个220μF的钽电容做储能,应对硬盘启动时的浪涌电流。
有个细节容易被忽略:去耦电容的接地过孔。每个电容的接地端至少要有一个过孔直接打到地平面,过孔尽量靠近焊盘。我见过有人电容放得很整齐但接地过孔离得远,结果高频去耦效果大打折扣。实测下来,接地过孔距离焊盘超过2mm,100MHz以上的噪声抑制就明显变差。
4.3 时钟与复位信号的隔离
25MHz晶振的走线要包地,两边加地过孔屏蔽。晶振下方不要走其他信号,尤其是高速差分对。复位信号走线要远离时钟和差分对,如果实在避不开,中间加地线隔离。我一般把复位信号走在底层,和顶层的高速信号隔一个地平面,耦合很小。
PCIe的参考时钟差分对(如果从金手指取)要走紧耦合,线间距尽量小,包地处理。如果用了外部时钟缓冲器,缓冲器到芯片的时钟走线也要按差分规则走,长度尽量短。实测下来,参考时钟的抖动每增加1ps,PCIe链路的误码率就上升一个数量级,所以时钟这部分值得多花时间优化。
5. 固件与配置要点
5.1 88SE9215的SPI Flash烧录
88SE9215需要外挂一颗SPI Flash存放固件,容量一般用2Mbit或者4Mbit,型号比如W25Q16。固件从Marvell的FAE渠道获取,或者从成品卡上读出来。烧录方式有两种:在线烧录(通过PCIe接口)和离线烧录(用编程器)。在线烧录需要主板能识别到芯片,如果固件是空的,芯片可能不枚举,这时候只能用离线烧录。
离线烧录时注意Flash的扇区大小和写保护。有些Flash出厂时带了写保护,需要先发命令解除。我用的CH341A编程器加SOP8夹子,直接夹在Flash引脚上烧录,不用拆焊。烧录完成后最好校验一遍,确认没有坏块。固件版本方面,不同版本的固件对硬盘兼容性有差异,我试过某个老版本固件接某品牌SSD会掉盘,换新版本就好了。
5.2 ASM1061的配置电阻计算
ASM1061不需要固件,但配置电阻的阻值决定了它的工作模式。以PCIe lane宽度配置为例,datasheet里会有一个表格,比如:
| 配置引脚 | 电阻值 | 功能 |
|---|---|---|
| CFG0 | 4.7kΩ到地 | PCIe x1模式 |
| CFG0 | 10kΩ到地 | PCIe x2模式 |
| CFG1 | 悬空 | SATA端口0/1使能 |
| CFG1 | 4.7kΩ到地 | 仅端口0使能 |
这些电阻的精度要求一般是5%,但为了保险我用1%的。布局时电阻要靠近芯片引脚,走线不要超过5mm。有个坑是:配置引脚在复位后可能被复用为GPIO,如果外部电路有上拉或者下拉,可能影响芯片正常工作。画原理图时要在配置电阻和复用功能之间做取舍,必要时加跳线或者0Ω电阻做隔离。
5.3 PCIe链路训练与枚举
芯片上电后,PCIe链路会进行LTSSM链路训练。这个过程分多个阶段:Detect、Polling、Configuration、Recovery、L0。如果链路训练失败,系统就枚举不到设备。常见原因有:参考时钟缺失或抖动超标、差分对极性接反、耦合电容容值不对、电源时序不对。
排查时可以用PCIe协议分析仪抓LTSSM状态机跳转,但设备贵,个人玩家一般没有。替代方法是看芯片的状态引脚或者LED指示。ASM1061有个引脚可以指示链路状态,88SE9215可以通过SPI Flash里的日志看训练结果。我遇到过一次链路训练失败,查了半天发现是参考时钟的耦合电容焊反了(0402封装看不出来极性,但实际有极性要求),换过来就好了。
6. 常见问题与排查技巧实录
6.1 硬盘识别不到或频繁掉盘
这是最常见的问题,原因可能出在多个环节。先查电源:用示波器看SATA连接器的5V和12V(如果是3.5寸硬盘)是否稳定,纹波是否超标。我遇到过一块板子,硬盘转起来之后5V掉到4.5V,原因是LDO的电流能力不够,换了个大电流的就好了。再查信号:用示波器看SATA差分对的眼图,如果眼高眼宽不够,检查走线阻抗和长度匹配。最后查固件/配置:88SE9215的固件版本、ASM1061的配置电阻,都可能影响硬盘兼容性。
实操心得:准备一块已知良好的成品卡做对照,出问题时把硬盘插到成品卡上,如果正常,说明硬盘没问题,问题在自制板上;如果不正常,先换硬盘再排查。
6.2 PCIe设备枚举失败
系统启动后lspci看不到设备,或者设备显示但带感叹号。先确认BIOS里PCIe插槽是否使能,有些主板默认关闭某些插槽。再确认金手指是否插到位,PCIe插槽有卡扣,没插到底的话接触不良。然后查参考时钟:用示波器测时钟引脚,应该有100MHz差分信号,幅度在400mV到1.2V之间。最后查复位信号:PERST#应该在电源稳定后释放,如果一直拉低,芯片不工作。
有个隐蔽的坑:PCIe插槽的3.3V供电能力。有些主板给x1插槽的3.3V限流在1A以内,如果板子功耗超过这个值,电压会被拉低,导致枚举失败。我遇到过一块板子,空载时枚举正常,插上硬盘就掉,最后发现是3.3V电流不够,改成从外部取电就好了。
6.3 SATA链路速率跑不到6Gbps
链路建立但速率只有3Gbps或者1.5Gbps,说明信号质量不够。先查差分对走线:长度是否匹配、阻抗是否连续、有没有跨分割。再查连接器:SATA连接器的引脚是否氧化、焊接是否虚焊。最后查芯片配置:有些芯片可以通过寄存器强制速率,但一般不建议,还是从信号质量入手。
我试过一版板子,SATA走线长度差了8mil,结果速率只能跑到3Gbps。重新布线做到等长后,6Gbps稳定。所以长度匹配不是可选项,是必选项。
6.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 硬盘不识别 | 电源不足 | 测5V/12V电压和纹波 | 换大电流LDO或外部供电 |
| 硬盘掉盘 | 信号质量差 | 测SATA眼图 | 优化走线阻抗和长度 |
| PCIe枚举失败 | 参考时钟异常 | 测时钟频率和幅度 | 换晶振或加时钟缓冲器 |
| 速率跑不满 | 差分对失配 | 测走线长度 | 重新布线做到等长 |
| 芯片发热严重 | 电源短路或过压 | 测各电源域电流 | 检查焊接和电源时序 |
| 固件加载失败 | SPI Flash坏块 | 读Flash内容校验 | 换Flash重新烧录 |
6.5 独家避坑技巧
第一,电源时序要控制。88SE9215要求1.2V先上电,然后3.3V,最后1.0V。如果时序不对,芯片可能闩锁。我一般用电源时序控制器(比如TPS3808)来管理,或者用RC延时加MOS管做简单时序。
第二,SATA连接器的金属外壳要接地。有些封装的外壳引脚在原理图里没标,但实际需要接地。不接地的话,插拔硬盘时静电可能打坏芯片。我一般把外壳引脚连到板子的地平面,用多个过孔。
第三,PCIe金手指的斜边要倒角。标准PCIe卡的金手指前端有斜边,方便插入插槽。如果自己画封装忘了倒角,插拔会很费劲,甚至损坏插槽。画封装时对着CEM规范确认尺寸。
第四,测试点要留够。关键信号比如参考时钟、复位、SATA差分对,都要留测试点。测试点不要放在差分对中间,会破坏阻抗。我一般在差分对旁边留一对地信号测试点,用差分探头测。
第五,板子做完先目检再上电。尤其是BGA封装的芯片,焊接不良很难发现。我一般用放大镜看一遍引脚,确认没有连锡和虚焊。上电时用限流电源,电流设小一点,如果短路电流会立刻上去,能保护芯片。
7. 实测数据与性能对比
7.1 88SE9215四口卡实测
用CrystalDiskMark测连续读写,接一块SATA SSD,读520MB/s,写480MB/s,基本跑满了SATA 6Gbps的带宽。四块硬盘同时读写时,总带宽受限于PCIe 2.0 x2的1GB/s,每块盘大概250MB/s。功耗方面,空载1.2W,满载2.1W,芯片表面温度45度左右(室温25度),不需要额外散热。
7.2 ASM1061双口卡实测
单盘读写和88SE9215差不多,读510MB/s,写470MB/s。双盘同时读写时,PCIe 2.0 x1的500MB/s带宽成为瓶颈,每块盘大概250MB/s。功耗空载0.8W,满载1.3W,芯片温度40度左右。
7.3 对比总结
| 项目 | 88SE9215 | ASM1061 |
|---|---|---|
| PCIe上行 | 2.0 x2 | 2.0 x1 |
| SATA端口 | 4 | 2 |
| 固件需求 | 需要SPI Flash | 无需固件 |
| 配置方式 | 固件配置 | 电阻strapping |
| 功耗 | 1.2W-2.1W | 0.8W-1.3W |
| 设计难度 | 较高 | 较低 |
| 适用场景 | 多盘扩展 | 小尺寸双口 |
从实际使用看,如果只需要两个SATA口,ASM1061方案更简单可靠,BOM成本也低。如果需要四个口,88SE9215是更合理的选择,但固件和电源设计要花更多心思。两颗芯片的SATA性能都能跑满6Gbps,关键还是看PCB设计和电源质量。
8. 后续扩展与个人体会
这套设计做完之后,我还试过把ASM1061方案做成M.2 2280形态,直接插在主板的M.2插槽上,引出两个SATA口。M.2接口的3.3V供电能力有限,所以选了低功耗的ASM1061,实测带两块2.5寸SSD没问题。如果是3.5寸机械硬盘,启动电流大,需要从外部取电或者加储能电容。
另外,PCIe转SATA只是桥接芯片的一个应用方向。同样的设计思路可以扩展到PCIe转USB、PCIe转网口等场景,核心都是PCIe物理层对接加协议转换。把PCIe的LTSSM和电源时序搞明白之后,换其他桥接芯片上手会快很多。
我个人在实际操作中的体会是:电源和时钟是这类高速桥接设计的命门。信号走线只要按规则来,一般不会有大问题;但电源纹波和时钟抖动是隐形的杀手,出问题时很难定位。建议在画板之前,先把电源树和时钟树在纸上画清楚,每个电源域的电流、纹波要求、时序关系都列出来,再开始布局。这样能避免很多后期调试的麻烦。