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.

[参考译文] AM3358:LWIP 丢失以太网帧

Guru**** 2611705 points
Other Parts Discussed in Thread: AM3358-EP, AM3359

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/654958/am3358-lwip-lost-ethernet-frames

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

我有基于 Starterware LWIP 堆栈的软件、但现在严重剥离和裸机。  我将在双 MAC 模式下使用 CPSW。  所有链路强制为100 Mb/s 全双工。  该软件在 ICEv2.1电路板上运行完美-我可以在两个以太网链路上发送和接收数据。

然后、我在定制硬件上运行它、其中:

-端口1连接到外部 PHY 和磁性元件、后者连接到 Micrel KSZ8895开关。  PHY 接口为 MII。
-端口2直接连接到单独的 Micrel KSZ8895开关、因此 KSZ8895用作 PHY。  接口是 MII。
处理器是 AM3358-EP、而不是 AM3359。

当我在定制硬件上运行软件时、我发现 端口1的传输和接收都很完美、端口2的传输也很完美、但端口2的接收不正确。

具体而言、它不会生成接收中断或将数据转发到端口0。  但是、我可以看到统计数据寄存器计数正确-它正确地对单播与广播进行计数、 并且正确的帧大小计数器递增(对于帧< 64字节且帧> 64字节)。  这证明帧实际上正在进入 AM335x。

显而易见的地方是中断配置和 ALE 设置。  但是-我在两个硬件上使用完全相同的中断配置和 ALE 设置。  统计数据计数器不会报告任何端口上的任何错误。

对此有什么想法吗?

我的 ALE 设置非常简单:

静态 cpswif_port_to-host_vla_cfg ()


//字节:             1    2    3   4    5    6   7    8   9
// VLAN 条目

uint8_t entry1a[12]={0x03、0x03、0x03、0x03、0x00、 0x00、0x01、0x20、0x00、0x00、 0x00、0x00};
uint8_t entry2a[12]={0x05、0x05、0x05、0x05、0x00、 0x00、0x02、0x20、0x00、0x00、 0x00、0x00};

//单播条目

uint8_t entry1b[12]={0x00、0x02、0x00、0x0A、0x00、 0x02、0x01、0x30、0x00、0x00、 0x00、0x00};
uint8_t entry2b[12]={0x01、0x02、0x00、0x0A、0x00、 0x02、0x02、0x30、0x00、0x00、 0x00、0x00};

