三速以太网(Triple Speed Ethernet)外部PHY88E1111Auto Negotiation运行问题
我的工程是FPGA内部集成MAC,通过SGMII接口与外部PHY芯片88E1111相连。
现在到了下板子调试的阶段,先是想实现MDIO口的配置功能,但是外部PHY在Auto Negotiation这一步卡住了。
C程序如下:
int main (void)
{
int phyadd;
int phyid1 = 0;
int phyid2 = 0;
np_tse_mac* pmac;
pmac = (np_tse_mac*) TSE_MAC_BASE;
// Find phyid...assuming it's National's PHY....for now.
for( phyadd = 0x00; phyadd < 0xff; phyadd++ )
{
IOWR(&pmac->MDIO_ADDR0, 0, phyadd);
phyid1 = IORD(&pmac->mdio0.PHY_ID1, 0);
phyid2 = IORD(&pmac->mdio0.PHY_ID2, 0);
if( phyid1 != phyid2 )
{
printf("\n\n\nPHY INFO: [phyid] 0x%x %x %x\n", phyadd, phyid1, phyid2);
phyadd = 0xff;
}
}
// Issue a PHY reset.
IOWR(&pmac->mdio0.CONTROL, 0, PCS_CTL_an_enable | PCS_CTL_sw_reset);
if( ( ( IORD(&pmac->mdio0.CONTROL,0) & PCS_CTL_rx_slpbk) != 0 ) || ( ( IORD(&pmac->mdio0.STATUS,0) & PCS_ST_an_done) == 0) )
{
IOWR(&pmac->mdio0.CONTROL, 0, PCS_CTL_an_enable | PCS_CTL_sw_reset);
printf( "PHY INFO: Issuing PHY Reset\n" );
}
//Holding pattern until autonegotiation completes.
if(( IORD( &pmac->mdio0.STATUS, 0 ) & PCS_ST_an_done ) == 0 )
{
printf( "PHY INFO: waiting on PHY link...\n" );
while(( IORD( &pmac->mdio0.STATUS, 0 ) & PCS_ST_an_done ) == 0 )
{
usleep(10);
printf( "while!\n" );
}
printf( "PHY INFO: PHY link detected, allowing network to start.\n\n\n\n" );
}
while(1);
return( 0 );
}
下板子Debug运行时,一直卡在“PHY INFO: waiting on PHY link...”这一步,说明autonegotiation没有完成。
请问搞过以太网的各位大神,这是什么情况?是不是软件部分缺少什么东西?
88E1111好像是marvel的片子吧,这个片子好像PHY层link比较慢的。 你生成altera triple speed ethernet ip 的时候选了自协议吗?NOIS II里面我用过。我只用过单独的ip,看到的都是rtl代码。
auto negotiation 是使用NIOS II定义的啊,上述软件里面就给出了使能PHY的auto negotiation功能:
IOWR(&pmac->mdio0.CONTROL, 0, PCS_CTL_an_enable | PCS_CTL_sw_reset);
就是一直卡在这儿,等了不少时间了。
这会是什么原因呢?88E1111需要什么配置吗?
你去找一个88E1111的data sheet看看吧,应该是有寄存器要配置的。nois ii这边应该直接配置IP了,不用管。
似乎你判断状态有问题哈!mdio-status !=0才是auto negotiation完成哈
对啊,当不等于0的时候跳出循环,接着往下执行。
后来我把这一步注销跳过去了,在之后的程序中Auto Negotiation又通过了,这个工程也可以实现了。
敢问你也在搞这个?
你好,我也在做三速以太网和PHY芯片的连接,也出现了跟你一样的问题,你可以指导我一下怎么解决掉的吗?谢谢。
将循环等待这个段代码 注销掉。之后可以运行了。
//Holding pattern until autonegotiation completes.
if(( IORD( &pmac->mdio0.STATUS, 0 ) & PCS_ST_an_done ) == 0 )
{
printf( "PHY INFO: waiting on PHY link...\n" );
while(( IORD( &pmac->mdio0.STATUS, 0 ) & PCS_ST_an_done ) == 0 )
{
usleep(10);
printf( "while!\n" );
}
你好,我现在在做QSYS的三速以太网调试。你能把你做的工程发给我看下么?真的做的很做鸡。289503932@qq.com 万分感谢
您好,我能问下你,我的板子上只有一个PHY芯片,那么这个PHY芯片的地址你是怎么确定的呢?
