请求帮助:LM3S9790 上没有 PHY 中断

Other Parts Discussed in Thread: LM3S6100

您好,能否提供一下帮助:

我想启用 PHY 中断,仅用于指示链接开通(自动协商完成)和链接断开事件。我在 LM3S6100 上成功实现了这一点,但在 LM3S9790 上却没有。在 LM3S9790上,PHY 中断从来就没有被触发过。我是按照下列方式初始化 EMAC 的:

EthernetIntEnable(ETH_BASE, ETH_INT_PHY | ETH_INT_RX);

EthernetPHYWrite(ETH_BASE, PHY_MR30, PHY_MR30_LDIM | PHY_MR30_ANCOMPIM);

在 ISR 中,我的程序是这样:

...

if(estat & ETH_INT_PHY) {

  DWORD phystat=EthnernetPHYRead(ETH_BASE, PHY_MR29);

  if(phystat & PHY_MR29_LDIS) {

     ...link is off

 }

  if(phystat & PHY_MR29_ANCOMPIS) {

     ...link is on 

 }

}

在程序运行的时候,以太网端口能够接收到数据包,但我从未收到过来自 PHY 的中断。有趣的是,类似的代码在 LM3S6100 上运行时一切正常(唯一的区别是,我在 6100 上处理的是 MR17,而非 MR29 和 MR30)。

这个代码有什么问题吗?

  • 我想您应该知道,在设备复位后,在初始化以太网控制器以开始运行之前,需要延迟来确保以太网 PLL 生效以及以太网的时钟完成同步。我可以在某种程度上再现您的问题。此外,我也可以在自动协商完成时获得 PHY 中断。

    我给您的建议是,在初始化以太网控制器前添加一点延迟(比如 1 秒钟)。从实施的角度而言,您可进行如下操作:

    //

    // 启用所有的处理器中断。

    //

    IntMasterEnable();

    //

    //添加延迟

    //

    SysCtlDelay(SysCtlClockGet()/3);

    //

    // 初始化以太网控制器以进行运行。

    //

    EthernetInitExpClk(ETH_BASE, SysCtlClockGet());

    看看有没有效果。