主题:C2000WARE 中讨论的其他器件
工具/软件:
我尝试 在应用程序中使用 EMAC_INT_RX。 触发中断的事件是什么? 是完成接收数据包还是有其他事件?
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.
工具/软件:
我尝试 在应用程序中使用 EMAC_INT_RX。 触发中断的事件是什么? 是完成接收数据包还是有其他事件?
尊敬的 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
您好、
很抱歉、我无法看到方框图。
我已经 根据生成的代码检查了函数 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 示例进行比较。
您好、
感谢您对该序列的详细答复。
在 enet_lwip_udp 示例中、尽管 INT_EMAC_RX1 被传递到 Ethernet_initInterface、但它似乎没有应用。 处理程序也未注册。 大多数初始化都是在内部完成的。 这会导致一些问题:
此致、
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 实现)。