微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 三速以太网(Triple Speed Ethernet)外部PHY88E1111Auto Negotiation运行问题

三速以太网(Triple Speed Ethernet)外部PHY88E1111Auto Negotiation运行问题

时间:10-02 整理:3721RD 点击:
小弟正在做三速以太网的工程,使用NIOS搭建Qsys工程,使用Eclipse编译软件和在线Debug。
我的工程是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芯片的地址你是怎么确定的呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top