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.

TMS570LC4357: 组播接收不到数据

Part Number: TMS570LC4357
Other Parts Discussed in Thread: HALCOGEN

TI工程师,您好

 

我们最近在TMS570LC4357上移植lwip1.4.1的时候,遇到组播帧没有收到的问题,广播和单播帧可以正确收到。后来,发现从EMAC的接口就没有获得到组播帧。

不知道是不是驱动配置有问题,我们的驱动使用HALCOGEN生成,根据需要做了一些修改,

驱动代码如下

netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_IGMP;

  EMACInit(hdkif->emac_ctrl_base, hdkif->emac_base);

 

  MDIOInit(hdkif->mdio_base, MDIO_FREQ_INPUT, MDIO_FREQ_OUTPUT);

  while(delay--);

 

  EMACRxBroadCastEnable(hdkif->emac_base, 0);

 

  /* Set the MAC Addresses in EMAC hardware */

  EMACMACSrcAddrSet(hdkif->emac_base, hdkif->mac_addr);

 

  /* Acknowledge receive and transmit interrupts for proper interrupt pulsing*/

  EMACCoreIntAck(hdkif->emac_base, EMAC_INT_CORE0_RX);

  EMACCoreIntAck(hdkif->emac_base, EMAC_INT_CORE0_TX);

 

  EMACRxUnicastSet(hdkif->emac_base, 0);

EMACRxMultiCastEnable(hdkif->emac_base, 0);

  EMACNumFreeBufSet(hdkif->emac_base, 0, 10);

 

  /* Write the RX HDP for channel 0 */

  EMACRxHdrDescPtrWrite(hdkif->emac_base, (U32)rxch->active_head, 0);

 

  EMACTxEnable(hdkif->emac_base);

  EMACRxEnable(hdkif->emac_base);

 

  EMACMIIEnable(hdkif->emac_base);

 

 

  /**

  * Enable the Transmission and reception, enable the interrupts for

  * channel 0 and for control core 0

  */

  EMACTxIntPulseEnable(hdkif->emac_base, hdkif->emac_ctrl_base, 0, 0);

  EMACRxIntPulseEnable(hdkif->emac_base, hdkif->emac_ctrl_base, 0, 0);

 

代码没有全部贴出来,这些都是调用EMAC接口的部分。这样配置有没有什么问题?

 

期望能帮忙解答,谢谢

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,由于假期在即,英文论坛的答复将会有所延迟,感谢您的耐心等待!

  • 您好,

    您还需要设置 MACHASH1和 MACHASH2寄存器来匹配要侦听的组播地址。 它是一个hash值,因此它获取 MAC 地址的48位并将其hash到单个位位置。 您必须在HASH寄存器中设置该位置。 

  • 感谢您的回复,这个值应该设置成多少呢,我使用0通道,设置成0xffffffff,可以收到组播数据了,这个hash应该怎么计算呢?

  • 您好,

    这个hash应该怎么计算呢?

    首先使用以下公式从要侦听的 MAC 地址计算6位hash函数:

    此处的Hash_Fun (0)表示位0,Hash_Fun (1)表示位1,依此类推。

    现在基于输入的 MAC 地址( 00 00 00 00 00 00 至 FF FF FF FF FF FF)您可以得到64个可能值,即0至63。

    因此要接收相应的 MAC 地址,必须设置 MACHASH 寄存器中相应的位置位(MACHASH1为0至31位、MACHASH2为32至63位)。

    例如:

    如果您希望接收的组播 MAC 地址00 00 00 00 00 01,其6位hash函数值为0b000001,即value1,因此我们必须设置hash寄存器中的第一位,即 MACHASH1寄存器中的第一位,因此寄存器值为

    MACHASH1 = 0x00000001

    MACHASH2 = 0x00000000

    同样地,您甚至可以在hash寄存器中选择多个值来接收多个地址。

  • 好的,明白了,谢谢。