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
读取 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)。
位 | 字段 | 类型 | 复位 | 说明 |
---|---|---|---|---|
15:12 | 保留 | R/O | 0 | 保留 |
11:8 | LED_1 控制 | R/W | 0101 | LED_1 控制:选择 LED_1 的源。
针对 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);
参数:
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 寄存器确定。若要检查链路极性:
例如,若要将两个 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。
位 | 字段 | 权限 | 寄存器偏移 | 复位 | 说明 | |
---|---|---|---|---|---|---|
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)。
位 | 字段 | 权限 | 寄存器偏移 | 复位 | 说明 | |
---|---|---|---|---|---|---|
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 上的通信
|
|||
8 | R/- | R/- | 环路端口 0
|
|||
7 | R/- | R/- | 端口 3 上的物理链路 – TI ESC 中不可用 | |||
6 | R/- | R/- | 端口 2 上的物理链路 – TI ESC 中不可用 | |||
5 | R/- | R/- | 端口 1 上的物理链路 | |||
4 | R/- | R/- | 端口 0 上的物理链路
|
|||
3 | R/- | R/- | 保留 | |||
2 | R/- | R/- | 增强型链路检测
|
|||
1 | R/- | R/- |
|
|||
0 | R/- | R/- |
|
EtherCAT 对端口 OPEN/CLOSE 的定义是:如果没有链路,则端口不能为 OPEN(允许通信),必须为 CLOSE(无通信)。