2. 100BASE-T1 PHY寄存器读写与回环测试

任务说明

本案例通过 MDIO 管理接口访问 100BASE-T1 PHY 的寄存器:先读取 PHY 标识寄存器确认链路可用,再写入基本控制寄存器进入内部数字回环(loopback)模式,最后通过 MAC 侧发送一帧测试数据并读回,验证 PHY 数字通路(MAC↔PHY 的 MII 收发路径)基本功能正常。

环境依赖:Linux 主机 + 支持 MDIO 的网卡驱动(如 mdio-tools 提供的 mdio 命令),或嵌入式平台上的 mii-tool/ethtool。本案例以 mdio-tools 为例,PHY 地址假设为 0,寄存器地址遵循 IEEE 802.3 Clause 22。

关键寄存器与流程

  • Reg 0x00 基本控制:bit14=Loopback,bit15=Soft Reset,bit12=Auto-Negotiation Enable。
  • Reg 0x01 基本状态:bit2=Link Status。
  • Reg 0x02/0x03 PHY ID1/ID2:用于确认 PHY 存在。
主机 / MAC mdio 命令 100BASE-T1 PHY 寄存器 0x00~0x03 内部回环 TX→RX 数字通路 1. 读 PHY ID (0x02/0x03) → 确认 PHY 存在 2. 写 0x00 bit14=1 → 进入内部回环 3. 发送测试帧 → 读回 RX 数据比对 4. 写 0x00 bit14=0 → 退出回环

完整实现代码

以下脚本使用 mdio 命令完成寄存器读写与回环配置,并通过 ping 发送测试帧验证数字通路。脚本需 root 权限运行。

#!/bin/bash
# 100BASE-T1 PHY 寄存器读写与回环测试
# 依赖: mdio-tools (mdio 命令), iproute2
set -e

PHY_ADDR=0          # PHY 地址
BUS="mdio-bus"      # MDIO 总线名,按实际平台修改
IFACE="eth0"        # 承载 PHY 的 MAC 接口

# --- 1. 读 PHY ID 确认存在 ---
echo "[1] 读取 PHY ID"
id1=$(mdio $BUS $PHY_ADDR 0x02)
id2=$(mdio $BUS $PHY_ADDR 0x03)
echo "  PHY ID1=0x$id1  ID2=0x$id2"
if [ "$id1" = "0000" ] && [ "$id2" = "0000" ]; then
  echo "  PHY 无响应,检查地址/总线"; exit 1
fi

# --- 2. 进入内部回环 ---
echo "[2] 配置内部回环"
ctrl=$(mdio $BUS $PHY_ADDR 0x00)
echo "  原 0x00 = 0x$ctrl"
# bit14 = Loopback
new_ctrl=$(printf "%04x" $(( 0x$ctrl | 0x4000 )))
mdio $BUS $PHY_ADDR 0x00 $new_ctrl
echo "  写 0x00 = 0x$new_ctrl (Loopback=1)"

# --- 3. 发送测试帧并验证 ---
echo "[3] 发送测试帧"
ip link set $IFACE up
if ping -I $IFACE -c 3 -W 1 192.0.2.1 > /tmp/loop.log 2>&1; then
  echo "  回环帧收发成功"
  RESULT=0
else
  echo "  回环帧收发失败,检查 PHY 配置"
  RESULT=1
fi
cat /tmp/loop.log

# --- 4. 退出回环 ---
echo "[4] 退出回环"
mdio $BUS $PHY_ADDR 0x00 $ctrl
echo "  恢复 0x00 = 0x$ctrl"

exit $RESULT

运行与验证

  1. 确认 mdio 命令可用:mdio 无参数应打印用法;否则安装 mdio-tools。
  2. 确认 MDIO 总线名:ls /sys/class/mdio_bus/,将脚本中 BUS 改为实际名称。
  3. 以 root 运行脚本:sudo bash phy_loopback.sh。
  4. 判定标准:步骤 1 的 PHY ID 非全 0;步骤 3 的 ping 返回 0(回环帧被 PHY 内部环回并被 MAC 接收);脚本退出码为 0。

若 ping 失败,先确认 PHY 是否支持 Clause 22 内部回环(部分 100BASE-T1 PHY 使用厂商扩展寄存器,需查数据手册替换寄存器地址)。