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.

[参考译文] TMS320F28388D:触发 EMAC_INT_RX 的事件

Guru**** 2416110 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1533744/tms320f28388d-event-which-triggers-emac_int_rx

器件型号:TMS320F28388D
主题:C2000WARE 中讨论的其他器件

工具/软件:

我尝试 在应用程序中使用 EMAC_INT_RX。 触发中断的事件是什么? 是完成接收数据包还是有其他事件?

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

    是否对此有任何更新?

    此致、
    Ganesh

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

    您好、  

    我能知道您正在使用的确切宏吗?

    如果它是 INT_EMAC_RX0(对于 DMA 通道 0)或 INT_EMAC_RX1(对于 DMA 通道 1)、则仅在接收完成事件时中断就会被命中。

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

    尊敬的 Gouri Siva:

    感谢您的答复。

    我的用例是在收到 UDP 数据包时触发 UDP Send。 我们使用 TI 提供的栈。  我想同时了解 INT_EMAC_RX0 或 INT_EMAC_RX1。

    当您提到接收完成事件时、您的意思是什么? DMA 接收完成还是正在接收和处理的 UDP 数据包完成?

    我还有其他一些意见和疑问:
    1) 对于 INT_EMAC_RX0:
    i) Ethernet.c 中给出的 ISR 似乎用作接收工作流程的一部分。 f2838xif.c 中的 f2838xif_membe 启用了 INT_EMAC_RX0 和 INT_EMAC_TX0。

    ii) 将 ISR 更改为我们编写的内容时、接收过程似乎中断。

    iii) 根据 i)、此中断是否可用于其他目的?

    2) 对于 INT_EMAC_RX1、如下所示:
    i)  不设置 NVIC_ISPR0.SETPEND17、NVIC_ICPR0.CLRPEND17 和 NVIC_IABR0.ACTIVE17。 手动启用这些位后、它会进入 ISR、根本不接收任何数据包。 什么是导致设置这些位的事件?

    此致、
    Ganesh

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

    您好、  

    感谢您的解释。

    触发 INT_EMAC_RX0 的事件是 DMA 接收完成事件。 在 DMA 接收完成事件时、 会设置 DMA 通道 0 中断状态寄存器的 RI 位(第 6 位)。 这将创建一个外设中断并到达 NVIC、这将触发 ISR。  

    因此、如果您考虑重写 ISR、请确保清除 DMA 状态寄存器上的 RI 位。 此外、到目前为止、数据包处理是在 ISR 内部进行的、因此在对 ISR 进行更改时、请确保不会受到干扰。

    此外、如果您能分享您在 ISR 上所做的更改、我可以指出接收流程停止的原因。

    NVIC 通道外设中断、因此这里的实际源是以太网模块的中断(特别是 DMA 状态寄存器的 RI 位)。

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

    您好、

    我附加了一个 zip 文件、其中包含为 INT_EMAC_RX0 生成的代码和 Simulink 模型。 通过更改硬件中断块下拉列表中的选择、可以为 INT_EMAC_RX1 生成类似的代码。 如果您有任何建议、请告诉我。 根据您之前的响应、我的理解是、如果我们尝试使用 INT_EMAC_RX1、则我们必须使用 INT_EMAC_RX1 重新完成所有以太网初始化、默认情况下使用 INT_EMAC_RX0 和 INT_EMAC_TX0 中断。 我的理解是否正确?

    此致、
    Ganesh

    e2e.ti.com/.../MWModel.zip

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

    您好、  

    很抱歉、我无法看到方框图。

    我已经 根据生成的代码检查了函数 EMAC_RX_INT0_Handler。 我假设您使用此函数作为接收 ISR。

    如前所述、接收 ISR 应清除 DMA 状态寄存器的 RI 位、而不是 NVIC(在生成的代码中观察到本例)。 主要来说、您应该 负责在接收 ISR 内进行的数据包处理。

    我知道您是否调用 ethernet_init 和 lwipinit 函数吗?

    因此、基本上、当 DMA 完成数据发送到 Rx 缓冲区位置时、会触发 INT_EMAC_RX0 中断。 在 ISR 级别、您需要取出数据包并传递到 lwip 栈(轻量级 TCP/IP 栈)。 这由从 ISR 调用到 f2838xif 层的回调函数完成。 lwip 栈将调用你的 UDP 回调函数、从中可以处理 UDP 数据包。

    您能否验证代码中正在执行这些步骤?

    您能否验证写入 ISR 所执行的步骤是否不会干扰已定义的接收 ISR 所完成的正常例程?

    您可以与 C2000ware 中的 enet_lwip_udp 示例进行比较。

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

    您好、

    感谢您的及时答复。

    我将研究你提出的建议。 关于 INT_EMAC_RX1、正如我在上一篇文章中提到的、我们是否必须重新完成所有以太网初始化? 是否有任何方法可以使用使用使用 INT_EMAC_RX0 的默认以太网设置来触发 INT_EMAC_RX1?

    此致、
    Ganesh

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

    您好、  

    可以参考 Ethernet_init 函数。 该函数初始化两个 DMA 通道。  

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

    您好、

    感谢您对该序列的详细答复。

    在 enet_lwip_udp 示例中、尽管 INT_EMAC_RX1 被传递到 Ethernet_initInterface、但它似乎没有应用。 处理程序也未注册。 大多数初始化都是在内部完成的。 这会导致一些问题:

    1. 如果该中断类似于 INT_EMAC_RX0、它通过 DMA 接收数据包并将其传递到应用、则该中断的用例是什么? 它是否可以采取其他一些行动?
    2. 是否可以使用 INT_EMAC_RX0 将接收到的数据包传递到应用程序 1、并使用 INT_EMAC_RX1 传递到另一个应用程序/ISR?

    此致、

    Ganesh

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

    可以创建两个不同的自定义 ISR 来处理 INT_EMAC_RX1 和 INT_EMAC_RX0。 在这些 ISR 中、您可以调用 Ethernet_removePacketsFromRxQueue API。 只需确保将确切的通道描述符指针作为参数传递给该 API、即 INT_EMAC_RX0 的通道 0 和 INT_EMAC_RX1 的通道 1。 此外、还要确保清除 DMA 通道状态寄存器。(您可以参阅 ethernet.c 文件中的 ethernet_receiveISR 实现)。