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 對其進行配置。AMIC110 中 PRU-ICSS 內的 MDIO 采用 802.3 串行管理接口 (SMI),可通過使用共享雙線總線同時詢問和控制兩個以太網 PHY。DP83822 器件中的 SMI 符合 IEEE 802.3 第 22 條和第 45 條的要求,可訪問其內部寄存器空間,包括標準寄存器組 0 至 31、采用寄存器控制寄存器(REGCR,地址 0x000D)的擴展寄存器組以及數據寄存器(ADDAR,地址 0x000E),以獲取狀態信息和配置。
以太網自動協商功能提供了一種機制,可通過突發脈沖在鏈路段兩端之間交換配置信息,如速度和雙工。自動協商功能可確保根據鏈路伙伴和本地器件的廣播能力選擇最高性能協議。可在硬件中使用 AN_EN 自舉啟用或禁用自動協商功能,也可使用基本模式控制寄存器(BMCR,地址 0x0000)中的位 [12] 并通過寄存器配置來啟用或禁用該功能。
在 PRU-ICSS EtherCAT 軟件中,使用 MDIO 的 PHY 初始化的調用流程如下:
Phy_reset( )
|
Task_create(task1,&taskParams, NULL);
|
BIOS_start();
其中 MDIO 和 PHY 初始化是在 task1 中執行:
task1() -> Hw_init( ) --> bsp_init( ) -> bsp_pruss_mdio_init( ) -> bsp_ethphy_init( )
Hw_init( ) – EtherCAT 從接口初始化
bsp_init() – PRU 初始化
使用 CSL 函數 CSL_MDIO_init() 通過 bsp_pruss_mdio_init() 對 MDIO 進行初始化,其中輸入和輸出時鐘用作參數。
/** ============================================================================
* @n@b CSL_MDIO_init
*
* \brief 此 API 初始化 MDIO 外設。這可啟用 MDIO 狀態
* 機,使用標準前導碼并設置時鐘分頻器值。
*
* \param baseAddr MDIO 模塊的基地址。
* \param mdioInputFreq MDIO 模塊的時鐘輸入。
* \param mdioOutputFreq MDIO 總線上所需的時鐘輸出。
* =============================================================================
*/
static inline void CSL_MDIO_init(uint32_t baseAddr,
uint32_t mdioInputFreq,
uint32_t mdioOutputFreq);
MDIO PRU 固件與 PHY 通信時需要對 PRU-ICSS 進行初始化,因此必須在 PRU-ICSS 域上電之后執行 PRU-ICSS 的初始化,然后在兩個 PRU 上加載并執行 PRU 固件。
MDIO 完成初始化后,可以通過 CSL 函數 CSL_MDIO_phyRegRead() 和 CSL_MDIO_phyRegWrite() 訪問 PHY,以配置以下內容:
/** ============================================================================
* @n@b CSL_MDIO_phyRegRead
*
* \param baseAddr MDIO 模塊的基地址。
* \param phyAddr PHY 地址。
* \param regNum 要讀取的寄存器編號。
* \param pData 寫入讀取值的指針。
*
* \retval TRUE 讀取成功。
* \retval FALSE 未正確確認讀取。
* =============================================================================
*/
static inline Uint32 CSL_MDIO_phyRegRead(uint32_t baseAddr,
Uint32 phyAddr,
Uint32 regNum,
Uint16 *pData)
/** ============================================================================
* @n@b CSL_MDIO_phyRegWrite
*
* \brief 此 API 使用 MDIO 寫入一個 PHY 寄存器。
*
* \param baseAddr MDIO 模塊的基地址。
* \param phyAddr PHY 地址。
* \param regNum 要寫入的寄存器編號。
* \param wrVal 要寫入的值。
* =============================================================================
*/
static inline void CSL_MDIO_phyRegWrite(uint32_t baseAddr,
uint32_t phyAddr,
uint32_t regNum,
uint16_t wrVal);
大多數 MDIO PHY 配置函數都集成在 Processor SDK 的電路板庫中。
例如,若要啟用 0x0019 PHY 控制寄存器 (PHYCR) 中的自動 MDIX 位,請參閱以下內容:
Board_enablePhyAutoMDIX((((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr0);
若要啟用 0x000A 控制寄存器 2 (CR2) 中的擴展全雙工模式位,請參閱以下內容:
Board_phyExtFDEnable((((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), phy0addr);
要啟用 0x000A 控制寄存器 2 (CR2) 中的奇半字節插入位,請參閱以下內容:
Board_phyODDNibbleDetEnable((((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), phy0addr);
用戶也可以直接調用 CSL 函數來管理 PHY,例如關閉 RMII 模式并選擇 MII 模式,具體請參閱以下內容:
phyregval = 0;
CSL_MDIO_phyRegWrite((((PRUICSS_HwAttrs *)(pruIcssHandle->hwAttrs))->prussMiiMdioRegBase), pmdio_params->addr0, TLKPHY_RCSR_REG, phyregval);
使用 Code Composer Studio? 中的內存瀏覽器或寄存器窗口通過 USERACCESS0/1 寄存器讀取 PHY 和寫入 PHY,這是對 PHY 問題進行故障排除的一種有效現場調試功能(請參閱 表 3-1)。
| 位 | 字段 | 類型 | 復位 | 說明 |
|---|---|---|---|---|
| 31 | GO | R/W/S | 0 | Go.向此位寫入 1 會使 MDIO 狀態機在其方便時執行 MDIO 訪問(這不是一個瞬間過程)。將 0 寫入此位無影響。僅當啟用了 MDIO 狀態機時,此位才可寫。當請求的訪問完成后,此位將自行清除。當 GO 位為 1 時,系統將阻止對 MDIOUSERACCESS0 寄存器的任何寫入。如果使用的是字節訪問,則應最后寫入 GO 位。 |
| 30 | WRITE | R/W | 0 | 寫入啟用。將此位設為 1 會使 MDIO 事務成為一個寄存器寫入,否則為一個寄存器讀取。 |
| 29 | ACK | R/W | 0 | 確認。如果 PHY 確認了讀取事務,則設置此位。 |
| 28:26 | 保留 | R | 0 | 保留 |
| 25:21 | REGADR | R/W | 0 | 寄存器地址。指定此事務要訪問的 PHY 寄存器。 |
| 20:16 | PHYADR | R/W | 0 | PHY 地址。指定此事務要訪問的 PHY。 |
| 15:0 | 數據 | R/W | 0 | 用戶數據。從指定 PHY 寄存器讀取或寫入該寄存器的數據值。 |
若要在內存瀏覽器或寄存器窗口中讀取 PHY,請執行以下步驟:
若要在內存瀏覽器或寄存器窗口中寫入 PHY,請執行以下步驟:
若要驗證 PHY 是否成功連接,用戶可以查看基地址偏移處的 MDIOALIVE 和 MDIOLINK 寄存器 0x04 和 0x08。
如果 PHY 確認了對 PHY 的最近一次訪問,則設置 MDIOALIVE 寄存器的 32 位中的每一位,其地址對應于寄存器位數。如果 PHY 無法確認該次訪問,則會將該位復位。對 PHY 的用戶訪問和輪詢訪問都會導致對相應活動位的更新。這些活動位僅用于用相應地址表示 PHY 的存在或缺失。對任何位寫入 1 都會將該位清除;寫入 0 則無影響。
讀取 PHY 的狀態寄存器后,MDIOLINK 寄存器將更新。如果 PHY 與相應地址的鏈路接通,并且 PHY 確認讀取事務,則設置該位。如果 PHY 指示它沒有鏈路或無法確認讀取事務,則將該位復位。寫入寄存器無影響。此外,可以使用 MLINK 輸入引腳來確定 MDIOUSERPHYSELn 寄存器中指定的兩個 PHY 的狀態。此選擇由 MDIOUSERPHYSELn 寄存器中的 LINKSEL 位確定。
圖 3-1 顯示了在 AMIC110 ICE 上捕獲的 Code Composer Studio PRU 寄存器窗口的一個快照。此快照指示存在兩個 PHY (MDIOALIVE = 0x0002002),并且具有地址 0x1 鏈路的 PHY 已接通 (MDIOLINK = 0x00000002)。
圖 3-1 Code Composer Studio 中的 MDIO 寄存器TI 的 EtherCAT 實現中提供了多個 PRU-ICSS MDIO 主機 API,這些 API 可用于讀取/寫入 PHY 寄存器以及查詢 PHY 鏈路狀態。例如,請參閱以下內容:
Int16 bsp_pruss_mdio_phy_read (Uint8 phyaddr, Uint8 regoffset, Uint16 *regval);參數:
Int16 bsp_pruss_mdio_phy_write (Uint8 phyaddr, Uint8 regoffset, Uint16 regval);參數:
Uint32 bsp_pruss_mdio_phy_link_state (Uint8 phyaddr);參數:
bsp_pruss_mdio_phy_link_state( ) API 考慮 MII_LINK 信號極性差異,建議在啟用 TIESC_MDIO_RX_LINK_ENABLE 的情況下使用該 API 來增強鏈路檢測。