主题中讨论的其他器件: 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();