检测信道占用的需求场景

在使用nRF24L01模块做一对多或多对一的组网通信中,大家都会担心一个问题就是在发送的时候,希望不要有其他的模块也进行发送,因为这样就会使无线信号发生碰撞,信道被堵塞,造成通信失败。

为了避免这种情况发生,就希望在发送前能知道当前信道是否处于空闲,如果空闲就发送,否则就等待一会,直到空闲下来再执行发送。利用这个机制,可以很大程度上规避碰撞的发生。

在nRF24L01+中怎样知道信道被占用了

在nRF24L01+中有个RSSI寄存器,地址是0x09,该寄存器的0号位是代表当前信道信号强度的。当接收信号强度小于-60dBm时0号位为0,大于-60dBm时为1,该寄存器7-1号位是保留位,固定为0。这样我们通过直接读取该寄存器的值是0还是大于0就知道信道是否被占用了。

下面是该寄存器在一些模块厂家官方例程里的定义:

#define RPD			0x09			//接收功率检测寄存器

#define RSSI		0x09			//接收功率检测寄存器

下面是通过读寄存器函数读取该寄存器的状态值的代码:

StatusRPD = nRF24L01P_Read_Reg(RPD);		//如果定义的是RSSI,那语句中RPD换成RSSI

通过上面语句得到的StatusRPD值,如果大于0则是信道被占用,在逻辑代码中通过这个判断就可以识别信道是否被占用了。也可以在发送前用循环等待这个值的变化,直到为0时进入发送状态。如下面的代码:

while(nRF24L01P_Read_Reg(RPD));

为什么用循环等待,有时候会死循环(一直返回1)

在实际应用中,使用上述方法的确可以得到当前的信道信号强度,达到判断信道是否占用的目的。但是在循环等待的时候,偶尔会出现死循环的现象。也就是读回来的状态值一直是1,但是的确没有模块在发送,已经将其他模块全部断电了,周围也没有强信号干扰,那么问题出在哪里呢?

仔细查看芯片手册,只找到下面这段话:

在接收模式下,可以通过RSSI寄存器检测接收信号功率。当接收到的信号强度大于-60dBm时,RSSI寄存器的RSSI位的值将被设置为1。否则,RSSI=0。。RSSI寄存器的更新方法有两种:当接收到有效的数据包后,RSSI会自动更新,此外,将芯片从RX模式换到Standby模式时RSSI也会自动更新。RSSI的值会随温度的变化而变化,范围在±5dBm以内

经过仔细分析和反复试验,理解了这段话所描述的具体内涵:

1、这个信号强度检测必须在接收模式下进行,在发送模式下是不准确的。

2、并不是无论什么情况下,这个寄存器都会被更新,只有CE由1变为0时才更新一次;或者在接收到有效数据的时候,会自动更为1。

3、当收到有效数据将该寄存器置1后,只有将接收FIFO寄存器的数据读出后,才会变为0,否则你变化几次CE都无效(这是手册没有提到的,多数会踩到这个坑)。

上面的死循环情况一般发生在执行发送的前夕,刚好收到一个有效数据时,RSSI寄存器被置1,而代码正在处理发送,又没有去读出数据,所以就一直保持着1,所以循环条件一直满足,就成了死循环了。

解决办法建议是在检测到为RSSI为1的时候,判断一下是否收到数据,如果收到数据先读出来,至于读出来的数据要不要处理,根据您自己的业务逻辑决定即可。然后操作一次CE引脚,再次更新检测一下是否有信号占用信道。此方法经过实际应用是有效的。

