ZHCAAA1A December   2017  – May 2021 AM3351 , AM3352 , AM3354 , AM3356 , AM3357 , AM3358 , AM3358-EP , AM3359 , AM4372 , AM4376 , AM4377 , AM4378 , AM4379 , AM5706 , AM5708 , AM5716 , AM5718 , AM5726 , AM5728 , AM5729 , AM5746 , AM5748 , AM5749 , DP83822H , DP83822HF , DP83822I , DP83822IF , DP83825I

 

  1.   商标
  2. 1PHY 选择和连接
  3. 2PHY 复位和地址
  4. 3PHY 速度、双工等
  5. 4增强型链路检测
  6. 5在 Processor SDK 中添加 PHY
  7. 6结论
  8. 7参考文献
  9. 8修订历史记录

增强型链路检测

读取 PHY 状态寄存器后,可通过使用 MDIO 内部状态机来更新 MDIOLINK 寄存器中的链路状态。此外,也可以通过使用 MLINK 输入引脚来确定链路状态,具体取决于 MDIOUSERPHYSELn 寄存器中的 LINKSEL 位。基于 MDIO 状态机的检测速度很慢,因为 MDIO 控制器到 PHY 之间有一条串行链路用于传播讯息,通常需要的时间为 200 至 250µs。MLINK/mii_rxlink 检测发生的速度与 PHY 切换链路的速度一样快,通常在 10µs 内完成,这得益于 DP83822 器件先进的链接断开能力,该器件使用诸如 RX 误差计数、MLT3 误差计数、低 SNR 阈值以及信号和能量损失等标准来快速检测链路中断。

若要支持电缆冗余,必须快速进行链路中断检测,这需要 10 至 15µs 的链路中断检测时间。此持续时间为两到三个最小尺寸的 EtherCAT 帧,这是在链路故障或电缆断裂事件中可丢弃的最大值。

MDIOUSERPHYSELn 寄存器中的链路状态确定选择 (LINKSEL) 位通过使用 MLINK 引脚(将其设置为 1)来确定链路状态。默认值为 0,这说明链路状态由 MDIO 状态机确定。

PRU-ICSS 的 pr1_mii0_rxlink 和 pr1_mii1_rxlink 引脚(分别连接到 PHY 的 LED_LINK 或 LED_SPEED 引脚)作为 MLINK 信号连接到 MDIO。根据 PHY 自举设置,不同电路板上的链路极性不同,必须通过读取 MDIOLINK 寄存器为每个电路板进行调整。连接到 LED_LINK 引脚时,将 LED_LINK 控制模式设置为 LINK_OK(而不是 RX/TX 活动),以防止间歇性 RX/TX 流量导致链路检测失败(请参阅 表 4-1)。

表 4-1 LED 配置寄存器 1 (LEDCFG1)
字段 类型 复位 说明
15:12 保留 R/O 0 保留
11:8 LED_1 控制 R/W 0101 LED_1 控制:选择 LED_1 的源。
  • 0000 =链路正常
  • 0001 = RX/TX 活动
  • 0010 = TX 活动
  • 0011 = RX 活动
  • 0100 = 碰撞
  • 0101 = 速度,对于 100Base-TX 较高
  • 0110 = 速度,对于 10Base-Te 较高
  • 0111 = 全双工
  • 1000 = 链路正常,针对 TX/RX 活动闪烁
  • 1001 = 有源拉伸信号
  • 1010 = MII 链路 (100BT+FD)
  • 1011 = LPI 模式
  • 1100 = TX/RX MII 错误
  • 1101 = 链路中断
  • 1110 = 针对 PRBS 错误闪烁,LED 在清除 BMCR 寄存器(地址 0x0001)之前保持亮起状态。
  • 1111 = 保留
链路中断,LED 在读取 BMCR 寄存器(地址 0x0001)之前保持亮起状态。

针对 PRBS 错误闪烁,LED 针对单个错误保持亮起状态,并且在清除 BICSR1 寄存器(地址 0x001B)之前保持亮起状态。

7 :4 LED_3 控制 (RX_D3) R/W 0101 LED_3 控制:选择 RX_D3 的源。参考位 [11:8],以获取源列表。
3:0 保留 R/W 0001 保留

如果增强型链路检测引脚连接到 AMIC110 ICE 上的 PHY_LED1,并且 PHY 配置设置为 LED1 针对活动闪烁,那么每当有活动时,在 MDIO 看来,链路正在打开和关闭,这会导致增强型链路检测失败。这不是针对增强型链路检测的正确 LED1 活动配置。此时应将 LED1 配置为指示 LINK OK(链路正常)。

若要更新源(LINK OK 而不是 RX/TX 活动)的 LED 配置,请使用 API:


