Part Number:TMS570LC4357Other 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接口的部分。这样配置有没有什么问题?
期望能帮忙解答,谢谢
Cherry Zhou:
您好,我们已收到您的问题并升级到英文论坛寻求帮助,由于假期在即,英文论坛的答复将会有所延迟,感谢您的耐心等待!
,
Cherry Zhou:
您好,
您还需要设置 MACHASH1和 MACHASH2寄存器来匹配要侦听的组播地址。 它是一个hash值,因此它获取 MAC 地址的48位并将其hash到单个位位置。 您必须在HASH寄存器中设置该位置。
,
pengdi shi:
感谢您的回复,这个值应该设置成多少呢,我使用0通道,设置成0xffffffff,可以收到组播数据了,这个hash应该怎么计算呢?
,
Cherry Zhou:
您好,
pengdi shi 说:这个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寄存器中选择多个值来接收多个地址。
,
pengdi shi:
好的,明白了,谢谢。