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.

[参考译文] AM3359:CPSW 问题

Guru**** 2602855 points
Other Parts Discussed in Thread: TLK110

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/640765/am3359-cpsw-issues

器件型号:AM3359
主题中讨论的其他器件:TLK110

您好!

我正在使用 ICEv2.1评估板。  我正在处理相当高的以太网流量(一个端口25 Mb/s、另一个端口5 Mb/s)、CPSW 处于双 MAC 模式、但 ALE 配置为自动将多播帧从端口 2转发到端口1。

我收到的数据包丢失*我认为*是由于端口 FIFO 溢出造成的,但我正在查看统计数据并看到一些非常奇怪的东西。

我看到冲突(单次冲突、延迟冲突、延迟 TX 帧)应该是不可能的、因为两个端口都连接在全双工链路上(一个端口连接到交换机、另一个端口连接到 PC、都是强制全双工、都报告全双工、 而 ICEv2上的两个 PHY 都报告为全双工)。

2.在端口0上,仅启用端口0统计信息,我看到许多 Rx SoF 超支和 DMA 超支,但其他统计信息都为零。  这是怎么做的?  成功接收到许多帧、因此我希望看到一些以网络八位位组表示的数据。  随附的屏幕截图。  尽管统计数据显示没有进行传输、但我成功地接收到每秒500帧的数据、我可以在 PC 上运行 Wireshark 的情况下看到这一点。

3.即使我看到 Rx SoF 和 DMA 超限、DMA 队列中始终至少有3个未使用的缓冲描述符。

