微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > K64以太网怎么设置多播?

K64以太网怎么设置多播?

时间:10-02 整理:3721RD 点击:
哪位大神用过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();/*开中断*/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top