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:如何正确处理以太网发送缓冲器不可用 (TBU) 中断?

Guru**** 2961840 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1649620/tms320f28388d-how-does-one-properly-handle-an-ethernet-transmit-buffer-unavailable-tbu-interrupt

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

您好、

用于通信管理器 (CM) 的 C2000Ware Driverlib 的以太网部分中的 GenericISR 通过(在极少数情况下)由于发送缓冲器不可用 (TBU) 情况的中断而导致的不间断中断循环使我陷入麻烦。 在 GenericISR 中断函数内、处理 TBU 中断的部分除了尝试清除 TBU 和 NIS 中断标志外什么都不做;不成功、正如我提到的、GenericISR 最终被捕获到一个循环中。 处理 TBU 条件的代码可在下面找到:

/*  Check for Normal Interrupt (NIS) and TX Buffer Unavailable (TBU) */
        else if((ETHERNET_DMA_CH0_STATUS_NIS | ETHERNET_DMA_CH0_STATUS_TBU) ==
                (HWREG(Ethernet_device_struct.baseAddresses.enet_base +
                        ETHERNET_O_DMA_CH0_STATUS) &
                        (uint32_t)(ETHERNET_DMA_CH0_STATUS_NIS |
                                   ETHERNET_DMA_CH0_STATUS_TBU)))
            {
#ifdef ETHERNET_DEBUG
                Ethernet_txChan0BufUnavail++;
#endif

                /*
                 * Clear the NIS and TBU status bit. These MUST be
                 * cleared together!
                 */
                Ethernet_clearDMAChannelInterrupt(
                    Ethernet_device_struct.baseAddresses.enet_base,
                    ETHERNET_DMA_CHANNEL_NUM_0,
                    ETHERNET_DMA_CH0_STATUS_NIS | ETHERNET_DMA_CH0_STATUS_TBU);
            }

F28388D TRM 也没有太大的帮助。 以下是它对处理 TBU 条件的一种方法所说的内容:

要恢复处理发送描述符、应用程序应执行以下操作:1. 通过设置 TDES3 的第 31 位更改描述符的所有权。 2.发出传送轮询要求命令。 对于振铃模式、应用应推进通道的发送描述符尾指针寄存器。

我已经在 ethernet.c 中看到了有关 TDES3 的变量、但我怀疑有一种简单的方法可以访问任何描述符导致应用程序代码出现问题的 TDES3。 此外、TRM 中的任何其他位置都没有提及“发送轮询需求“命令。

最后、在 lwIP 示例 enet_lwip.c 中、在该示例中首先发生的事情之一是调用该函数:

    //
    // Disable transmit buffer unavailable and normal interrupt which
    // are enabled by default in Ethernet_getHandle.
    //
    Ethernet_disableDmaInterrupt(Ethernet_device_struct.baseAddresses.enet_base,
                                 0, (ETHERNET_DMA_CH0_INTERRUPT_ENABLE_TBUE |
                                     ETHERNET_DMA_CH0_INTERRUPT_ENABLE_NIE));

即使在您自己的示例中、您也选择禁用中断、而不是向用户展示其应如何处理中断。

我真的想知道如何正确处理 TBU 条件、因为现在、如果我找不到任何缺点来忽略 TBU 中断应该表示的条件、我会选择禁用该特定的中断。

P.S.:这是我第一次使用此论坛、因为 E2E 论坛帖子如何更改、因此如果此帖子属于错误的主题类别、请原谅我。

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

    您好、

    TBU 可用作应用程序的通知器以发送数据包、因为下一个描述符为应用程序所有。 在一般用例中、我们可能不需要中断。