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:以太网:CM 只能发送2GB 的数据、然后挂起-以太网驱动程序存在主要问题、手册中存在不一致

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1269662/tms320f28388d-ethernet-cm-can-only-send-2gb-of-data-and-then-hangs---major-bug-in-the-ethernet-driver-and-inconsistency-in-the-manual

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

大家好!

这将是一个更长的帖子。 对此深表歉意。

在过去的几天里,我一直在尝试确定 CM 挂起的原因。 这是在启动后3小时左右发生的。
我们的 CM 通过以太网交换机通过以太网与 Linux SOM 通信。 在多个器件上进行了多次测试。 始终相同:大约3小时的运行时间和 CM 已耗尽。

跟踪此问题的第一个方法是在 CM 上启用入口挂钩以获取最后一个函数的地址。 然后、我们编写了一段软件、在运行时的 LCD (在 CPU1上)上显示该地址。
因此,在 Ethernet_genericISRCustom () ISR 例程(来自 TI ENET 示例的源代码)上,CM 冻结。
侧注:TI 提供了两个不同的 Ethernet_genericISR 例程:一个用于 driverlib (名为 Ethernet_genericISR)、另一个用于 lwIP 示例(名为 Ethernet_genericISRCustom)。
我们最初使用后者。

因此、无需深入讨论在例程中执行的操作、我切换到了 driverlib 版本。
其效果完全相同:运行大约3小时后、CM 死亡、并滞留在 Ethernet_genericISR 中。

好的。 现在、让我们尝试确定导致进入 ISR 的原因。 有多个可能的中断源、它们被逻辑或视为用于生成 ISR 标志。
TRM 中有两个显示来源的图(图43-8和43-9)。
这些数字的解码并非易事、因为没有给出可供查找的寄存器名称、而只是较短的信号名称。
我一直在努力逐个消除可能的来源。 我启动了一个调试会话、在"Registers"窗口中查找相关的寄存器和使能标志。
不幸的是、结果表明、"Registers"窗口中缺少某些寄存器。 唯一能看到它们的方法是使用内存浏览器。

我还试图在连接调试器的情况下抓住确切的时刻、但正如您可以想象的那样、这令人烦恼。 我能够确定 DMA_MACIS 寄存器中的 Interrupt_Status 位已设置、因此肯定有一些中断源。

我检查并消除了几乎所有除了一个来源:与门与 MMDIS 和 MMCIE 信号。
我在 TRM 中搜索了使能信号:MMCIE。 单次出现、在图 43-8. 这会使事情复杂化。 我们有使能信号、该信号未在手册中进行记录。
好的、让我们看看 MMCIS 位和寄存器说明(MAC_MCIS Interrupt_Status 寄存器)。
还有相应的 MAC_MAC Interrupt_Enable 寄存器、但 th 位(应使能)为"保留"。 查看 MAC_MAC_CRC Interrupt_Enable 寄存器的内容时、它是0x00000000 -什么都没有启用。 好的、我想、TRM 中有一个错误、但是位被归零、所以这个桥臂上没有被启用的中断。

我错了。

 不可否认的事实是、由于某种原因、CM 会进入 Ethernet_genericISR 并从不离开。 或者确切地说:它进入、检查某些标志、然后退出、只是立即再次进入、无限期阻止整个内核。

完全是偶然的,我注意到在初始化例程的 Enet 下面的片段:

//
// Disable the MAC Management counter interrupts as they are not used
// in this application.
//
HWREG(Ethernet_device_struct.baseAddresses.enet_base + ETHERNET_O_MMC_RX_INTERRUPT_MASK) = 0xFFFFFFFF;
HWREG(Ethernet_device_struct.baseAddresses.enet_base + ETHERNET_O_MMC_IPC_RX_INTERRUPT_MASK) = 0xFFFFFFFF;

嗯... 它们出于用途而被禁用。 但 TX 呢? 为什么未屏蔽 TX? 如果(不小心)在发送定义数量的数据包或字节后出现中断、该怎么办?
宾果!
中断的原因是其中一个 TX 数据计数器的值达到了范围的一半、即发送了0x80000000字节。 在我们的案例,它是大约3小时的操作- 2千兆字节的数据。
我添加了这条魔法线:

HWREG(Ethernet_device_struct.baseAddresses.enet_base + ETHERNET_O_MMC_TX_INTERRUPT_MASK) = 0xFFFFFFFF;

问题解决了。

这花费了我几天的时间进行调试、几个紧张的夜晚、我阅读了超过500页的以太网手册、只是为了准确找出这一行代码。

好的、我们在驱动程序示例中漏掉了一行代码。 发生了。
但不幸的是、这并不是所有内容。
为什么从地球上说 Ethernet_genericISR 无法处理所有的中断源? 好的、我想向 TI 工程师提出这个问题。
为什么我们有两个不同的 Ethernet_genericISR 例程? 它们之间存在重大差异。 使用哪一个?
手册中有不一致的地方、缺少 MCIE 中断使能位。

我认为最好的处理器应该有更好的以太网驱动程序。
期待可解决此问题的 C2000Ware 改进版新版本。 在 MMCIE 位已经消失的地方等待一个答案。

C2000 MCU 的所有开发人员祝您好运。

此致、
安迪

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

    Andy、

    很抱歉让您看完这个视频后、花了很多时间来调试这个问题。  会把它作为一个错误提出。   

    对于 MMCIE 位、必须与跨职能团队核实、以找出手册中缺少该位的原因。  关于您的其他问题、我们会在几天后回复您。  

    此致

    西达尔特

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

    尊敬的  Siddharth:

    您是否有关于该主题的任何新信息?

    此致、
    安迪

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

    Andy、  

    将在本周结束时向您更新最新信息。

    此致

    西达尔特

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

    仍然没有更新。

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

    您好!  

    关于 TRM 中 MMCIE 位缺失的问题、已经导致了文献中的错误。  以太网 IP 由第三方提供、并且其手册已压缩并添加到 TRM 中、因此 TRM 中的此位缺失。

    此致

    西达尔特

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

    但是、driverlib 中也没有 MMCIE 位。 问题比文档本身更深刻。

    此致、
    安迪

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

    Andy、

    根本原因是文档遗漏了这个错误、因此 driverlib 也遗漏了这个错误、因为 driverlib 是参考 TRM 开发的。  因此,有许多问题需要在这里解决。

    此致

    西达尔特  

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

    您好!

    一个多月过去了、我的问题仍然没有答案。 TI 不会提供有关问题的信息或确认、也不会提供这些问题的解决时间(如果有的话)。
    在我看来、以太网驱动程序仍处于测试阶段。 由于稳定性问题、我们无法将提供的驱动程序用于生产目的。 必须修改 driverlib 函数才能使代码工作得更可靠。
    我们从头开始未涉及 lwip 示例。 仅 http / UDP 示例。 没有实际的 TCP 示例。 是的、我们设法基于 lwip 和 F28388D 设置了 TCP 通信、但仍然存在稳定性和可靠性方面的问题。 缺乏*Real*支持是显而易见的。

    此致、
    安迪