ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

车载以太网转换板开发实录:百兆正常千兆CRC错误的排查与修复

车载以太网转换板开发实录:百兆正常千兆CRC错误的排查与修复 前阵子给车载以太网测试平台做一块转换板需求看起来特别简单能把车上的 100BASE-T1/1000BASE-T1 转到标准以太网输出端百兆、千兆可手动切换。真正动手之后才发现“可切换”这三个字几乎每一个字都是坑。板子跑起来之后标准侧那颗 YT8521 在百兆模式下一直很乖一旦切到千兆接收方向的硬件 CRC 错误就呼呼往上飙丢包丢到没法看。这篇文章就是把项目从需求拆解、选型、硬件设计、速率切换控制到 CRC 问题完整排查的过程都写出来给同样在做车载以太网转换、DoIP 测试设备或者准备碰百兆/千兆切换 PHY 的朋友一点参考。1. 需求拆解为什么车载以太网转换必须“百兆千兆都能切”1.1 两种车载速率并存是现实车载以太网并不是一个速率吃到底。100BASE-T1 起步早主要用在诊断DoIP、摄像头、部分控制域成本低、线束少至今仍是不少 ECU 的标准接口1000BASE-T1 是后起的骨干网方案用于域控制器之间通信、激光雷达/环视这种高带宽传感器速率高但器件成本也明显更高。实际测试场景里两种车都有。手里只拿一个只管百兆的转换器碰到千兆车型直接歇菜只做千兆的话接到百兆 ECU 上又可能因为自动协商不兼容而完全不通。所以转换设备必须支持“输入侧某种车载速率 输出侧标准以太网速率”的双向可配置而且要能在百兆和千兆之间手动切不能只靠运气让对端去自适应。1.2 转换器真正要服务的几类场景我做过不少车载诊断和测试设备这类转换器至少有三个应用场合需求侧重点还不一样研发调试台架上把 ECU 的车载以太网口引到 PC 网卡抓包、看报文、做协议分析。这里要求双向透传、时延低、不要动报文内容。产线和售后诊断通过 OBD 诊断口跑到 DoIP 流程车上有百兆也有千兆诊断仪要能自动匹配。数据记录仪/网关开发长时间录制车载以太网总线数据要求大流量下不丢包、不掉链。这些场景叠在一起意味着转换器不能只是“物理层直通”最好还能在桥接过程中做一些速率适配和链路状态上报这就是后面选择 MCU双 MAC 方案而不是简单 PHY 背靠背的根本原因。1.3 三种“可切换”实现路线选错会多花几个月做之前我把市面上能走通的方案都理了一遍大致三条路方案实现方式优点缺点A标准侧 PHY 靠自动协商自适应不做主动控制最简单硬件不需要额外改动“切换”是结果不是控制T1 侧速率无法干预对端不配合就傻眼B拨码开关/GPIO MDIO 写 PHY 能力寄存器主动裁剪百兆或千兆成本低、可控、稳定切换逻辑可软件化需要自己写驱动要理解 PHY 自动协商寄存器细节C双 PHY 交换芯片/FPGA做两条独立链路热切换切换零中断性能最好成本高、电路复杂、开发周期长我最终选了 B。理由很实际成本低逻辑可控切换时虽然会短暂断链但诊断和测试场景完全能接受这点中断关键是它把“速率切换”变成纯粹的控制面动作后续要接上位机也好扩展。2. 硬件架构和器件选型T1 侧和标准侧必须分开设计2.1 整体架构T1 PHY 桥接 MCU 标准侧 PHY转换板的基本信号链路是这样走的双向对称车载以太网 T1 接口 → T1 PHY → MII/RGMII → 桥接 MCU 的 MAC_A → 内部二层转发 → MAC_B → RGMII → 标准侧 PHYYT8521→ RJ45T1 侧需要根据项目支持的速率选 PHY如果只做 100BASE-T1一颗单速 T1 PHY 就够如果希望同一颗芯片兼顾 100BASE-T1 和 1000BASE-T1需要选支持双速率的 T1 PHY市面上几个主流车载 PHY 厂商都有这类产品。我这边因为要同时兼容两种车载速率直接选了双速率型号这样 T1 侧不用做两套硬件。桥接 MCU 是整个板子的核心我选了一颗带两个独立千兆 MAC 的高端 MCU。选型的硬性指标是两个 MAC 都要支持 RGMII否则千兆带宽跑不满百兆切千兆时很容易成为瓶颈。如果预算敏感也可以用小规模 FPGA 代替 MCU 做桥接但开发灵活性会差一些。2.2 为什么不直接 PHY 背靠背很多第一次做媒体转换的人会问T1 PHY 出来的 MII/RGMII 直接接到标准 PHY 不就行了中间为什么要塞一个 MCU原因是普通 PHY 的 MAC 接口不是拿来直接对连的。以太网 PHY 的 MII/RGMII 接口是面向 MAC 的PHY 和 PHY 之间没有标准协议做握手必须有一个 MAC 层的桥接实体来处理帧转发、速率适配和链路管理。除非你能搞到专用的单芯片媒体转换方案否则最稳的做法就是 MCU/FPGA 双 MAC 桥接。这个 MCU 放在这里还有额外好处可以顺便实现抓包、过滤、报错统计、远程复位甚至做协议转换。量产以后用户反馈链路问题我都是靠 MCU 里的计数器和寄存器状态远程定位的这在纯 PHY 背靠背方案里想都不敢想。2.3 YT8521 的接口、电源和时钟设计细节标准侧我选了国产 YT8521原因主要是供货稳定、价格合适支持 10/100/1000M 自适应RGMII/SGMII 都有。但真的调起来才发现百兆和千兆对硬件设计的敏感度完全不在一个量级。接口模式我用的 RGMII。百兆下时钟 25MHz千兆下 125MHz后者对时序要求苛刻得多。电源YT8521 在千兆模式下的功耗明显高于百兆核心电源和 IO 电源的滤波电容留足余量我在实测中发现千兆大流量时电源纹波会从 30mV 涨到 80mV如果这里不加厚去耦电容后期 CRC 问题会非常难查。时钟YT8521 需要外接 25MHz 晶振晶振负载电容必须按手册选误差尽量控制在 25ppm 以内。千兆模式对时钟抖动很敏感百兆下容忍度很高但 125MHz 下时钟抖动稍微超标接收窗口就会劣化。变压器选型也要单独说。标准侧如果走千兆必须用支持 1000BASE-T 的四对线网络变压器不能用百兆两对线的省钱方案否则另外两对差分对会直接没信号。共模扼流圈、中心抽头接法都按 IEEE 802.3 参考设计来别自创。3. 百兆/千兆切换的控制实现从自动协商裁剪到 MCU 状态机3.1 速率切换的本质是裁剪自动协商能力很多人以为“切换速率”就是让 PHY 强制工作在 100M 或 1000M其实更标准的做法是修改 PHY 的自动协商能力寄存器只向对端通告你希望工作的速率然后重启自动协商。这样做的好处是保持标准兼容性对端网卡/交换机不用做任何特殊配置连上就能协商出正确的速率和双工模式。在 YT8521 上百兆相关的通告位在 0x04 寄存器Auto-Negotiation Advertisement千兆相关的通告位在 0x09 寄存器1000BASE-T Control。切到百兆时把 0x04 的 100BASE-TX 全双工位置 1同时把 0x09 的千兆全双工位清 0切到千兆则反过来。这里有个容易踩的坑修改通告寄存器后必须让 PHY 重新发起自动协商否则寄存器改了对端不会感知到新速率。正确流程是先软复位 PHY等链路断开再写能力寄存器最后置位重启自动协商的寄存器位。3.2 MCU 侧的上电初始化和 MDIO 控制逻辑MCU 上电后要干的事比想象中多。第一步是确认 PHY 在线通过 MDIO 读 PHY ID 寄存器读到正确 ID 才继续初始化第二步配置 MAC 侧的速率模式、RGMII 时钟极性、全双工使能第三步把 PHY 的自动协商能力设置成默认值。我建议把速率切换设计成外部输入触发而不是上电写死。板子上保留拨码开关和上位机命令两路控制拨码开关走 GPIO上位机走串口。这样现场调试时不用改代码就能切速率客户拿到手也能自己操作。MDIO 读写一定要加超时和重试机制。实测中 YT8521 复位后如果立刻读寄存器大概率会读到全 0 或者总线上无响应必须等 PHY 内部上电时序跑完再操作。我通常的做法是复位拉低 100ms拉高后再等 200ms才开始 MDIO 枚举。3.3 切换流程与异常降级策略正式切换我做成一个状态机空闲态、等待断链态、配置态、重新协商态、链路稳定态。关键点在于切速率前一定要主动断开链路而不是直接改寄存器让 PHY 懵掉。我先通过寄存器关闭 PHY 的链路通告再软复位这样对端不会收到一堆乱七八糟的协商报文。对端不配合的情况也必须处理。比如选的是千兆但接的是一个百兆对端协商失败后 PHY 会反复 retry。我做了超时判断如果 5 秒内链路没起来自动尝试切到另一档速率。这个逻辑在产线测试时帮了大忙因为产线工人经常不按顺序插线。还有一个细节链路状态检测建议用 PHY 的中断引脚而不是轮询。轮询做得再快也有一两个毫秒延迟还占用 I2C/SPI 总线。YT8521 的 link status change 中断引脚拉低后在中断服务程序里读状态寄存器再触发 MCU 侧的 MAC 配置更新响应速度能到微秒级。4. YT8521 百兆正常、千兆 CRC 错误排查一次被阻抗和时序双重打击的实战记录4.1 故障复现数据面正常、控制面疯狂丢包联调阶段遇到的最诡异问题就是标题里提到的百兆一切正常切到千兆后接收硬件 CRC 错误大量出现。现象是 PC 网卡连着转换器的标准侧用 iperf3 打流百兆模式稳定切到千兆后对端网卡收到的包大量坏包PHY 的接收错误寄存器数值持续增长。一开始我怀疑是 YT8521 芯片质量问题毕竟国产 PHY 刚上手习惯性会先怀疑芯片。但冷静下来想百兆能正常工作说明芯片基本功能没问题千兆才出现的错误大概率出在“千兆才会被放大的短板”上。按这个思路我把排查链路分成物理层、MAC 接口、配置三层。4.2 分层隔离先用 PHY 环回把问题切成两半排查的顺序决定了效率。我做的第一件事不是拿示波器满板子量而是启用 PHY 内部的 digital loopback。把 YT8521 配置成 TX 侧数据直接环回到 RX 侧绕开外部的 RJ45、网络变压器、差分走线这样就能判断问题到底在 PHY/MAC 接口内部还是外部物理链路上。实测结果百兆环回正常千兆环回下 CRC 错误依然存在。这个结果信息量很大——问题至少有一半在 PHY 内部或者 MAC 接口侧而不仅仅是外部链路。因为改环回模式绕开了外部差分对但 MRCC 还是从 MAC 来的 RGMII 信号所以下一步必须查 RGMII 时序。接着我又做了一次反向测试用标准侧外部接一个好用的千兆交换机让 YT8521 自动协商成千兆然后从 MCU 侧用内部 MAC 灌固定报文看 PHY 出口是否有错。结果外部链路没问题但 MAC 接口方向仍有错。到这里嫌疑基本锁定在 RGMII 数据/时钟相位关系上。4.3 用示波器看 RGMII为什么百兆没问题、千兆崩RGMII 在千兆模式下是 125MHz 双沿采样8ns 一个时钟周期数据窗口大约只有 6ns。RGMII 规范要求数据相对于时钟保持大约 2ns 的延迟这个延迟可以在发送端加也可以在接收端加但收发双方必须协调好否则接收方采样的时间点会落在数据翻转沿上。百兆模式下时钟只有 25MHz周期 40ns1~2ns 的相位偏差只占 5% 左右怎么采样都不会错。切到千兆后同样 1~2ns 的偏差占到了 25%直接导致 MAC 采到中间状态CRC 错到飞起。这就是“百兆正常、千兆 CRC 错误”最典型的根因。用示波器测 YT8521 发往 MAC 的 RX_CLK 和 RXD[3:0]发现数据沿和时钟上升沿几乎是重合的没有拉开 2ns 的偏移。再看 MCU 侧的 MAC 配置发现 RGMII 的时钟延迟既没在 PHY 端开启也没在 MAC 端开启两边都在等对方加延迟。4.4 根因确认与最终修复定位后修复就很直接了在 MCU 的 MAC 侧将 RGMII 配置成 ID mode也就是同时启用 TX 和 RX 方向的内部时钟延迟。改完配置后示波器上 RX_CLK 相对 RXD 的相位关系拉开了约 2ns千兆模式下 CRC 错误寄存器慢慢归零长时间打流再没出现坏包。但故事还没完。修完时序后千兆大流量跑半小时后偶发几个 CRC比之前好太多但依然不干净。于是回头看 PCBYT8521 到 RJ45 的千兆差分线走了两对其中一对经过两次过孔换层。用普通万用表量不通但用 TDR 看就能发现有明显的阻抗不连续点。我把那对差分线的过孔改成背钻处理、换层处补齐回流地过孔重新打样后 CRC 彻底清零。这件事给我的教训是千兆链路的问题往往不是单点问题。优先查 RGMII 时序再查 MDI 物理链路两层都处理干净才敢说稳定。5. 车载以太网转换产品的测试与量产前验证5.1 从物理层到协议层的必备测试用例转换器这类设备最怕“在自己桌上能用、到客户车上就挂”。我整理了一套覆盖物理层和协议层的测试用例新项目直接复用物理层用示波器/网络分析仪测标准侧 MDI 的眼图和回波损耗T1 侧用车载专用线束和真实 ECU 对测。速率切换分别接百兆交换机、千兆交换机、百兆车载 ECU、千兆车载 ECU验证所有组合都能协商成功。双向吞吐iperf3 双向同时打流跑 30 分钟观察对端网卡是否正确接管接收 CRC 计数应当为 0。异常场景切换速率过程中插拔网线、对端热重启看 PHY 能不能自动恢复不能死锁。测试用例要落到表格里每条用例都注明预期结果和实测结果不然后面复测根本没有依据。5.2 老化测试与温漂问题量产前老化测试是必须的而且要在高温环境下做。我第一批板子在 85℃ 老化箱里跑千兆大流量 24 小时发现 CRC 错误率会慢慢上升。排查后发现是电源纹波随温度恶化部分电容在高温下容值衰减明显导致 PHY 的电源噪声超标。解决方法是把滤波电容从普通 X5R 全部换成 X7R 甚至 C0G同时加大一级去耦电容容值。换完以后85℃ 下 24 小时老化CRC 计数保持为零。这里的经验是常温下“刚好够”的电源设计在高温下一个都顶不住车载环境必须留足温度余量。5.3 量产前我踩过的几个硬件小坑有几个问题不写在手册里但实际项目里很容易再踩YT8521 复位引脚 RC 时间太短导致上电后 MDIO 读不到芯片。RC 时间常数建议不小于 100ms不要为了省几个电容选几十毫秒的方案。strap 引脚上下拉电阻阻值选得太大导致 PHY 地址偶发错位。strap 电阻尽量靠近 PHY阻值按手册推荐来别用 100k 以上。切换速率时没有先断链对端会收到大量异常协商报文。一定要把“先断链再改配置”写进状态机。T1 侧连接器线序和标准 RJ45 不同调试时拿 RJ45 线去怼 T1 口结果两个设备都显示链路 UP 但报文全丢。这个问题看起来蠢但现场非常容易发生建议在板子上印清楚线序。最后再说一个排查技巧如果以后再遇到 PHY 百兆正常、千兆 CRC 多的问题我的建议是先别怀疑芯片也别急着换板子。第一件事是开 PHY 内部数字环回把问题切成“接口内部”和“物理链路”两半第二件事是拿示波器看 RGMII 数据与时钟的相位关系确认发端和收端有没有哪一边漏配了延迟第三件事才轮到查 MDI 走线阻抗、变压器和电源纹波。这套流程听着简单但真能帮你省掉一大半盲调的时间。我在这次项目里就是按这个顺序一步步找到根因的希望也能帮到正在和 CRC 搏斗的你。
返回列表