nRF24L01+如何检测信道被占用-RSSI寄存器实战分享

检测信道占用的需求场景

在使用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寄存器的数据被读出后,才会变为1,否则你变化几次CE都无效(这是手册没有提到的,多数会踩到这个坑)。

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

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

原文地址:https://www.cnblogs.com/xueweisuoyong/p/10990361.html

时间: 2024-10-06 07:38:13

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

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

利用多个nRF24L01+模块组网通信的实现方式 这里讨论的组网方式,不包含使用6个通道实现的多对1通信方式,因其只限于6个发送端,局限性很大,可以附加其他技术实现更好的组网,暂时这里不讨论.这里分享的是所有nRF24L01+模块都使用通道0,实现的数量远超过6个的组网方式. 经过实战总结,可以实用到落地项目的有轮询方式.时分方式.自主避让方式等几种常用的组网方式,下面会逐一讲解实现原理. 防撞(防冲突)机制的实现原理 其实无论使用那种方式,都会涉及到防止冲突,也就是防止该信道出现多个发射信号冲

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

nRF24L01+接收异常问题综述 在调试nRF24L01+无线收发模块的时候,最具标志性的环节就是在接收端可以收到数据.在实际应用调试中,会出现很多意想不到的情况,造成nRF24L01+模块接收端无法收到发送端发出的数据. 根据以往对nRF24L01+模块的N多次调试的经验,总结大致可以分为如下几种情况: 现象1:一次也收不到发送端发送的数据 现象2:只能在发送端或接收端重新上电的时候收到一次 现象3:偶尔在发送完数据转为接收模式后就不能接收了 现象4:大功率带PA的模块工作一段时间就不能接收

如何解决微信域名检测和防封问题的经验分享

现在搞微商,微信项目的人遍地都是,有很大一部分人也是赚的盆满钵满.但是由于微信域名被屏蔽.拦截,给现在的很多微商等造成了不小的损失.腾讯现在对在微信中推广第三方网页内容管控的越来越严格.如果推广效果好一点,自己的网址域名就很有可能被拦截,用户打不开页面,造成流量中段,客户的流失严重.直接带来的就是经济的损失.那么怎样避免这一现象带来的经济损失呢?首先要做的就是微信域名检测,避免用户收到的是被屏蔽的域名,从而避免客户的流失.其次最为重要的就是微信域名防封.现在网上做微信域名检测与防封接口的也是数不

检测某个网站的链接速度代码分享

小伙伴们是否想检测网站的速度,那么下面的代码一定能帮助到你们! 把如下代码加入<body>区域中: <script language=Javascript> tim=1 setInterval("tim++",100) b=1 var autourl=new Array() autourl[1]="www.xxxx.xxx" autourl[2]="xxx.3322.xxx" autourl[3]="xxx.xx

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

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

&#9654;链路层第三弹&#9664; 两种信道下的数据链路层【下】广播通信CSMA/CD

两种信道情况下的数据链路层     之 广播信道的数据链路层---CSMA/CD(载波监听多路访问/冲突检测) l  局域网概念 在局域网中用到的就是广播通信,所以以局域网的通信来讲解广播信道的数据链路层特点.在学习广播通信 特点之前,先来了解一下局域网. n 局域网的分类 所有的PC机接到中间设备核心上.但是如果核心设备一点坏掉了,则所有PC机都将受到影响.虽然核心坏掉会出现问题,但是一般核 心不会坏,坏的一般是线路,星形网中线路的毁坏并不会影响其他PC的工作,所以星形网在局域网中用的比较多.

什么是信道复用?频分复用与时分复用的主要区别是什么?

信道复用频分复用 频分复用(FDM,Frequency Division Multiplexing)就是将用于传输信道的总带宽划分成若干个子频带(或称子信道),每一个子信道传输1路信号.频分复用要求总频率宽度大于各个子信道频率之和,同时为了保证各子信道中所传输的信号互不干扰,应在各子信道之间设立隔离带,这样就保证了各路信号互不干扰(条件之一).频分复用技术的特点是所有子信道传输的信号以并行的方式工作,每一路信号传输时可不考虑传输时延,因而频分复用技术取得了非常广泛的应用.频分复用技术除传统意义上

单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)

在无线通信中,NORDIC公司生产的NRF24L01无线收发模块是许多玩家的选择,它是2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片,具有功能较强而控制较方便并且价格便宜的优点.一块NRF24L01可以同时接收6个通道的发送数据,同时可以采用变频手段改变通信频道来避免无线通信干扰,下面简单介绍一下这种芯片的使用. 本次采用了两块单片机进行无线通信,一块型号为:STC90C51 16RD+        ,接收器:NRF24L01 另一块为:STC12C5A60S2        

android 内存泄漏检测工具 LeakCanary 泄漏金丝雀

韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha [email protected] 内存泄漏检测工具 android 内存泄漏检测工具 ======== 内存泄漏 就是  无用的对象没有被回收,占用着内存,使得可用内存变小了. 如何检测内存泄漏, 可以使用 LeakCanary来检测内存泄漏. leak  是 泄漏的意思.. Canary 是 金丝雀 的意思. 在运行 应用的时候, 泄漏金丝雀 如果检测到内存泄漏 会显示一个通知. ======== LeakCanary捕获