2、物理层冗余基础:双网口硬件设计要点(MAC/PHY选择、PCIe/USB接口对比)
各位同学,咱们接着聊。上一章我讲了网络冗余的整体架构,说白了就是「鸡蛋别放一个篮子里」。但篮子本身怎么造?这就是本章要啃的硬骨头——物理层冗余的硬件设计。
你想想看,双网口冗余,最底层的保障是什么?是两个独立的物理通道。如果两个网口共用同一个MAC、同一个PHY,甚至共用同一路PCIe总线,那一旦这个共享部件挂了,冗余就是个笑话。所以,物理层冗余的核心就一句话:真冗余,必须真独立。
2.1 MAC/PHY 的选择:集成还是分立?
这里我先抛个问题:选芯片时,MAC和PHY是买集成的SoC,还是分开买?
我个人习惯,先看项目规模。如果是小批量、高价值的工业网关,我倾向于分立方案。为什么?因为灵活。MAC坏了换MAC,PHY坏了换PHY,不用整个板子重做。我在一个风电项目里就吃过这个亏——当时用了集成双MAC的SoC,结果PHY被雷击浪涌打坏了两路,整个SoC都得换,交货期直接拖了两个月。
但如果是消费级或者大批量产品,集成方案成本更低、PCB面积更小。现在很多MCU和MPU都内置了双MAC,比如NXP的i.MX系列、TI的AM64x。这时候你只需要外挂两个PHY芯片就行。
关键选型要点:
- MAC 侧:确认支持RGMII/RMII接口,最好带独立的DMA通道。双MAC必须有两个独立的DMA,否则数据包排队时会互相阻塞。
- PHY 侧:关注MDIO管理接口是否独立。有些PHY共用MDIO地址,你得确保能分别访问。
- 时钟:两个PHY最好用独立的晶振。共用时钟?我曾经遇到过,一个PHY的时钟抖动会串扰到另一个,导致丢包率飙升。
2.2 PCIe 与 USB 接口对比:谁更适合双网口?
好,MAC和PHY选完了,接下来是接口。你打算把网口控制器挂到CPU的PCIe上,还是走USB?
嗯,这里要注意,这两个方案差别很大。我直接上表格对比:
| 对比项 | PCIe 方案 | USB 方案 |
|---|---|---|
| 带宽 | 单通道PCIe 2.0可达5GT/s,轻松跑满千兆 | USB 3.0理论5Gbps,但实际受协议开销影响 |
| 延迟 | 极低,适合工业实时控制 | 较高,USB协议栈有额外延迟 |
| CPU占用 | 低,硬件DMA卸载 | 高,需要CPU参与协议处理 |
| 热插拔 | 不支持(标准PCIe) | 原生支持 |
| 成本 | 较高,需要PCIe switch或更多CPU lane | 较低,USB hub便宜 |
| 冗余独立性 | 高,每个网口独占lane | 中,共用USB控制器有单点故障风险 |
看到这个表,你可能会问:「那是不是无脑选PCIe?」
别急。我做过一个边缘计算盒子,客户要求双网口冗余,但CPU只有一路PCIe。怎么办?加PCIe switch?成本上去了。后来我用了USB 3.0转双千兆网口的方案,配合一个USB hub。虽然延迟高了点,但客户场景是数据采集,不是运动控制,完全够用。
我的经验之谈:
如果CPU有足够的PCIe lane,优先用PCIe。每个网口独占一个lane,这才是真正的物理隔离。如果lane不够,可以考虑用PCIe switch,但要注意switch本身也是单点故障——选工业级、带BIST(内建自测试)的型号。
USB方案适合成本敏感、对延迟不敏感的场景。但记住:不要两个网口共用一个USB控制器。我曾经在项目里偷懒,一个USB控制器挂两个USB网卡,结果控制器挂了,两个网口同时掉线——冗余了个寂寞。
2.3 双网口硬件设计的避坑指南
讲到这里,我把自己踩过的坑总结一下,你们直接拿去用:
- 电源隔离:两个PHY的电源域要独立。我见过一个设计,两个PHY共用一路3.3V,结果一个PHY短路,另一个也跟着掉电。加个磁珠或者独立的LDO,成本不高,但能救命。
- 复位信号:两个PHY的复位引脚要分开控制。这样如果一个PHY死机了,你可以单独复位它,不影响另一个。
- 中断引脚:每个PHY的中断要接到CPU的不同GPIO上。共用中断?那你就等着在中断处理函数里猜是谁触发的吧。
- PCB布局:两个网口的变压器、RJ45座子要拉开距离,至少保持1cm以上。电磁干扰会串扰,尤其是大功率设备旁边。
警告:千万不要在双网口设计中共用同一路MDC/MDIO总线来管理两个PHY,除非你非常清楚地址冲突和时序问题。我见过一个团队,两个PHY的MDIO地址都设成了0x01,结果死活读不到第二个PHY的寄存器——查了三天才发现是地址冲突。
2.4 一个实际的双网口硬件框图
说了这么多,我画个简单的框图,你们感受一下:
+-------------------+ +------------------+
| CPU | | PHY #1 (独立) |
| +-------------+ | | +--------------+ |
| | MAC #1 (DMA)|--RGMII--+--| 千兆PHY芯片 |--RJ45
| +-------------+ | | +--------------+ |
| +-------------+ | +------------------+
| | MAC #2 (DMA)|--RGMII--+--+------------------+
| +-------------+ | | | PHY #2 (独立) |
| | | | +--------------+ |
| 电源域1: 3.3V_A | | | | 千兆PHY芯片 |--RJ45
| 电源域2: 3.3V_B | | | +--------------+ |
+-------------------+ | +------------------+
| 注意:两个PHY的电源、复位、中断完全独立
这个图里,两个MAC各自有独立的DMA通道,两个PHY的电源域完全隔离。你想想看,即使PHY #1被浪涌打坏了,PHY #2依然能正常工作。这才是真正的物理层冗余。
2.5 小结
嗯,这一章内容不少。总结一下:
- 双网口冗余,物理层必须真独立——独立的MAC、独立的PHY、独立的电源、独立的复位。
- PCIe方案性能好、延迟低,适合工业实时场景;USB方案成本低、支持热插拔,适合数据采集类应用。
- 选型时别只看芯片手册,多想想「如果这个芯片挂了,另一个还能不能活」。
下一章我会讲链路层冗余——也就是怎么让两个网口在软件层面协同工作。到时候会涉及 bonding、VRRP 这些协议。咱们下章见。