nRF24L01+如何检测信道被占用-RSSI寄存器实战分享的更多相关文章

  1. nRF24L01+组网方式及防撞(防冲突)机制的实战分享

    利用多个nRF24L01+模块组网通信的实现方式 这里讨论的组网方式,不包含使用6个通道实现的多对1通信方式,因其只限于6个发送端,局限性很大,可以附加其他技术实现更好的组网,暂时这里不讨论.这里分享 ...

  2. Java检测端口的占用情况

    突然间想到这个问题,在网上搜了一下 http://blog.csdn.net/danieluk/article/details/18518175 网上有很多文章都是用上面那个方法来解决这个问题的,总感 ...

  3. nRF24L01+启用自动应答ACK及自动重发的实战分享

    ACK模式(自动应答)功能的官方说明 当用W_TX_PAYLOAD命令对发送端TX FIFO写数据时,将数据打包后,数据包中包控制字段NO_ACK 标志位复位.接收端接收到一帧有效数据后, 产生RX_ ...

  4. nRF24L01+不能接收或接收偶尔异常等问题实战分享

    nRF24L01+接收异常问题综述 在调试nRF24L01+无线收发模块的时候,最具标志性的环节就是在接收端可以收到数据.在实际应用调试中,会出现很多意想不到的情况,造成nRF24L01+模块接收端无 ...

  5. 介质访问控制子层-Medium Access Control Sublayer:多路访问协议、以太网、无线局域网

    第四章 介质访问控制子层-Medium Access Control Sub-layer 4.1介质访问控制子层概述 MAC子层不属于之前提到的OSI或TCP/IP架构的任何一层,这也是为什么这一层被 ...

  6. Flex(flash)检测摄像头的3种状态(是否被占用,没安装摄像头,正常)

    在视频程序的编写过程中,我们经常要使用摄像头,在使用摄像头前有必要对摄像头的现有状态做个检测: 1.被占用 2.没安装摄像头 3.正常 camera=Camera.getCamera();       ...

  7. NRF24L01 射频收发 使用方法

    在干啥 这两天在调nrf24l01,最终还是参考正点原子的例程才调通,看芯片手册太难了 还要说啥废话 废话说到这,接下来上代码 SPI协议 spi.c #include "spi.h&quo ...

  8. 【计算机网络】-介质访问子层-(信道划分介质访问控制&随机访问介质访问控制)

    [计算机网络]-介质访问子层-概述 介质访问控制子层功能 解决信道争用的协议,即用于多路访问信道上确定下一个使用者的协议 是数据链路层协议的一部分 介质访问控制子层位置 位于数据链路层的底部! 信道分 ...

  9. 计算机网络之介质访问控制(静态划分信道、FDM、TDM、STDM、WDM、CDM)、(动态划分信道、ALOHA、CSMA、CSMA/CD、CSMA/CA)、令牌传递协议

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/104935912 学习课程:<2019王道考研计算机网络> 学习目的 ...

随机推荐

  1. 爬虫selenium中截图

    一.整个页面截图 driver = webdriver.Chrome() driver.get(url) diver.save_screenshot('保存路径') 二.局部截图 driver = w ...

  2. JQuery iframe宽高度自适应浏览器窗口大小的解决方法

    iframe宽高度自适应浏览器窗口大小的解决方法   by:授客 QQ:1033553122 1.   测试环境 JQuery-3.2.1.min.js 下载地址: https://gitee.com ...

  3. 从华为“鸿蒙”备胎看IT项目建设

    别误会啊,本文并不在讲大家在做IT项目建设的时候学华为做一个备胎系统,以防正主系统崩掉之后能够及时替换到备胎系统里面,不影响业务. 前段时间华为被美帝制裁,然后各家组织对华为各种限制.然而华为整体布局 ...

  4. [转]VBA Check if an outlook folder exists; if not create it

    本文转自:http://www.outlookcode.com/d/code/quarexe.htm To quarantine application file attachments This O ...

  5. 在标准实体特殊消息上注册插件及Dynamics CRM 2015中计算字段的使用

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复157或者20151005可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的 插件系列博客教程 讲述了 ...

  6. andorid popupwindow 更新时动画的实现,可实现一个窗口被一个窗口推上去的效果

    最近由于项目需要,一直在寻找一个弹出窗口,在另一个弹出窗口弹出时,推上去的效果,居然找不到,经过不懈的努力,终于实现了popupwindow在更新时的动画. 先上代码: import android. ...

  7. linux 的swap、swappiness及kswapd原理【转】

    本文讨论的 swap基于Linux4.4内核代码 .Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑. 希望本文能让读者了解Linux对swap的使用大概是什么样子.阅读完 ...

  8. 004 C/C++ 数据类型_类型别名

    #include "stdio.h" #include "stdlib.h" //这里定义了一个结构体. struct MyStruct1 { int a; f ...

  9. 【转载】C++:switch红色下划线,Error:控制传输跳过的实例化解决办法

    转载链接:https://blog.csdn.net/figoleon/article/details/50072029

  10. os 和 sys 的模块使用方法和模块

    os  的模块  方法 os.remove()删除文件 os.rename()重命名文件 os.walk()生成目录树下的所有文件名 os.chdir()改变目录 os.mkdir/maked ...