首页 > 其他分享 >DW1000的CCA例程

DW1000的CCA例程

时间:2023-09-05 13:44:05浏览次数:42  
标签:dwt tx 例程 period backoff DW1000 CCA

DW1000的CCA例程

介绍

​ 对于无线传感器网络应用,大多数的MAC协议都依赖于Clear Channel Assessment (CCA)来避免冲突。这包括对空中信号进行采样,检测信道是否空闲。一般的无线电可以通过检测载波信号来实现,但是对于UWB技术来说是不行的。对于UWB技术来说,一种可行的方案是只寻找前导码来避免冲突,因为在数据期间发送前导码通常不会干扰那些在数据模式下解调的接收机。如果没有检测到空中有前导码在传输,则自身启动发送,否则发射机将进行随机延时回退(random back-off )延时,延时后再次尝试使用CCA判断信道是否空闲,可否进行发送。

​ 在DW1000的官方SDK中,有一个CCA的例程,指导如何使用CCA方式:

代码分析

​ 核心源码如下:

void main()
{
    //some initial code
    //................
    
    while(1)
    {
        /* local variables for LCD output, this holdes the result of the most recent channel assessment y pseudo CCA algorithm,
        * 1 (channel is clear) or 0 (preamble was detected) */
        int channel_clear;

        /* Write frame data to DW1000 and prepare transmission. See NOTE 6 below.*/
        dwt_writetxdata(sizeof(tx_msg), tx_msg, 0); /* Zero offset in TX buffer. */
        dwt_writetxfctrl(sizeof(tx_msg), 0, 0); /* Zero offset in TX buffer, no ranging. */

        /* Activate RX to perform CCA. */
        dwt_rxenable(DWT_START_RX_IMMEDIATE);
        /* Start transmission. Will be delayed (the above RX command has to finish first)
         *  until we get the preamble timeout or canceled by TRX OFF if a preamble is detected. */
        dwt_starttx(DWT_START_TX_IMMEDIATE);

        /* Poll DW1000 until preamble timeout or detection. See NOTE 7 below. */
        while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXPRD | SYS_STATUS_RXPTO)));

        if (status_reg & SYS_STATUS_RXPTO)
        {
            channel_clear = 1;
            /* Poll DW1000 until frame sent, see Note 8 below. */
            while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS));

            tx_sleep_period = TX_DELAY_MS; /* sent a frame - set interframe period */
            next_backoff_interval = INITIAL_BACKOFF_PERIOD; /* set initial backoff period */
            /* Increment the blink frame sequence number (modulo 256). */
            tx_msg[BLINK_FRAME_SN_IDX]++;
        }
        else
        {
            /* if DW IC detects the preamble, as we don't want to receive a frame we TRX OFF
               and wait for a backoff_period before trying to transmit again */
            dwt_forcetrxoff();

            tx_sleep_period = next_backoff_interval; /* set the TX sleep period */
            next_backoff_interval++; /* If failed to transmit, increase backoff and try again.
                               * In a real implementation the back-off is typically a randomised period
                               * whose range is an exponentially related to the number of successive failures.
                               * See https://en.wikipedia.org/wiki/Exponential_backoff */
            channel_clear = 0;
        }

        /* Note in order to see cca_result of 0 on the LCD, the backoff period is artificially set to 400 ms */
        sprintf(lcd_str, "CCA=%d   %d  ", channel_clear, tx_sleep_period);
        lcd_display_str(lcd_str);

        /* Execute a delay between transmissions. */
        sleep_ms(tx_sleep_period);

    }
}

伪代码逻辑简化版本如下

void main()
{
    //初始化代码
    //。。。。。
    
    while(1)
    {
        启动接收();
        启动接收();
        //这里虽然同时启动接收和发射,但是只有接收结束后,发射才会启动
        
        while(接收到前导码 || 接收超时);
        if(接收超时)
        {
            //说明信道空闲,不对发射进行中断
            重新初始化延时参数();
                  
        }else
        {
            //检测到前导码,信道不空闲
            终止发射();
            更新随机延时参数();
            
        }
        延时();
        
    }
    
}

实际测试

该CCA程序如果需要进行测试的话,可以找台发射机使用Continuous Frame程序,对空中进行连续发帧。以此来确认信道空闲和占用时,CCA是否有用。

