tuzhuke 发表于 2019-3-9 21:14:37

DWM1000 帧过滤功能实现

帧过滤功能可以在同一个环境内组建多个网络而不干扰(非频段不同),可以通过PANID(网络ID)区分不同网络,不同网络中的模块无法直接通信, 再之,利用短地址,网络中可以同时有多个模块发送信息,而接收端会根据信息短地址不同而自动过滤。

1 发送端部分,组建发送结构体,按照MAC 数据结构组织。
srd_msg_dsss msg_f ; // ranging message frame with 16-bit addresses
    int psduLength = 0;
    //set frame type (0-2), SEC (3), Pending (4), ACK (5), PanIDcomp(6)
    msg_f.frameCtrl = 0x1 /*frame type 0x1 == data*/ | 0x40 /*PID comp*/;
    //source/dest addressing modes and frame version
      //msg_f.frameCtrl = 0x41;
    msg_f.frameCtrl = 0x8 /*dest extended address (16bits)*/ | 0x80 /*src extended address (16bits)*/;
    msg_f.panID = 0xF0;
    msg_f.panID = 0xF0;

    msg_f.seqNum = 0;
    msg_f.messageData = 3; //copy new range number
    msg_f.messageData = RTLS_DEMO_MSG_ANCH_POLL; //message function code (specifies if message is a poll, response or other...)
    psduLength = (TAG_POLL_MSG_LEN + FRAME_CRTL_AND_ADDRESS_S + FRAME_CRC);
    msg_f.seqNum = 0; //copy sequence number and then increment
    msg_f.sourceAddr = 0x02; //copy the address
    msg_f.sourceAddr =0x02; //copy the address
    msg_f.destAddr = 0x01;//set the destination address
    msg_f.destAddr = 0x01;//set the destination address

其中数据结构 srd_msg_dsss 部分摘录自官方源码。模块所在PANID = 0xF0F0, TX 本身短地址0x0202,RX本身短地址0x0101。-->接收端需要配置同样的PANID以及RX本身地址启动发送代码dwt_writetxdata(psduLength, (uint8 *)&msg_f, 0) ; // write the frame data
   dwt_writetxfctrl(psduLength, 0);
   /* Start transmission. */
   dwt_starttx(DWT_START_TX_IMMEDIATE);2 RX 使能帧过滤功能以及配置PANID 和 短地址 dwt_enableframefilter(DWT_FF_DATA_EN | DWT_FF_ACK_EN);
   dwt_setpanid(0xF0F0);
   dwt_setaddress16(0x0101);接收并打印信息if (status_reg & SYS_STATUS_RXFCG)
{
            //printf("Step3!\r\n");
            /* A frame has been received, copy it to our local buffer. */
            frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;
            if (frame_len <= FRAME_LEN_MAX)
            {
                dwt_readrxdata(rx_buffer, frame_len, 0);
                USART_puts(rx_buffer,frame_len);
                //printf("Y!\r\n");
            }
            /* Clear good RX frame event in the DW1000 status register. */
            dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);
}按照上述代码实现,RX端可以接收到TX发送的信息。增加实验:不论单独修改TX/RX 任何一端的PANID 和 短地址,RX端均不能收到数据,说明帧过滤功能正常。


lu_jf97 发表于 2019-7-16 09:13:37

非常有用的东西,不知道怎么才能下载

tuzhuke 发表于 2019-7-16 09:27:08

lu_jf97 发表于 2019-7-16 09:13
非常有用的东西,不知道怎么才能下载

积极发言
共享资料
赚金钱:D

lu_jf97 发表于 2019-7-16 10:11:42

金币够了,我换个浏览器试一试

lu_jf97 发表于 2019-7-16 10:13:23

用IE就可以了,谢谢,哈哈

Henry 发表于 2019-11-12 11:21:01

感谢楼主分享!

zigbee_luo 发表于 2019-11-15 18:16:57

ACK Pending是不是要支持帧过滤?

joinecy001 发表于 2019-12-25 16:33:52

下载学习下

lwd04 发表于 2020-4-21 20:03:22

谢谢分享!来学习下

wo4fisher 发表于 2020-4-23 09:47:12

感谢分享!
页: [1] 2 3 4 5 6 7
查看完整版本: DWM1000 帧过滤功能实现