取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
Joseph
Visitor
Visitor
403 次查看
注册日期: ‎04-15-2021

Zynq7010如何使用PL连接100M的PHY(KSZ8041)芯片?

Joseph_0-1618471832109.png

Joseph_1-1618471938407.png

Joseph_2-1618471955625.png

我这边是直接配置GMII接口根据原理图连接到对应的PHY引脚,有些PHY引脚没有接到PL端,所以GMII有些接口就没有处理,空出来,但是这种方法不知道能不能行得通,MAC不能与PHY自协商,但是能通过MDIO读取到PHY的寄存器值,目前不清楚哪里出现问题,希望寻求帮助。

 

 

标记 (1)
0 项奖励
7 回复数
yzhang
Moderator
Moderator
389 次查看
注册日期: ‎05-11-2010

关于GEM通过EMIO如何与MII接口的PHY连接,你可以参考UG585 table 16-12和它下面的note。

既然你可通过MDIO读PHY register,你可以读一下看看PHY有没有与对端PHY完成自协商。

你可以参考下面两个链接的结果,

https://forums.xilinx.com/t5/Processor-System-Design-and-AXI/Zynq-GEM-to-MII-on-Zedboard/m-p/879787#M41175

https://forums.xilinx.com/t5/Processor-System-Design-and-AXI/How-to-use-GEM-controller-of-Zynq-APSoC-in-MII-mode/m-p/770162#M24981

 

0 项奖励
Joseph
Visitor
Visitor
366 次查看
注册日期: ‎04-15-2021

你好,我这边配置协商模式,但是一直在等待”协商完成“状态,可能是配置过程出现错误。

代码如下:

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

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

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

XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, 1 << 13 | 1 << 12 | 1 << 9);
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);
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");

XEmacPs_PhyRead(xemacpsp, phy_addr,IEEE_SPECIFIC_STATUS_REG,
&status_speed);
if (status_speed & 0x400) {
temp_speed = status_speed & IEEE_SPEED_MASK;

if (temp_speed == IEEE_SPEED_1000)
return 1000;
else if(temp_speed == IEEE_SPEED_100)
return 100;
else
return 10;
}

return XST_FAILURE;
}

寄存器的值(status):

Joseph_0-1618479133272.png

 

 

 

 

 

 

 

寄存器地址1的值为0x7849,“Auto-
Negotiation
Complete”位始终没有置1

0 项奖励
yzhang
Moderator
Moderator
365 次查看
注册日期: ‎05-11-2010

你可以看一下PHY芯片的datasheet,看看这一位是不是代表PHY与对端PHY自协商没有完成,PHY与PHY的自协商不需要软件控制,完全靠PHY的硬件配置来启动和对端PHY的自协商。

0 项奖励
Joseph
Visitor
Visitor
345 次查看
注册日期: ‎04-15-2021

状态寄存器(IEEE_STATUS_REG_OFFSET)Joseph_0-1618481447246.png

控制寄存器(IEEE_CONTROL_REG_OFFSET):Joseph_1-1618481475493.png

你好,该位位置(#define IEEE_STAT_AUTONEGOTIATE_COMPLETE 0x0020)与手册是一致的。

0 项奖励
Joseph
Visitor
Visitor
229 次查看
注册日期: ‎04-15-2021

你好,很遗憾整个问题依然存在,应该不是代码问题,我采用了下面链接提供的Microchip PHY代码,但是依旧无法通过自协商,希望能够获得帮助。

https://www.fpgadeveloper.com/2018/05/board-bring-up-myir-myd-y7z010-dev-board.html/ 

0 项奖励
yzhang
Moderator
Moderator
138 次查看
注册日期: ‎05-11-2010

PHY Status register的1.5这一位应该是代表PHY与对端PHY的自协商结果吧?这是PHY硬件设计的问题。

0 项奖励
Joseph
Visitor
Visitor
135 次查看
注册日期: ‎04-15-2021

是的,PHY Status register的1.5是自协商的结果,但是开启自协商后该位始终没有置1,我估计代码出问题可能性不大,应该是硬件配置出现了问题。

这是我们的硬件原理图:

Joseph_0-1618801942076.png

Joseph_1-1618801963323.png

Joseph_2-1618802143231.png

有两个PHY芯片连接到了zynq的PL端,当我们只连接一个PHY或者两个PHY都连接时依旧无法正常协商,而且PHY芯片一直处于“link dowm”状态。

 

 

0 项奖励