ALETableEntrySet (((uint32_t *) entry1a);
ALETableEntrySet (((uint32_t *) entry1b);
ALETableEntrySet (((uint32_t *) entry2a);
ALETableEntrySet (((uint32_t *) entry2b);

以下是基本 CPSW 配置:

//初始化 ALE

*(volatile uint32_t *)(CPSW0_ALE_REGS + CPSW_ALE_CONTROL)=(CPSW_ALE_CONTRAL_CLEAR_TABLE

| CPSW_ALE_CONTRAL_ENABLE_ALE | CPSW_ALE_CONTRAL_ALL_VLAN_Aware);

/*将端口0、1和2的状态设置为转发*/

*(volatile uint32_t *)(CPSW0_ALE_REGS + 0x40U)&&=~CPSW_ALE_PORTCTL0_PORT_STATE;

*(volatile uint32_t *)(CPSW0_ALE_REGS + 0x40U)|= CPSW_ALE_PORT_State_FWD;

*(volatile uint32_t *)(CPSW0_ALE_REGS + 0x44U)&&=~CPSW_ALE_PORTCTL0_PORT_STATE;

*(volatile uint32_t *)(CPSW0_ALE_REGS + 0x44U)|= CPSW_ALE_PORT_State_FWD;

*(volatile uint32_t *)(CPSW0_ALE_REGS + 0x48U)&&~CPSW_ALE_PORTCTL0_PORT_STATE;

*(volatile uint32_t *)(CPSW0_ALE_REGS + 0x48U)|= CPSW_ALE_PORT_State_FWD;

/*设置双 Mac 模式*/

*(volatile uint32_t *)(CPSW0_PORT_0_regs + CPSW_PORT_TX_IN_CTL)和=~CPSW_PORT_P0_TX_IN_CTL_TX_IN_SEL;

*(volatile uint32_t *)(CPSW0_PORT_0_regs + CPSW_PORT_TX_IN_CTL)|= CPSW_PORT_P0_TX_IN_CTL_TX_IN_DUAL_MAC;

//初始化 CPDMA 的缓冲区描述符

cpswif_cpdma_init ();

/*确认接收和发送中断以实现正确的中断脉冲*/

*(volatile uint32_t *)(CPSW0_CPDMA_regs + CPSW_CPDMA_CPDMA_EOI_Vector)= CPSW_EOI_TX_PULSE;

*(volatile uint32_t *)(CPSW0_CPDMA_regs + CPSW_CPDMA_CPDMA_EOI_Vector)= CPSW_EOI_RX_PULSE;

/*为通道0和控制内核0 (包装程序)启用中断*/

*(volatile uint32_t *)(CPSW0_CPDMA_regs + CPSW_CPDMA_TX_INTMASK_set)|= 1;

*(volatile uint32_t *)(CPSW0_WR_regs + 0x10u + CPSW_CORE_INT_TX_PULSE)|= 1;

*(volatile uint32_t *)(CPSW0_CPDMA_regs + CPSW_CPDMA_RX_INTMASK_set)|= 1;

*(volatile uint32_t *)(CPSW0_WR_regs + 0x10u + CPSW_CORE_INT_RX_PULSE)|= 1;

//设置 MII 接口。

*(volatile uint32_t *)(CPSW0_slver_1_regs + CPSW_SL_MACCONTROL)

=(CPSW_SL_MACCONTROL_GMII_EN | CPSW_SL_MACCONTROL_FULL_DUPLEX);

//设置 MII 接口。

*(volatile uint32_t *)(CPSW0_slver_2_regs + CPSW_SL_MACCONTROL)

=(CPSW_SL_MACCONTROL_GMII_EN | CPSW_SL_MACCONTROL_FULL_DUPLEX);

//添加 ALE 条目

cpswif_port_to-host_vlan_cfg();


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    垫、

    您是否尝试转储 INTC 和 CPSW 寄存器并在 ICE 和硬件之间进行比较? 此外、您是否尝试设置 ALE 控制寄存器中的 ALE BYPASS 位、以便将端口0和1上接收到的所有数据包发送到主机?

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

    您好、Garrett、

    感谢您的回复。  我尝试设置 ALE 旁路、这似乎是可行的。  考虑到这一点、我的应用实际上根本不需要 ALE。

    将 ALE 设置为旁路模式并将所有内容传递给主机是否是有效的解决方案?  我在双 MAC 模式下运行、很高兴在主机软件中执行所有筛选/转发。

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

    垫、

    如果您的应用中不需要 ALE、则可以在 EMAC 双 Mac 模式下将 ALE 设置为旁路模式。

    此致、Garrett

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

    好的、我的驱动程序现在几乎可以工作了。   我绕过了 ALE、因为我不需要它。  最后一个问题似乎是流量控制。

    在我的应用中、我有一个每400微秒1070字节的固定数据流。  这在100BaseT 链路上约为20 Mbit/s、因此总线繁忙但未满。  当我在接收中断处理程序中处理所有接收到的数据包时、CPSW FIFO 中将只有1个这样的帧、最坏情况下需要14微秒。

    但是 、我只需要发送一个额外的帧、比如 ARP 请求、就会导致帧丢失。  我已确认 DMA 引擎从未在缓冲区描述符上设置 EOQ 标志(我检查 ISR 中的每个 BD)、因此帧将在 CPSW 内丢弃。

    打开 CPPI 和以太网流控制都可以解决问题、但从统计寄存器可以看到、不发送或接收任何暂停帧。

    您能否确认是否有必要启用这两种类型的流量控制、以避免 CPSW 内的帧丢失、即使在外部未发送或接收到暂停帧也是如此?

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

    这似乎是一个额外的突发帧导致帧丢失。 无论暂停帧是否存在、都启用两种类型的流量控制不会产生副作用。 您是否曾尝试仅启用 CPPI 端口流控制以确认以太网端口流控制不会因 Tx/Rx 中没有暂停帧而导致帧丢失?

    此致、
    Garrett