标签:dwt,tx,例程,period,backoff,DW1000,CCA
From: https://www.cnblogs.com/simpleGao/p/17679373.html

相关文章

  • PIOC-PIOC参考应用例程使用说明
    CH32X035芯片PIOC参考应用例程使用说明引言:CH32X035芯片内,嵌入了一个可编程协议I/O微控制器PIOC,即eMCU,该eMCU基于单时钟周期精简指令集的RISC8B内核,运行于系统主频,具有2K指令的程序ROM和49个SFR寄存器及PWM定时/计数器,支持2个I/O引脚的协议控制。在......
  • Qt绘制3D图形例程
    本文主要内容是关于QOpenGLWidget的使用。此控件用于代替旧的QGLWidget类。关于此类的使用方法可以参考Qt帮助相关内容。glDrawArrays(...)函数参数说明:OpenGL理解GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN等绘制三角形序列的三种方式_匆忙拥挤repeat的博客-CSDN博客变量修饰符说明......
  • 关于CH32V307 RT-Thread例程配置使用FPU注意事项
    关于在CH32V307EVTRT-Thread例程基础上配置修改使用FPU操作流程CH32V307EVT下载链接:https://www.wch.cn/downloads/CH32V307EVT_ZIP.html 1、首先需要注意对MRS进行配置,具体配置方式可参考下贴:https://blog.csdn.net/qq_36353650/article/details/127262634 2、除上述......
  • DW1000芯片的RF测试与校准:接收灵敏度测试
    DW1000芯片的RF测试与校准:接收灵敏度测试基本原理​ 一般来讲,接收机的接收灵敏度指标测试会通过丢包率来进行评估。即以一个标准的发射机对待测接收机进行发包,然后统计丢包率。然后逐步降低发射机的发射功率,观察丢包率的变化情况。一般来讲,随着发射机发射功率越低,丢包率也会越高......
  • TwinCAT3中通过PLC修改Coe参数的例程
    CoE接口的驱动器,要在PLC程序中修改驱动器参数,可以使用CoeSDO通讯的方式。CoeSDO通讯的功能块包括FB_EcCoeSdoRead,FB_EcCoeSdoWrite,FB_EcCoeSdoReadEx,FB_EcCoeSdoWriteEx等,属于库文件TcEtherCAT.Lib。以FB_EcCoeSdoWriteEx为例。首先导入Tc2_Ether......
  • [8月摸鱼计划] MILKV DUO可以实现的功能及例程
    MILKVDUO是一个基于深度学习的计算机视觉库,它提供了许多功能和例程来处理图像和视觉任务。下面是几个MILKVDUO可以实现的功能以及相应的功能例程:图像分类(ImageClassification):功能:将输入的图像分为不同的类别或标签。例程:使用预训练的卷积神经网络(CNN)对图像进行分类,例如将猫和狗......
  • v831-c-yolov2例程解析
    没错,自从把ubuntu搞坏之后无奈把之前的例程全删了,因此所有的笔记都没了,又得从新分析一遍main函数先从最简单的main分析此函数主要创建一个屏幕句柄用来显示,然后调用nn_test来开始yolov2的操作,并且传入画布,显示等都在里面操作,最后跳出来后摧毁屏幕nn_test函数此函数很长,一点......
  • 运动控制-达妙C#开源USB2CAN例程
    C#Can总线资料不多,达妙USB2CAN入口http://www.dmbot.cn/forum.php?mod=viewthread&tid=328&extra=page%3D1......
  • 第三届计算机应用与信息安全国际会议(ICCAIS2023)
    由湖北省众科地质与环境技术服务中心主办的2023第三届计算机应用与信息安全国际会议(ICCAIS2023)将于2023年12月20-22日在中国武汉召开。 ICCAIS2023力图建立 一个国际化的计算机应用与信息安全领域的学术交流平台,分享最新进展和研究成果。期待您的参与。 ★重要信息大会时间:20......
  • [引]CCAA ITSMS 信息技术服务管理体系基础考试大纲
    CCAA-TR-111-01信息技术服务管理体系基础考试大纲_中国认证认可协会 http://www.ccaa.org.cn/ksdg/644.html申请注册信息技术服务管理体系审核员实习级别的人员,需通过“信息技术服务管理体系基础”科目考试。2.2考试方式“信息技术服务管理体系基础”科目考试为闭卷考试,考......