OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10967|回复: 5

[XILINX] zynq7010不能自协商PHY(KSZ8041)

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-8-24
在线时间
3 小时
发表于 2021-4-16 15:15:35 | 显示全部楼层 |阅读模式
2金钱
我使用的是Zynq7010开发板,PHY是KSZ8041连接zynq的PL端,我已经配置了zynq PL端连接KSZ8041,可以通过MAC读写PHY的寄存器地址,但是不能自协商不能通过(等待超时),看了一段时间还是无法解决,希望能够有人帮忙查看下问题,感激不尽。

static u32_t get_Microchip_phy_speed(XEmacPs *xemacpsp, u32_t phy_addr)
{
    u16_t temp;
    u16_t control;
    u16_t status;
    u16_t status_speed;
    u32_t timeout_counter = 0;

    xil_printf("Start PHY autonegotiation \r\n");

    XEmacPs_PhyWrite(xemacpsp,phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 2);
    XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, &control);
    control |= IEEE_RGMII_TXRX_CLOCK_DELAYED_MASK;
    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, control);

    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);

    XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);
    control |= IEEE_ASYMMETRIC_PAUSE_MASK;
    control |= IEEE_PAUSE_MASK;
    control |= ADVERTISE_100;
    control |= ADVERTISE_10;
    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);

    XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
                    &control);
    control |= ADVERTISE_1000;
    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
                    control);

    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);
    XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,&control);
    control |= (7 << 12); /* max number of gigabit attempts */
    control |= (1 << 11); /* enable downshift */
    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,control);
    XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
    control |= IEEE_CTRL_AUTONEGOTIATE_ENABLE;
    control |= IEEE_STAT_AUTONEGOTIATE_RESTART;
    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);

    XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
    control |= IEEE_CTRL_RESET_MASK;
    XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);

    while (1) {
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        if (control & IEEE_CTRL_RESET_MASK)
            continue;
        else
            break;
    }

    XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);

    xil_printf("Waiting for PHY to complete autonegotiation.\r\n");

    while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {
        sleep(1);
        XEmacPs_PhyRead(xemacpsp, phy_addr,
                        IEEE_COPPER_SPECIFIC_STATUS_REG_2,  &temp);
        timeout_counter++;

        if (timeout_counter == 30) {
            xil_printf("Auto negotiation error \r\n");
            return XST_FAILURE;
        }
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
    }
    xil_printf("autonegotiation complete \r\n");

  // Read from Microchip page 0, register 0x1F (PHY Control)
  // http://ww1.microchip.com/downloads/en/DeviceDoc/00002117F.pdf
    XEmacPs_PhyRead(xemacpsp, phy_addr,0x1F,&status_speed);
    if (status_speed & 0x040)
        return 1000;
    else if(status_speed & 0x020)
        return 100;
    else if(status_speed & 0x010)
        return 10;

    return XST_SUCCESS;
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-8-24
在线时间
3 小时
 楼主| 发表于 2021-4-16 15:16:20 | 显示全部楼层
应该不是程序问题,可能是配置引脚问题,但是不清楚问题在哪
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-4-17 01:05:16 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-4-12
在线时间
7 小时
发表于 2021-11-10 18:10:55 | 显示全部楼层
你看一下是不是·连接网线的时候可以通过自协商,不连接网线不能通过。
回复

使用道具 举报

20

主题

138

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
339
金钱
339
注册时间
2012-10-11
在线时间
134 小时
发表于 2022-9-2 09:53:52 | 显示全部楼层
楼主,调试成功了没,我目前也碰到同样的问题,能否告知怎么解决的?谢谢!
回复

使用道具 举报

20

主题

138

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
339
金钱
339
注册时间
2012-10-11
在线时间
134 小时
发表于 2022-9-2 09:56:13 | 显示全部楼层
本帖最后由 我乐意 于 2022-9-2 09:57 编辑