我能信任统计数据吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是什么软件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是我自己的软件、基于运行裸机的 LWIP Starterware 示例。 我尝试将这些问题与软件无关:例如、无论软件如何、我都可以看到帧被传输到 PC、但 Tx 计数器为零。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    垫、

    您使用的是哪个 CCS 版本? 您是否尝试从 CPSW_STATS 存储器@0x4A10_0900读取、而不是从 CCS 寄存器窗口读取?

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

    您好、Garrett、我将使用 CCS 7.2.0.00013。

    如果我直接从代码中读取存储器位置、我会得到相同的值-请参阅随附的、我在其中制作了一个包含统计数据寄存器地址的结构指针:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不过、我遇到的主要问题不是统计数据-我只是想使用这些数据来确定我丢失帧的位置。

    在我的应用中、我使用双 MAC 模式、并且我已设置 ALE、以自动将端口1上接收到的多播帧转发到端口0和2。

    每25.6毫秒、我在缓冲描述符链中排队等待大约11KB 的数据、这些数据将从端口0传输到端口2、并将该队列写入 TX0_HDP。 同时、我每400微秒在端口1上接收1064字节的多播帧、该帧转发到端口0和2。 我丢失了一小部分帧、我怀疑这是因为端口2 Tx FIFO 过载。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我已经弄清楚了这个秘密- TRM 说:"FIFO 溢出(SOFOVERRUNS)是唯一的端口0统计数据
    我发现上述统计数据中的接收超限发生在我按下 code composer 中的暂停按钮之后、即处理器转换为调试模式时、 因此、EMAC 仍在接收帧、但代码不会处理接收缓冲区描述符。 所以这不是问题。

    请看一下我之前对端口配置和数据流的描述-您是否希望端口2 Tx FIFO 在这里溢出?

    我原来的帖子中的第1项仍然适用-我看到全双工链路上出现冲突和延迟帧、这应该是不可能的。 您对此有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    垫、

    >>每25.6毫秒,我就会在一组缓冲描述符中排队等待大约11KB 的数据进行传输
    借助于这个低数据速率(~3.5Mbps)、它实际上不应该有端口2 Tx FIFO 溢出、同样在全双工情况下、冲突和延迟帧也不应该发生。 为什么您必须坚持使用不再受支持的 Starterware、而不迁移到 Processor SDK? 是因为 LWIP 堆栈支持?

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

    航空软件中很难使用任何第三方代码、因此我们不使用处理器 SDK 或 Starterware。 我刚才碰巧使用 LWIP 代码作为我自己代码的起点。 现在我直接控制缓冲区描述符-我有一个简单的循环队列、其中包含5个接收描述符、还有一个线性队列、其中64个描述符用于传输。

    让我提出一些具体问题:

    TRM 第14.3.2.10.1节描述了"正常优先级模式"、其中 Tx FIFO 被分成单独的优先级队列。 TRM 第14.3.2.10.2节介绍了"双 MAC 模式"、其中未提及 Tx FIFO。 Tx FIFO 在双 Mac 模式下是如何组织的?

    TRM 第14.3.2.10.2节规定:"在双 Mac 模式下运行时、目的是在端口0和1以及端口0和2之间传输数据包、但不在端口1和2之间传输数据包。" 我正在使用双 MAC 模式、但我还设置了 ALE 以转发端口1和2之间的多播帧。 这起作用了-但 CPSW 不支持这种情况、是否会导致偶尔的数据包丢失?

    很难弄清楚 FIFO 之间的流量控制。 从端口1和2 FIFO 到端口0有硬件流控制(TRM 第14.3.2.12.1节"CPPI 发送流控制在复位时默认启用、因为主机数据包不应在任何操作模式下丢弃。")。 如果 ALE 设置为将数据包从端口1路由到端口2、并且端口2的 Tx FIFO 已满、那么数据包会发生什么情况?

    4.您能解释一下 CPSW 内增加冲突和延迟帧计数器的机制吗? 它是否基于 PHY 的 COL 信号? 这不应在全双工模式下置位、因此我可以在该模式下放置一个示波器、查看问题是在处理器还是 PHY/网络中。

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

    正如您从 TRM 中指出的、当 ALE 设置为双 MAC 时、目的是"不"在端口1和2之间交换数据包。 您是否需要在端口1和2之间发生通信? 在双 Mac 模式下、目的是让数据包向上 ARM 路由到另一个端口。 您是否需要两个外部端口之间的低延迟流量?

    当任何端口到端口传输的 FIFO 已满时、如果没有任何 Rx 描述符可用、数据包将在进入 ALE 和通过端口0退出时被丢弃。 之前显示帧溢出开始和 DMA 溢出的帖子表明了这种情况、内部 Rx FIFO 已满。 在 CPDMA 具有 Rx 描述符之前、数据包将继续丢弃。

    在您的设置中、包含5个 RX 描述符的队列可能是丢弃数据包的原因。 为了减少这些 SOF 和 DMA 超限、将在很大程度上取决于比特率和可用的 Rx 描述符数量。 在 Linux 上、默认值为128、这可以通过分配外部存储器来处理额外的 Rx 描述符而不是 CPPI 缓冲器存储器来增加。

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

    Schuyler、您好、

    我更改了软件以通过 ARM 在端口1和2之间转发数据包、并将 Rx 描述符的数量增加到16。  为了简化最坏情况下的执行时间分析、我希望使数字尽可能小。  这应该已经足够了-以太网流量由每400us 和 25ms 的周期帧组成、并且我在每个 Rx 中断中重新排列所有描述符。

    通过这些更改、 问题似乎得到解决 、我不会丢失数据包。

    但是、我仍在端口2的统计数据中报告碰撞-请参阅随附的图片。 这应该是不可能的- ICE 板上的 RJ45连接到交换机、我已经验证了交换机报告全双工链路。  我已强制 PHY 使用全双工。  我已经使用示波 器监视了 TLK110上的 COL 引脚、它未被置为有效。  因此、CPSW 中的统计数据似乎不正确地报告冲突。  这是已知问题吗?  端口0和1不报告任何冲突、延迟帧或错误。

    谢谢、

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

    根据之前在 Linux 驱动程序中进行的调试、我们发现当接口处于10Mbps 模式时、如果在 Mac 控制寄存器中设置带内模式(位18)、则可能会导致问题。 当检测到链路的速率为10Mbps 时、带内位被置位、这会导致冲突计数增加并影响整体流量。 只有当 PHY 处于 RGMII 模式且检测到速度为10Mbps 时、才应设置此带内位。

    此致、
    Schuyler