This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C1294XL:lwip 2.0.2端口问题

Guru**** 2455560 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/639660/ek-tm4c1294xl-lwip-2-0-2-port-problem

器件型号:EK-TM4C1294XL

我按照某些论坛中的指导原则移植了 lwip 版本2.0.2。 除了一个例外,一切都可以正常工作:当断开网络电缆然后重新连接时,lwip 停止工作。

我正在调试系统、问题是、当电缆断开时、链路会下降(PHY_PHY_ADDR 寄存器中的 EPHY_STS_LINK、EMAC0_BASE)、这是正确的、但当电缆再次连接时、LINK 位永远不会返回到1、但保持为零。

发生这种情况时、tivaif_process_phy_interrupt 函数会调用 netif_set_link_down、而不会调用 netif_set_link_up (该函数在复位后仅调用一次)。 在 lwip 版本1.4.1中、这些函数似乎不执行任何操作、但在新版本中、TCP 堆栈不再接收数据包。

我修补了对 tivaif_process_phy_interrupt 中函数 netif_set_link_down 进行注释的代码。 此修补程序使系统正常工作。 但是、这种解决方案不是正确的、因为问题在于、由于某种原因、物理层无法检测到电缆已再次连接。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请参阅此帖子、了解它是否有帮助。 e2e.ti.com/.../498224
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Charles 的回答、但该帖子没有帮助。
    TM4C1294的 Tiva 驱动程序中存在以下函数中的问题:
    无效
    tivaif_process_phy_interrupt (struct netif * psNetif)

    uint16_t ui16Val、ui16Status;
    uint32_t ui32Config、ui32Mode、ui32RxMaxFrameSize;

    /*读取 PHY 中断状态。 这将清除所有中断源。
    *请注意、我们仅在 EPHY_MISR1中启用源、因此我们不启用
    *读取 EPHY_MISR2。
    *
    ui16Val = EMACPHYREAD (EMAC0_BASE、PHY_PHY_ADDR、EPHY_MISR1);

    /*读取当前 PHY 状态。 *
    ui16Status = EMACPHYREAD (EMAC0_BASE、PHY_PHY_ADDR、EPHY_STS);

    /*链接状态是否已更改? *
    IF (ui16Val 和 EPHY_MISR1_LINKSTAT)

    /*现在链接是上行还是下行? *
    IF (ui16Status 和 EPHY_STS_LINK)

    /*告诉 lwIP 链接已启动。 *
    #if no_SYS
    netif_set_link_up (psNetif); /******** 如果拔下电缆后再重新插上电源线,则不会执行此线路 /
    其他
    TCPIP_callback (((TCPIP_callback_fn) netif_set_link_up、psNetif);
    #endif

    /*在本例中,我们会进行浏览,因为我们可能需要重新配置
    * MAC 取决于速度和半双工/ fui32l 双工设置。
    *

    其他

    /*告诉 lwIP 链接已关闭*/
    #if no_SYS
    netif_set_link_down (psNetif);
    其他
    TCPIP_callback (((TCPIP_callback_fn) netif_set_link_down、psNetif);
    #endif



    /*速度或双工状态是否已更改? *
    IF (ui16Val 和(EPHY_MISR1_SPEED | EPHY_MISR1_SPEED | EPHY_MISR1_ANC)

    /*获取当前 MAC 配置。 *
    EMACConfigGet (EMAC0_BASE、&ui32Config、&ui32Mode、
    ui32RxMaxFrameSize);

    /*接口目前的运行速度是多少?
    *
    IF (ui16Status 和 EPHY_STS_SPEED)

    /*选择10Mbps */
    ui32Config &=~EMAC_CONFIG_100Mbps;

    其他

    /*选择100Mbps */
    ui32Config |= EMAC_CONFIG_100Mbps;


    /*我们是否处于 fui32l 或半双工模式? *
    IF (ui16Status 和 EPHY_STS_DUPLEX)

    /* Fui32l 双面打印。 *
    ui32Config |= EMAC_CONFIG_FULL_DUPLEX;

    其他

    /*半双工。 *
    ui32Config &=~EMAC_CONFIG_FULL_DUPLEX;


    /*重新配置 MAC */
    EMACConfigSet (EMAC0_BASE、ui32Config、ui32Mode、ui32RxMaxFrameSize);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您从何处获得粘贴在上面的代码? 您有哪个 TivaWare 版本?

     我在 文件 C:\ti\TivaWare_C_Series-2.1.4.178\third_party\lwip-1.4.1\ports\Tiva-tm4c129\netif\Tiva-tm4c129.c 中看到 TIVA_process_phy_interrupt 的不同内容 在这里、它会检查链路状态、并根据  EPHY_STS_LINK  调用 netif_set_link_up 或 netif_set_link_down。  

    /**
    *处理来自 PHY 的中断。
    *
    **应从 Stellaris 以太网中断处理程序调用。 此
    *函数将从 Stellaris 以太网 FIFO 读取数据包、并将它们
    *放入 pbuf 队列。 如果发送器空闲且
    发送队列中至少有一个数据包*、它将将其放置在发送 FIFO 中并启动
    *发送器。
    *
    */
    void
    tivaif_process_phy_interrupt (struct netif * psNetif)
    {
    uint16_t ui16Val、ui16Status;
    #if EE_support
    uint16_t ui16EEEStatus;
    #endif
    uint32_t ui32Config、ui32Mode、ui32RxMaxFrameSize;
    
    /*读取 PHY 中断状态。 这将清除所有中断源。
    *请注意、我们仅在 EPHY_MISR1中启用源、因此我们不启用
    *读取 EPHY_MISR2。
    *
    ui16Val = EMACPHYREAD (EMAC0_BASE、PHY_PHY_ADDR、EPHY_MISR1);
    
    /*读取当前 PHY 状态。 *
    ui16Status = EMACPHYREAD (EMAC0_BASE、PHY_PHY_ADDR、EPHY_STS);
    
    /*如果请求 EEE 模式支持,则读取链接的值
    *合作伙伴状态
    */
    #if EE_support
    ui16EEEStatus = EMACPHYMMMDRead (EMAC0_BASE、PHY_PHY_ADDR、0x703D);
    #endif
    
    /*链接状态是否已更改? *
    IF (ui16Val 和 EPHY_MISR1_LINKSTAT)
    {
    /*现在链接是上行还是下行? *
    IF (ui16Status 和 EPHY_STS_LINK)
    {
    /*告诉 lwIP 链接已启动。 */
    #if no_SYS
    netif_set_link_up (psNetif);
    #else
    TCPIP_callback (((TCPIP_callback_fn) netif_set_link_up、psNetif);
    #endif
    
    /*如果链接已被通告为支持 EEE,则进行配置
    *用于 LPI 计时器的 MAC 寄存器并手动设置 PHY 链路
    *状态位
    */
    #if EE_support
    if (ui16EEE 状态& 0x2)
    {
    EMACLPIConfig (EMAC0_BASE、TRUE、1000、36);
    EMACLPILinkSet (EMAC0_BASE);
    G_bEEELinkActive = true;
    }
    #endif
    
    /*在本例中,我们会进行浏览,因为我们可能需要重新配置
    * MAC 取决于速度和半双工/ fui32l 双工设置。
    */
    }
    其他
    {
    /*告知 lwIP 链接已关闭*/
    #if no_SYS
    netif_set_link_down (psNetif);
    #else
    TCPIP_callback (((TCPIP_callback_fn) netif_set_link_down、psNetif);
    #endif
    
    /*如果链接已被广告为 EEE 功能,则清除
    * MAC 寄存器 LPI 计时器并手动清除 PHY 链路状态
    *位
    */
    #if EE_support
    G_bEEELinkActive = false;
    EMACLPILinkClear (EMAC0_BASE);
    EMACLPIConfig (EMAC0_BASE、false、1000、0);
    #endif
    }
    }
    
    /*速度或双工状态是否已更改? *
    IF (ui16Val 和(EPHY_MISR1_SPEED | EPHY_MISR1_SPEED | EPHY_MISR1_ANC)
    {
    /*获取当前 MAC 配置。 *
    EMACConfigGet (EMAC0_BASE、&ui32Config、&ui32Mode、
    ui32RxMaxFrameSize);
    
    /*接口目前的运行速度是多少?
    *
    IF (ui16Status 和 EPHY_STS_SPEED)
    {
    /*选择10Mbps */
    ui32Config &=~EMAC_CONFIG_100Mbps;
    }
    其他
    {
    /*选择100Mbps */
    ui32Config |= EMAC_CONFIG_100Mbps;
    }
    
    /*我们是否处于 fui32l 或半双工模式? *
    IF (ui16Status 和 EPHY_STS_DUPLEX)
    {
    /* Fui32l 双面打印。 *
    ui32Config |= EMAC_CONFIG_FULL_DUPLEX;
    }
    其他
    {
    /*半双工。 *
    ui32Config &=~EMAC_CONFIG_FULL_DUPLEX;
    }
    
    /*重新配置 MAC */
    EMACConfigSet (EMAC0_BASE、ui32Config、ui32Mode、ui32RxMaxFrameSize);
    }
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用的版本为:TivaWare_C_Series-2.1.2.111

    我知道新版本、但忘记了它。 我的错。
    我将为您提供新版本的反馈。
    谢谢 Charles

    维森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Vicente:
    是的、请尝试使用最新版本、看看它是否有所不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我更改为新版本、但问题仍然存在。 函数 tivaif_process_phy_interrupt 未检测到链路已启动(if (ui16Status & EPHY_STS_LINK)始终为 false)、因此 netif_set_link_up (psNetif)从未调用。
    我不使用新的 EE_support、您认为这会有帮助吗?
    维森特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已修改 enet_lwip 程序、以便在主周期中显示链接的状态。
    结果是:
    以太网 lwIP 示例

    静态 IP 地址:10.10.23.15
    打开浏览器并输入 IP 地址。
    链接状态(ui16Status & EPHY_STS_LINK)-> 0
    链接状态(ui16Status & EPHY_STS_LINK)-> 0
    链接状态(ui16Status & EPHY_STS_LINK)-> 0
    链接状态(ui16Status & EPHY_STS_LINK)-> 0
    链路状态(ui16Status & EPHY_STS_LINK)-> 1<-第一次连接以太网电缆
    链接状态(ui16Status & EPHY_STS_LINK)-> 1.
    链接状态(ui16Status & EPHY_STS_LINK)-> 1.
    链接状态(ui16Status & EPHY_STS_LINK)-> 1.
    链接状态(ui16Status & EPHY_STS_LINK)-> 1.
    链接状态(ui16Status & EPHY_STS_LINK)-> 1.
    链接状态(ui16Status & EPHY_STS_LINK)-> 0<-拔下电缆
    链接状态(ui16Status & EPHY_STS_LINK)-> 0
    链接状态(ui16Status & EPHY_STS_LINK)-> 0
    链接状态(ui16Status & EPHY_STS_LINK)-> 0<-再次连接电缆
    链接状态(ui16Status & EPHY_STS_LINK)-> 0
    链接状态(ui16Status & EPHY_STS_LINK)-> 0

    您可以看到、链路状态永远不会变为1、正如我在重新连接电缆时所期望的那样。
    谢谢你
    维森特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以尝试一下 TivaWare 示例中的一个、如 enet_io 或 enet_lwip 吗? 这些是简单的 Web 服务器示例。 代码运行后、我打开浏览器以找到指定的 IP 地址、并查看托管网页的 MCU。 然后、我断开以太网电缆并刷新浏览器、几秒钟后、将出现错误消息、提示无法访问该网站。 我将重新连接电缆、浏览器将再次显示 MCU 托管的网页。 这在某种程度上告诉我、在重新插入电缆后、链路状态应该正常工作。

    尽管如此、我还是找到了一个与您提出相同问题的帖子。 e2e.ti.com/.../1909843
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经这样做了、您能否像这样更改 enet_lwip 代码:
    while (1)

    ui16Status = EMACPHYREAD (EMAC0_BASE、PHY_PHY_ADDR、0x010);
    UARTprintf ("链接状态(ui16Status & EPHY_STS_LINK)->%d\n"、ui16Status & 0x01);
    SysCtlDelay (120000000 * 5 / 3);
    //
    //等待 SysTick 中断指示更改的状态
    // LED。
    //
    // while (g_bled == false)
    // {
    //}



    您必须包括:
    #include "driverlib/emac.h"

    此外、在 main 函数的开头:
    内部
    main (空)

    uint32_t ui32User0、ui32User1;
    uint8_t pui8MACArray[8];
    uint16_t ui16Status;

    结果与我上一篇文章中的结果相同(链接永远不会打开)、但网页会起作用、因为在 lwip 版本1.4.1中、函数 netif_link_down 和 netif_link_up 不会阻止 http 服务器接收数据包。 但在新版本中、它确实如此。

    我将阅读您提到的帖子。
    谢谢你
    维森特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯:

    Aigars 在另一篇文章中建议的补丁可以正常工作。

    无论如何、我认为 TI 应该关注这个问题、尤其是如果您能够重现问题、从而确认这不仅仅是我的错误。

    非常感谢。

    维森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴该变通办法也适用于您。