Board_phyLED1Config((((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), phy0addr, LED_CFG_MODE0);
Board_phyLED1Config((((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), phy1addr, LED_CFG_MODE0);

其中 LED_CFG_MODE0 表示 0000 = LED_1 控制位中的 LINK OK。

若要启用增强型链路检测, 请使用 Board_phyFastLinkDownDetEnable( ) API 来配置 PHY 控制寄存器 3, 使用下列宏的任意组合作为其参数 val。

#define FAST_LINKDOWN_SIGENERGY        1u
#define FAST_LINKDOWN_LOWSNR           (1u<<1)
#define FAST_LINKDOWN_MLT3ERR          (1u<<2)
#define FAST_LINKDOWN_RXERR            (1u<<3)
void Board_phyFastLinkDownDetEnable(uint32_t mdioBaseAddress, uint32_t phyNum, uint8_t val);

当 PHY 没有 LED_LINK 或 LED_SPEED 信号,并且 pr1_mii0_rxlink 和 pr1_mii1_rxlink 信号可保持浮动时,还可在 MDIO 初始化期间通过使用 DISABLE 宏(而不是 ENABLE)来禁用增强型链路检测功能。

Int16 bsp_pruss_mdio_init (t_mdio_params *pmdio_params);

参数:

  • pmdio_params – 指向 PRU-ICSS MDIO 初始化参数结构的指针
  • pmdio_params->clkdiv – MDIO clkdiv
  • pmdio_params->addr0 – 连接到 PRU-ICSS MII0 的 PHY 的地址
  • pmdio_params->addr1 – 连接到 PRU-ICSS MII1 的 PHY 的地址
  • pmdio_params->link0pol – 连接到 PRU-ICSS MII0 的 PHY 的 LINK_MII 信号极性
  • pmdio_params->link1pol – 连接到 PRU-ICSS MII1 的 PHY 的 LINK_MII 信号极性
  • mdio_params->enhancedlink_enable – 启用增强型链路检测功能

MDIO 初始化参数的结构:

typedef struct {
 Uint16 clkdiv;
 Uint8 addr0;
 Uint8 addr1;
 Uint8 link0pol; //1: 低电平有效 0:高电平有效
 Uint8 link1pol; //1: 低电平有效 0:高电平有效
 Uint8 enhancedlink_enable;
} t_mdio_params;

如果启用了增强型链路检测功能, 则链路极性对 EtherCAT 非常重要。启用增强型链路检测功能后, 链路极性参数 link0pol 和 link1pol 的设置 由 MDIOLINK 寄存器确定。若要检查链路极性:

  1. 使用 MDIO 连接寄存器。
  2. 将以太网线从 PC 插入 DUT 端口。
  3. 观察任何变化,然后相应地调整 bsp_pruss_mdio_init( ) 中的链路极性字段。

例如,若要将两个 PHY 的极性均设置为 HIGH,请参阅以下内容:

 
    #define TIESC_LINK0_POL   TIESC_LINK_POL_ACTIVE_HIGH
    #define TIESC_LINK1_POL   TIESC_LINK_POL_ACTIVE_HIGH
    PRUICSS_V1_Object *object;
    object = (PRUICSS_V1_Object *)pruIcssHandle->object;
mdioParamsInit.addr0 = Board_getPhyAddress(object->instance, 1);
    mdioParamsInit.addr1 = Board_getPhyAddress(object->instance, 2);
    mdioParamsInit.enhancedlink_enable = TIESC_MDIO_RX_LINK_ENABLE;
    if(TIESC_MDIO_RX_LINK_ENABLE == mdioParamsInit.enhancedlink_enable)
    {
        //Enhanced link detection enabled
        mdioParamsInit.link0pol = TIESC_LINK0_POL;
        mdioParamsInit.link1pol = TIESC_LINK1_POL;
    }
    else
    {
        //Enhanced link detection disabled
        mdioParamsInit.link0pol = TIESC_LINK_POL_ACTIVE_HIGH;
        mdioParamsInit.link1pol = TIESC_LINK_POL_ACTIVE_HIGH;
    }
    bsp_pruss_mdio_init(pruIcssHandle, &mdioParamsInit);

TI EtherCAT 实现还提供了一些与 PHY 相关的寄存器,这些寄存器 在调试 PHY 配置时很有帮助,例如请参阅 表 4-2

表 4-2 EtherCAT 中的 PHY 寄存器
字段 权限 寄存器偏移 复位 说明
ECAT PDI
31:0 PRU MII RX LINK 极性 R/- R/W 0x0E0C 0b 链路 LED 信号极性 PHY 地址 N(位 N)
7:0 Port0 PHY 地址 R/- R/W 0x0E08 0 指定连接到 PRU 固件物理端口 0 的 PHY 的 PHY 地址
7:0 Port1 PHY 地址 R/- R/W 0x0E09 0 指定连接到 PRU 固件物理端口 1 的 PHY 的 PHY 地址

PHY 链路状态和端口状态反映在标准 EtherCAT 数据链路 (DL) 状态寄存器中(请参阅 表 4-3)。

表 4-3 EtherCAT 中的数据链路状态寄存器
字段 权限 寄存器偏移 复位 说明
ECAT PDI
15 R/- R/- 端口 3 上的通信 – TI ESC 中不可用
14 R/- R/- 环路端口 3 – TI ESC 中不可用
13 R/- R/- 端口 2 上的通信 – TI ESC 中不可用
12 R/- R/- 环路端口 2
11 R/- R/- 端口 1 上的通信
10 R/- R/- 环路端口 1
9 R/- R/- 端口 0 上的通信
  • 0 = 无稳定通信
  • 1 = 已建立通信
8 R/- R/- 环路端口 0
  • 0 = 已打开
  • 1 = 已关闭
7 R/- R/- 端口 3 上的物理链路 – TI ESC 中不可用
6 R/- R/- 端口 2 上的物理链路 – TI ESC 中不可用
5 R/- R/- 端口 1 上的物理链路
4 R/- R/- 端口 0 上的物理链路
  • 0 = 无链路
  • 1 = 检测到链路
3 R/- R/- 保留
2 R/- R/- 增强型链路检测
  • 0 = 在所有端口上停用
  • 1 = 在至少一个端口上激活
1 R/- R/-
  • 0 = PDI 看门狗已过期
  • 1 = PDI 看门狗已重新加载
0 R/- R/-
  • 0 = EEPROM 未加载,PDI 不工作(不访问 PD RAM)
  • 1 = EEPROM 已正确加载,PDI 工作(访问 PD RAM)
注:

EtherCAT 对端口 OPEN/CLOSE 的定义是:如果没有链路,则端口不能为 OPEN(允许通信),必须为 CLOSE(无通信)。