????你好,這邊移植 TCP/IP 協(xié)議棧時,發(fā)現(xiàn)一個問題,在網(wǎng)線一直插入的情況下,通過 BMCR 重啟自動協(xié)商后,功能異常。
????手動啟動協(xié)商后,ALPAR 以及 PHYSR 不能正確指示工作狀態(tài)(通過對端網(wǎng)管交換機可以看到鏈路工作狀態(tài),但是與 ALPAR 以及 PHYSR 指示的狀態(tài)不匹配),測試外置 PHY 沒有該問題,請教該如何處理
注一:網(wǎng)線未插拔,手動啟動協(xié)商狀態(tài)異常
注二:手動啟動協(xié)商時,如果手動插拔一下網(wǎng)線,ALPAR 及 PHYSR 正常,但再次手動啟動協(xié)商時異常
注三:PHY 狀態(tài)管理使用定期輪詢方式,未使用 PHYLINK 中斷
注四:現(xiàn)在我的解決方案是 HOOK 了 ETH_WritePHYRegister() 這個函數(shù),當檢測到 BMCR 寫入自動協(xié)商命令時,強制關閉 10M PHY 時鐘并等待一段時間以后,再次開啟該時鐘,也就是實際上不執(zhí)行手動自動協(xié)商命令,短暫測試方案可行,不知道有沒有隱患。
測試代碼如圖:
????for?(?;;?)?{ ??????printf?("PHY:\r\n"); ??????uint16_t?BMCR??=?ETH_ReadPHYRegister?(1,?0x00); ??????uint16_t?BMSR??=?ETH_ReadPHYRegister?(1,?0x01); ??????uint16_t?ALPAR?=?ETH_ReadPHYRegister?(1,?0x05); ??????uint16_t?PHYSR?=?ETH_ReadPHYRegister?(1,?0x10); ??????uint16_t?MDIX??=?ETH_ReadPHYRegister?(1,?0x1E); ??????printf?("?BMCR:?%04X\r\n",?BMCR); ??????printf?("?BMSR:?%04X\r\n",?BMSR); ??????printf?("ALPAR:?%04X\r\n",?ALPAR); ??????printf?("PHYSR:?%04X\r\n",?PHYSR); ??????printf?("?MDIX:?%04X\r\n",?MDIX); ??????vTaskDelay?(1000); ??????printf?("Restart?Auto-Negotiation\r\n"); ??????ETH_WritePHYRegister?(1,?0x00,?BMCR?|?0x0200); ??????vTaskDelay?(5000); ??????BMCR??=?ETH_ReadPHYRegister?(1,?0x00); ??????BMSR??=?ETH_ReadPHYRegister?(1,?0x01); ??????ALPAR?=?ETH_ReadPHYRegister?(1,?0x05); ??????PHYSR?=?ETH_ReadPHYRegister?(1,?0x10); ??????MDIX??=?ETH_ReadPHYRegister?(1,?0x1E); ??????printf?("?BMCR:?%04X\r\n",?BMCR); ??????printf?("?BMSR:?%04X\r\n",?BMSR); ??????printf?("ALPAR:?%04X\r\n",?ALPAR); ??????printf?("PHYSR:?%04X\r\n",?PHYSR); ??????printf?("?MDIX:?%04X\r\n",?MDIX); ????}
測試結果如圖
啟動協(xié)商過程中插拔一次網(wǎng)線
啟動協(xié)商過程中,保持網(wǎng)線一直有效連接