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.

[参考译文] MSP432E401Y:以太网赢得-# 39;t 同步

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP-EXP432E401Y

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160965/msp432e401y-ethernet-won-t-sync

器件型号:MSP432E401Y
主题中讨论的其他器件:MSP-EXP432E401Y

您好!

我有一个控制器板、它具有基于 lwip 的应用、驻留在远程太阳能供电站点、并作为客户端通过以太网调制解调器与中央办公室进行通信。 为了节省能源、以太网调制解调器在大多数时间都处于断电状态。 控制器板按预设时间表每天为其加电几次。

问题是、只要调制解调器通电、它就不会与控制器板同步、因此以太网通信失败。 如果在以太网调制解调器通电后控制器板复位、它可以正常工作、但我不知道如何在不实际按下复位按钮的情况下进行复位。

是否有人能告诉我、在以太网调制解调器通电后、为了从控制器板同步以太网连接、我需要做什么?

谢谢你。

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

    您好!

     我有几个问题:

     -控制器板如何唤醒以太网调制解调器?

     -控制器板是否知道以太网调制解调器已通电?

     -如果您知道调制解调器的状态(例如,调制解调器从断电状态下电),您能否在控制器板上的固件中执行软件复位,而不是通过 RST 引脚进行硬件复位?

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

    查尔斯

    控制器板通过板上的继电器唤醒以太网调制解调器、因此、它可以准确地知道调制解调器何时上电。

    我尝试在汇编代码中执行软件复位、方法是将零加载到寄存器 R2、然后加载"mov PC、R2"、但这不起作用。  如果您可以解释如何执行软件复位、那会很有帮助。

    执行软件复位是我最不喜欢的选择、因为处理器也在执行其他我不想干扰的任务。  但是、如果这是我唯一的选择、我将不得不这样做。

    感谢您的回答。

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

    Brad、您好!

     我建议您首先尝试以太网 EMAC 和以太网 PHY 的外设复位。 请在下面找到 SysCtlPeripheralReset 用法。  

    https://software-dl.ti.com/simplelink/esd/simplelink_msp432e4_sdk/3.10.00.11/docs/driverlib/msp432e4/html/group__sysctl__api.html#gab8c537abe40caacd5dfa7ffdedefb6b9

     若要在外设复位不能为您提供所需结果的情况下复位整个器件、您可以调用 SysCtlReset()。  

    https://software-dl.ti.com/simplelink/esd/simplelink_msp432e4_sdk/3.10.00.11/docs/driverlib/msp432e4/html/group__sysctl__api.html#ga7e7eaf3273efa935f7bedfd3760d11b8

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

    查尔斯

    它的工作方式是重置整个器件、因此我将其作为备份、但正如我提到过的、我不必这样做。

    现在我尝试执行外设复位方法、但不喜欢我输入的 C 命令(我对 C 没有太多经验)。

    例如、以下是我尝试的几条命令:

    SysCtlPeripheralReset (uint32_t sysctl_Periph_EMAC);
    SysCtlPeripheralReset (uint32_t sysctl_Periph_EPHY);

    在这些情况下、我遇到编译错误"error 256 type name is not allowed"、然后在没有 unit32_t 的情况下尝试它们时、系统会提示  SYSCTL_Periph_EMAC 和 SYSCTL_Periph_EPHY 未定义。

    您能看到我做错了吗?

    谢谢你。

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

    您好!

      您只需按如下方式进行调用。 无需对其进行拼写。  

    SysCtlPeripheralReset (SYSCTL_Periph_EMAC);
    SysCtlPeripheralReset (SYSCTL_Periph_EPHY);

    如果您想进行拼写检查、则需要括号。  

    SysCtlPeripheralReset ((uint32_t) SYSCTL_Periph_EMAC);
    SysCtlPeripheralReset ((uint32_t) SYSCTL_Periph_EPHY);

    您还需要确保在进行 SysCtlPeripheralReset 调用的源文件顶部包含 sysctl.h 头文件。 头文件具有 SYSCTL_Periph_EMAC 和 SYSCTL_Periph_EPHY 的定义。 请参阅下面的代码段。

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

    您好!

    我 包括了 sysctl.h  

    我还必须在  SYSCTL_Periph_EMAC 和 SYSCTL_Periph_EPHY 的末尾添加一个零、使它们成为 SYSCTL_Periph_EMAC0和 SYSCTL_Periph_EPHY0、因为它们是 SYSCTL.h 中的定义

    它的编译正常、我运行了我的程序、但它仍然不同步-没有通信。

    然后我在 SysCtlPeripheralReset (SYSCTL_Periph_EMAC0)上放置一个断点;然后我在 SYSCTL.c 的 SysCtlPeripheralReset 中跟随执行操作,使其看起来执行正常,但仍然没有通信。

    是否有任何关于可能出错的想法?

    感谢您的进一步帮助。

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

    我的差。 我错过 了 SYSCTL_PERIPH_EMAC0和 SYSCTL_PERIPH_EPHY0中的0。

    我想、在您复位外设后、您将需要重新初始化 EMAC、PHY 和软件堆栈。 系统复位将保证 EMAC 和 PHY 以及 TCP/IP 堆栈(不确定使用哪个堆栈、如 lwIP 或 NDK)被重新初始化。

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

    您好!

    我不清楚如何 重新初始化 EMAC、PHY 和软件堆栈。  我尝试在 SysCtlPeripheralReset 命令下面添加类似如下的命令、因为这些命令是首先设置以太网端口的命令、但当它们执行时、电路板崩溃。

    SysCtlPeripheralReset (SYSCTL_Periph_EMAC0);
    SysCtlPeripheralReset (SYSCTL_Periph_EPHY0);

    pui8MACArray[0]=((ui32User0 >> 0)& 0xff);
    pui8MACArray[1]=((ui32User0 >> 8)& 0xff);
    pui8MACArray[2]=((ui32User0 >> 16)& 0xff);
    pui8MACArray[3]=((ui32User1 >> 0)& 0xff);
    pui8MACArray[4]=((ui32User1 >> 8)& 0xff);
    pui8MACArray[5]=((ui32User1 >> 16)& 0xff);

    uint32_t ui32IPAddr = 0xc0a80165;
    uint32_t ui32GWAddr = 0xc0a80101;
    uint32_t ui32NetMask = 0xffffff00;

    lwIPInit (g_ui32SysClock、pui8MACArray、ui32IPAddr、ui32NetMask、ui32GWAddr、 ipaddr_use_static);

    我知道系统复位将重新初始化所有内容、但我正在尝试避免重置整个系统。

    我非常确信该板使用 TCP/IP。

    感谢您提供的任何更多帮助。

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

    Brad、您好!

     当我搜索与您的问题相关的其他线索时、我发现这一线索可能对您而言很有帮助、它涉及关闭闪存预取缓冲器。

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/392725/link-status-of-ethernet-on-tm4c-129-platform

    我想知道问题是否与以下勘误表有关、在初始化以太网之前、您需要关闭闪存预取缓冲器。  

    另请参阅此帖子。  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/739616/tm4c1294ncpdt-ethernet-errata-exact-workaround-for-tm4c1294ncpdt?tisearch=e2e-sitesearch&keymatch=flashconf#

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

    您好、Charles、

    运气差。  通过 设置 FLASHCONF 寄存器的位16、我强制执行预取。  我首先复位 PHY、然后按照第一个链接的建议复位 EMAC:

    SysCtlPeripheralReset (SYSCTL_Periph_EPHY0);  
    SysCtlPeripheralReset (SYSCTL_Periph_EMAC0);

    然后、我通过设置 FLASHCONF 寄存器的位17强制重新执行预取。

    执行这三个步骤后、以太网连接仍然无法正常工作。  我没有采取任何进一步的措施来使其正常工作。

    令人困惑的一点是、第一条链路中的 Gavin 说  、当他先插入以太网电缆、然后打开设备电源时、它会失败、但如果他先给设备通电、然后再插入电缆、那就成功了。  

    这与我看到的完全相反。  我的案例是、在器件通电后插入电缆时发生故障。

    感谢你的所有帮助。

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

    Brad、您好!

     关闭闪存流水线后、您是否重新初始化了堆栈、而不是仅重置 PHY 和 EMAC。  

    向 FPFOFF 位写入1以禁用预取缓冲器
    2.初始化 EMAC 和 PHY //如果 跟踪函数的源代码,初始化 lwIPInit()应为您重置 PHY 和 EMAC。
    3.向 FPFON 位写入1以启用预取缓冲器

    如果上述步骤无法解决问题、我不能确定除了使用系统复位之外还有什么建议。  

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

    您好、Charles、

    我设置 FPFOFF、运行 lwIPinit()、然后设置 FPFON,但仍然没有成功。  

    请注意,我检查了 lwIPinit()的参数,它们与原始配置完全相同(在这里,电路板通过连接的电缆启动,以太网连接成功), 对于第二种配置(在电路板已启动的情况下插入电缆、并且我尝试重新初始化连接、但 未成功)。

    更有趣的是,当我使用 lwIPinit()时,该电路板会在 ip4route()中挂起,该 ip4.c 中的内容

    在我看来、我不可能是唯一尝试在客户端板已通电的情况下连接以太网服务器的人。  我想我会等待几天、并尝试在新帖子中重新表述该问题。  也许我只是不清楚我问这个问题的方式。

    非常感谢您花时间和努力为我提供帮助。

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

    Brad、您好!

     我仍然不确定问题的原因是什么。 您能做些实验吗?

     -您可以在 LaunchPad 上运行代码吗? 您能重复同样的问题了。 我假设您在自己的定制板上运行。  

     -您能否运行常用 SDK 以太网示例? 您能重复同样的问题吗?

     -我相信您将 MCU 设置为客户端、并且您正在连接到服务器、对吧? 我认为在以太网 调制解调器关闭后、初始化可能需要一些时间才能响应客户端请求。 我对您设置的理解是、控制器板将唤醒调制解调器、并且知道调制解调器何时通电。 您能否在调制解调器通电后添加一些延迟。 从您知道调制解调器已通电到调制解调器完全初始化、这可能需要一些时间。 我不知道您需要的延迟量。 您将需要试验任何延迟是否起作用。 另请使用 Wireshark 捕获 MCU 和调制解调器之间的以太网事务。 如果任何数量的延迟都不起作用、则它可能与调制解调器的初始化无关。  

     -您提到了以太网调制解调器。 您是否有相关的用户指南或数据表? 这是路由器还是交换机?

     -您能否通过将 MCU 连接到以太网交换机进行实验? 在整个设置工作后、请关闭开关电源、然后再次打开。 我想知道与以太网调制解调器相比、交换机是否会有所不同。  

     

      

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

    您好、Charles、

    我在 MSP-EXP432E401Y launchpad 上运行代码。   我的客户有原型控制器板本身。

    是的、我的 MCU 设置为客户端、以太网调制解调器是服务器。  调制解调器通电后、我等了很长时间、因此我确信它已完全初始化。  我不确定如何使用 Wireshark、因为该事务不涉及计算机。  它仅位于我的控制器板和以太网调制解调器之间。

    我使用的设备是 NETGEAR 型号 LB1120。

    使用 SDK 示例和/或以太网交换机进行实验时遇到的问题是、我知道连接成功的唯一方法是、如果我从以非常具体的方式结构的调制解调器获取一些非常具体的数据、并且我不会接收到这些数据  与这些其他实验进行通信、无论它是否已连接。

    感谢您的持续关注。

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

    Brad、您好!

     我希望我能对这一问题提供更多的见解。 我将再次搜索 e2e 存档、以查看是否有任何类似问题的人。 我不想说系统复位是唯一的选择。 但是、这是否是您可行的选择?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160965/msp432e401y-ethernet-won-t-sync/4367029 #4367029"]编译正常,我运行了程序,但仍然没有同步-没有通信。

     NETGEAR 型号 LB1120的用户手册指出、连接设备必须使用 DHCP 获取 IP 地址、而不是使用静态 IP 地址。 例如 、从表7中可以看到。 故障排除快速提示:

    当控制器板为 LB1120加电时、 LwIP 堆栈可能需要重新获得 DHCP 租约。

     当 LB1120加电时、程序如何重新初始化 LwIP 堆栈?

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

    切斯特、您好!

    如果我在 LB1120加电后复位处理器并且我的应用使用静态 IP 地址、控制器板会进行同步、但我宁愿使用不需要完全复位的方法、以便使用 DHCP 可能更好。

    我查看了基于 lwip 的 Ethernet_weather 示例、因为它作为客户端运行并使用 DHCP、看起来连接是通过命令设置的:

       lwIPInit (g_ui32SysClock、g_Senet.pui8MACAddr、0、0、0、0、 ipaddr_use_dhcp);

    然后、我在应用程序中使用了类似的命令来替换使用静态 IP 地址的命令。  当我运行我的应用程序时、它在 lwiplib.c 的1040行被挂起、如下所示:

    uint32_t
    lwIPLocalIPAddrGet (空)

     #if LWIP_AUTOIP || LWIP_DHCP
      if (g_bLinkActive)
      {
        return (((uint32_t) g_sNetif.ip_addr.addr);
      }
      其他
      {
        return (0xffffffff);
      }
    其他
      return (((uint32_t) g_sNetif.ip_addr.addr);<<<<<<<<<<<<<< 在 lwiplib.c @的1040号线悬挂在这里
    #endif

    LWIP_AUTOIP 和 LWIP_DHCP 的值都为零、我认为它们应该为1。  您能告诉我应该如何将它们设置为正确的值、以及是否 应该初始化任何其他值以使 DHCP 正常工作吗?

    此外、在大多数情况下、控制器板将在不连接到 LB1120的情况下加电。  当 LB1120未插入时、电路板是否会挂起、尝试初始化以太网连接?

    非常感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160965/msp432e401y-ethernet-won-t-sync/4381322 #4381322"]LWIP_AUTOIP 和 LWIP_DHCP 的值均为零、我认为它们应该为1。  您能告诉我应该如何将其设置为正确的值、以及 是否应该初始化任何其他值以使 DHCP 正常工作吗?

    TivaWare 中的 enet_lwip 示例设置为使用 DHCP 获取 IP 地址。 从 enwi_lwip.c 源文件中的注释:

    //! This example application demonstrates the operation of the Tiva
    //! Ethernet controller using the lwIP TCP/IP Stack.  DHCP is used to obtain
    //! an Ethernet address.  If DHCP times out without obtaining an address,
    //! AutoIP will be used to obtain a link-local address.  The address that is
    //! selected will be shown on the UART.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="470468" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160965/msp432e401y-ethernet-won-t-sync/4381322 #4381322"]LWIP_AUTOIP 和 LWIP_DHCP 的值均为零、我认为它们应该为1。  您能告诉我应该如何将其设置为正确的值、以及 是否应该初始化任何其他值以使 DHCP 正常工作吗?

    Brad、您好!

     很抱歉,我没收到你的答复。 在 lwipopts.h 文件中、您需要将这两个#defines 更改为1。  

    #define LWIP_AUTOIP            1

    #define LWIP_DHCP             1

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

    查尔斯和切斯特:

    在您的帮助下、我的应用程序现在正在与 DCHP 成功同步。  

    感谢你的帮助、

    Brad

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

    Brad、您好!

     很高兴听到您的问题得到了解决。 您能否详细说明除了更改 DHCP 以解决同步问题之外、您还做了哪些其他工作? 希望听到您的解决方案可能会让社区中的其他人受益。  

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

    您好、Charles、

    结果非常简单。  在初始化代码中、我删除了设置以太网以使用静态 IP 地址的语句、并将其替换为:

       lwIPInit (g_ui32SysClock、g_Senet.pui8MACAddr、0、0、0、0、 ipaddr_use_dhcp);

    然后、我按照  上周的建议、将 LWIP_AUTOIP 和 LWIP_DHCP 定义为在 lwipopts.h 中具有值1。

    现在 、只要 LB1120加电、它就会自动与控制器板同步。  我不需要从控制器板侧执行任何操作来启动同步。

    再次感谢大家。  如果你和 Chester Gillon 能帮我解决这个问题的话。

    Brad