ZHCAAA1A December 2017 – May 2021 AM3351 , AM3352 , AM3354 , AM3356 , AM3357 , AM3358 , AM3358-EP , AM3359 , AM4372 , AM4376 , AM4377 , AM4378 , AM4379 , AM5706 , AM5708 , AM5716 , AM5718 , AM5718-HIREL , 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(無通信)。