K64以太网怎么设置多播?
如果你想用混杂模式的话,先增加一个回调函数,再增加一个多播组,然后设置为网口混杂模式
ihandle = ipcfg_get_ihandle(port);
if(ihandle != NULL)
{
if_ptr = (IP_IF_PTR)ihandle;
error = ENET_open(if_ptr->HANDLE, GOOSE_DATA_MSG_TYPE, IPE_recv_GOOSE, if_ptr);
if (error)
{
ENET_close(if_ptr->HANDLE, GOOSE_DATA_MSG_TYPE);
return FALSE;
}
return TRUE;
}
else
{
return FALSE;
}
2、ihandle = ipcfg_get_ihandle(port);
if_ptr = (IP_IF_PTR)ihandle;
ret = ENET_join(if_ptr->HANDLE, GOOSE_DATA_MSG_TYPE, groupAddr);
if(ret != ENET_OK)
{
return FALSE;
}
else
{
return TRUE;
}
3、 macnet_ptr = (ENET_MemMapPtr)MACNET_get_base_address(port);
_int_disable();/*关中断*/
macnet_ptr->RCR |= ENET_RCR_PROM_MASK;
_int_enable();/*开中断*/
还有一种是硬件过滤的方法,具体就是根据mac地址计算出64位hashcode,然后设置hash表寄存器
macnet_ptr = (ENET_MemMapPtr)MACNET_get_base_address(port);
if(macnet_ptr == NULL)
{
printf("register address error!\n");
return FALSE;
}
mdata = TSEC_HASH64(macAddr);
printf("\r\nCRC m A: 0x%x. mac:%02x_%02x_%02x_%02x_%02x_%02x",mdata,
macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]);
/*取出MSB,如果msb=1选择GAUR,如果msb=0选择GALR*/
index = mdata/32;
/*取出lsb5位,作为寄存器相应的bit位*/
val = mdata%32;
/*将寄存器的对应的val位置1*/
_int_disable();/*关中断*/
/*读取寄存器的值*/
regVal = *((volatile uint32_t*)((uint32_t)&(macnet_ptr->GALR)- index *sizeof(uint32_t)));
/*将regval 的val位置1*/
regVal |= (1 << val);
/*将值写入寄存器*/
*((volatile uint32_t*)((uint32_t)&(macnet_ptr->GALR)- index *sizeof(uint32_t))) = regVal;
_int_enable();/*开中断*/
