新手上路
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2020-4-30
- 在线时间
- 6 小时
|
8金钱
本帖最后由 ziqiao 于 2021-7-14 16:08 编辑
正点原子zynq 7020的核心版,PHY芯片是Realtek RTL8211E,用了一段时间,代码未改动,出现以太网连不上的问题,定位发现detect_phy发现不了PHY口;
硬件未改动,代码未改动,偶然又能发现phy,又连的上了,目前偶现。有点怀疑PHY芯片的问题,不知道这里有没人遇到过,求解答。
总共三块核心板,目前有两块出现了这个问题,一块正常;代码都一样,让我有点怀疑核心板硬件质量;
lwip网口日志WARNING: Not a Marvell or TI or Realtek Ethernet PHY. Please verify the initialization sequence
代码位置
xemacpsif_hw.c 文件 110行
void init_emacps(xemacpsif_s *xemacps, struct netif *netif)
{
XEmacPs *xemacpsp;
s32_t status = XST_SUCCESS;
u32_t i;
u32_t phyfoundforemac0 = FALSE;
u32_t phyfoundforemac1 = FALSE;
xemacpsp = &xemacps->emacps;
detect_phy(xemacpsp);
for (i = 31; i > 0; i--) {
if (xemacpsp->Config.BaseAddress == XPAR_XEMACPS_0_BASEADDR) {
if (phymapemac0 == TRUE) {
link_speed = phy_setup_emacps(xemacpsp, i);
phyfoundforemac0 = TRUE;
phyaddrforemac = i;
}
} else {
if (phymapemac1 == TRUE) {
link_speed = phy_setup_emacps(xemacpsp, i);
phyfoundforemac1 = TRUE;
phyaddrforemac = i;
}
}
}
}
void detect_phy(XEmacPs *xemacpsp)
{
u16_t phy_reg;
u32_t phy_addr;
u32_t emacnum;
if (xemacpsp->Config.BaseAddress == XPAR_XEMACPS_0_BASEADDR)
emacnum = 0;
else
emacnum = 1;
for (phy_addr = 31; phy_addr > 0; phy_addr--) {
XEmacPs_PhyRead(xemacpsp, phy_addr, PHY_DETECT_REG,
&phy_reg);
if ((phy_reg != 0xFFFF) &&
((phy_reg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
/* Found a valid PHY address */
LWIP_DEBUGF(NETIF_DEBUG, ("XEmacPs detect_phy: PHY detected at address %d.\r\n",
phy_addr));
if (emacnum == 0)
phymapemac0[phy_addr] = TRUE;
else
phymapemac1[phy_addr] = TRUE;
XEmacPs_PhyRead(xemacpsp, phy_addr, PHY_IDENTIFIER_1_REG,
&phy_reg);
if ((phy_reg != PHY_MARVELL_IDENTIFIER) &&
(phy_reg != PHY_TI_IDENTIFIER) &&
(phy_reg != PHY_REALTEK_IDENTIFIER)) {
xil_printf("WARNING: Not a Marvell or TI or Realtek Ethernet PHY. Please verify the initialization sequence\r\n");
}
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
更新一下最终的结论。
联系客服返回维修的结论是Phy芯片RTL8211有问题,更换之后目前问题没复现。
|