在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10664|回复: 9

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

[复制链接]
发表于 2012-3-23 14:57:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
小弟正在做三速以太网的工程,使用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没有完成。

                               
登录/注册后可看大图


请问搞过以太网的各位大神,这是什么情况?是不是软件部分缺少什么东西?

发表于 2012-3-23 15:50:53 | 显示全部楼层
88E1111好像是marvel的片子吧,这个片子好像PHY层link比较慢的。 你生成altera triple speed ethernet ip 的时候选了自协议吗?NOIS II里面我用过。我只用过单独的ip,看到的都是rtl代码。
 楼主| 发表于 2012-3-23 16:25:32 | 显示全部楼层
回复 2# catcat_2

auto negotiation 是使用NIOS II定义的啊,上述软件里面就给出了使能PHY的auto negotiation功能:
IOWR(&pmac->mdio0.CONTROL, 0, PCS_CTL_an_enable | PCS_CTL_sw_reset);

就是一直卡在这儿,等了不少时间了。。。

这会是什么原因呢?88E1111需要什么配置吗?
发表于 2012-3-23 16:31:27 | 显示全部楼层
你去找一个88E1111的data sheet看看吧,应该是有寄存器要配置的。nois ii这边应该直接配置IP了,不用管。
发表于 2012-4-6 19:52:47 | 显示全部楼层
似乎你判断状态有问题哈!mdio-status !=0才是auto negotiation完成哈
 楼主| 发表于 2012-4-10 21:22:33 | 显示全部楼层
回复 5# victormou

对啊,当不等于0的时候跳出循环,接着往下执行。

后来我把这一步注销跳过去了,在之后的程序中Auto Negotiation又通过了,这个工程也可以实现了。


敢问你也在搞这个?
发表于 2012-5-12 14:53:08 | 显示全部楼层
你好,我也在做三速以太网和PHY芯片的连接,也出现了跟你一样的问题,你可以指导我一下怎么解决掉的吗?谢谢。
 楼主| 发表于 2012-5-14 13:42:02 | 显示全部楼层
回复 7# darin

将循环等待这个段代码 注销掉。。。之后可以运行了。。。
   //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" );


}
发表于 2013-7-13 09:12:49 | 显示全部楼层
你好,我现在在做QSYS的三速以太网调试。。你能把你做的工程发给我看下么?真的做的很做鸡。。。289503932@qq.com  万分感谢
发表于 2014-7-24 15:02:01 | 显示全部楼层
您好,我能问下你,我的板子上只有一个PHY芯片,那么这个PHY芯片的地址你是怎么确定的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-22 11:21 , Processed in 0.037469 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表