我在sdk里添加了ksz8081配置函数,目前能连接上电脑,但是ping不通,
static u32_t get_phy_speed_ksz8081(XEmacPs *xemacpsp, u32_t phy_addr) {
        u16_t temp;
        u16_t control;
        u16_t status;
        u16_t status_speed;
        u32_t timeout_counter = 0;
        u32_t temp_speed;
        u32_t phyregtemp;
        xil_printf("Start PHY autonegotiation \r\n");

        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",IEEE_CONTROL_REG_OFFSET, control);

        XEmacPs_PhyRead(xemacpsp, phy_addr, 0x17, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",0x17, control);

        XEmacPs_PhyWrite(xemacpsp,phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 2);//RMII Override
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",IEEE_PAGE_ADDRESS_REGISTER, control);

        XEmacPs_PhyWrite(xemacpsp,phy_addr, 0x1F, 0x8180);//0x8180  0xA180
        XEmacPs_PhyRead(xemacpsp, phy_addr, 0x1F, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",0x1F, control);

        control = 0x1E1;
        XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",IEEE_AUTONEGO_ADVERTISE_REG, control);

        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        xil_printf("ADDRESS_REGISTER 0:0x%x -> 0x%x \r\n",IEEE_CONTROL_REG_OFFSET, control);
        control &= 0xEDFF;
        control |= 0x2500;
        XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        xil_printf("ADDRESS_REGISTER 1:0x%x -> 0x%x \r\n",IEEE_CONTROL_REG_OFFSET, control);

        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        control |= IEEE_CTRL_RESET_MASK;
        XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
        while (1) {
                XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
                if (control & IEEE_CTRL_RESET_MASK)
                        continue;
                else
                        break;
        }
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",IEEE_STATUS_REG_OFFSET, control);

        XEmacPs_PhyWrite(xemacpsp,phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 2);//RMII Override
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",IEEE_PAGE_ADDRESS_REGISTER, control);

        XEmacPs_PhyWrite(xemacpsp,phy_addr, 0x1F, 0x8180);//0x8180  0xA180
        XEmacPs_PhyRead(xemacpsp, phy_addr, 0x1F, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",0x1F, control);

        control = 0x1E1;
        XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);
        xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",IEEE_AUTONEGO_ADVERTISE_REG, control);

        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        xil_printf("ADDRESS_REGISTER 0:0x%x -> 0x%x \r\n",IEEE_CONTROL_REG_OFFSET, control);
        control &= 0xEDFF;
        control |= 0x2500;
        XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
        xil_printf("ADDRESS_REGISTER 1:0x%x -> 0x%x \r\n",IEEE_CONTROL_REG_OFFSET, control);
        
        XEmacPs_PhyWrite(xemacpsp,phy_addr, 0x1E, 0x00);//Modify-20220901
        
        xil_printf("Waiting for PHY to complete autonegotiation.\r\n");
/*
        while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {
                sleep(1);
                timeout_counter++;

                if (timeout_counter == 30) {
                        xil_printf("Auto negotiation error \r\n");
                        return XST_FAILURE;
                }
                XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
                xil_printf("ADDRESS_REGISTER:0x%x -> 0x%x \r\n",IEEE_STATUS_REG_OFFSET, control);
        }
*/
        xil_printf("autonegotiation complete \r\n");
        XEmacPs_PhyRead(xemacpsp, phy_addr,0x05, &status_speed);
        xil_printf("status_speed 0x05-> 0x%x \r\n",status_speed);
        XEmacPs_PhyRead(xemacpsp, phy_addr,0x06, &status_speed);
        xil_printf("status_speed 0x06-> 0x%x \r\n",status_speed);
        XEmacPs_PhyRead(xemacpsp, phy_addr,0x08, &status_speed);
        xil_printf("status_speed 0x08-> 0x%x \r\n",status_speed);
        XEmacPs_PhyRead(xemacpsp, phy_addr,0x17, &status_speed);
        xil_printf("status_speed 0x17-> 0x%x \r\n",status_speed);

        XEmacPs_PhyRead(xemacpsp, phy_addr,0x1e, &status_speed);
        xil_printf("status_speed 0x1e-> 0x%x \r\n",status_speed);
        if ( ((status_speed & 0x06) == 0x06)||((status_speed & 0x02) == 0x02) )/* 100Mbps */
        {
                if ( (status_speed & 0x06) == 0x06)/* 100Mbps */
                {
                        xil_printf("100BASE-TX full-duplex \r\n");
                }
                else
                {
                        xil_printf("100BASE-TX half-duplex \r\n");
                }
                return 100;
        }

        else if ( ((status_speed & 0x05) == 0x05) ||((status_speed & 0x01) == 0x01) ) /* 10Mbps */
        {
                if ( (status_speed & 0x05) == 0x05)/* 100Mbps */
                {
                        xil_printf("10BASE-TX full-duplex \r\n");
                }
                else
                {
                        xil_printf("10BASE-TX half-duplex \r\n");
                }
                return 10;
        }
        else
                return 0;

        return XST_SUCCESS;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表