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寄存器的数据读出后,才会变为0,否则你变化几次CE都无效(这是手册没有提到的,多数会踩到这个坑)。
上面的死循环情况一般发生在执行发送的前夕,刚好收到一个有效数据时,RSSI寄存器被置1,而代码正在处理发送,又没有去读出数据,所以就一直保持着1,所以循环条件一直满足,就成了死循环了。
解决办法建议是在检测到为RSSI为1的时候,判断一下是否收到数据,如果收到数据先读出来,至于读出来的数据要不要处理,根据您自己的业务逻辑决定即可。然后操作一次CE引脚,再次更新检测一下是否有信号占用信道。此方法经过实际应用是有效的。
nRF24L01+如何检测信道被占用-RSSI寄存器实战分享的更多相关文章
- nRF24L01+组网方式及防撞(防冲突)机制的实战分享
利用多个nRF24L01+模块组网通信的实现方式 这里讨论的组网方式,不包含使用6个通道实现的多对1通信方式,因其只限于6个发送端,局限性很大,可以附加其他技术实现更好的组网,暂时这里不讨论.这里分享 ...
- Java检测端口的占用情况
突然间想到这个问题,在网上搜了一下 http://blog.csdn.net/danieluk/article/details/18518175 网上有很多文章都是用上面那个方法来解决这个问题的,总感 ...
- nRF24L01+启用自动应答ACK及自动重发的实战分享
ACK模式(自动应答)功能的官方说明 当用W_TX_PAYLOAD命令对发送端TX FIFO写数据时,将数据打包后,数据包中包控制字段NO_ACK 标志位复位.接收端接收到一帧有效数据后, 产生RX_ ...
- nRF24L01+不能接收或接收偶尔异常等问题实战分享
nRF24L01+接收异常问题综述 在调试nRF24L01+无线收发模块的时候,最具标志性的环节就是在接收端可以收到数据.在实际应用调试中,会出现很多意想不到的情况,造成nRF24L01+模块接收端无 ...
- 介质访问控制子层-Medium Access Control Sublayer:多路访问协议、以太网、无线局域网
第四章 介质访问控制子层-Medium Access Control Sub-layer 4.1介质访问控制子层概述 MAC子层不属于之前提到的OSI或TCP/IP架构的任何一层,这也是为什么这一层被 ...
- Flex(flash)检测摄像头的3种状态(是否被占用,没安装摄像头,正常)
在视频程序的编写过程中,我们经常要使用摄像头,在使用摄像头前有必要对摄像头的现有状态做个检测: 1.被占用 2.没安装摄像头 3.正常 camera=Camera.getCamera(); ...
- NRF24L01 射频收发 使用方法
在干啥 这两天在调nrf24l01,最终还是参考正点原子的例程才调通,看芯片手册太难了 还要说啥废话 废话说到这,接下来上代码 SPI协议 spi.c #include "spi.h&quo ...
- 【计算机网络】-介质访问子层-(信道划分介质访问控制&随机访问介质访问控制)
[计算机网络]-介质访问子层-概述 介质访问控制子层功能 解决信道争用的协议,即用于多路访问信道上确定下一个使用者的协议 是数据链路层协议的一部分 介质访问控制子层位置 位于数据链路层的底部! 信道分 ...
- 计算机网络之介质访问控制(静态划分信道、FDM、TDM、STDM、WDM、CDM)、(动态划分信道、ALOHA、CSMA、CSMA/CD、CSMA/CA)、令牌传递协议
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104935912 学习课程:<2019王道考研计算机网络> 学习目的 ...
随机推荐
- Cesium专栏-绕点飞行效果(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- Android 视频播放器 (四):使用ExoPlayer播放视频
一.简介 ExoPlayer是一个Android应用层的媒体播放器,它提供了一套可替换Android MediaPlayer的API,可以播放本地或者是线上的音视频资源.ExoPlayer支持一些An ...
- JS 输出
JS 输出 JavaScript 通常用于操作 HTML 元素. 操作 HTML 元素 如需从 JavaScript 访问某个 HTML 元素,您可以使用 document.getElementByI ...
- iOS事件传递和事件响应者链 20170810
一.事件响应者链 事件传递和事件响应链 区别 事件的传递和响应的区别: 事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件. 引出 当我们手指触摸屏幕 ...
- MySQL复习值代码知识点(1)
MySQL复习值代码知识点 一. 创建数据库 create database 数据库名: 二. 删除数据库 drop database 数据库名: 三. 选择相应的数据库 use 数据库名: 四. 创 ...
- Android开发与Sequoyah的安装问题
首次接触Android开发,在搭建开发环境时遇到困难,写出来和大家分享分享. 使用的ide为捆绑了adt插件和android sdk的eclipse adt bundle,无需安装android sd ...
- Linux iotop工具简介
iotop的简介: iotop是一款开源.免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息.它是Python语言编写的,与iostat工具比较,iostat是 ...
- [Go] go中的goto语句跳到指定标签
比如下面的语句goto TOP ,其中TOP就是自己的自定义的标签,下面的TOP:就是要执行的代码段一般用在需要两层循环的地方,里面goto再跳回上面去 ; i < ; i++ { { goto ...
- 线性代数笔记24——微分方程和exp(At)
原文:https://mp.weixin.qq.com/s/COpYKxQDMhqJRuMK2raMKQ 微分方程指含有未知函数及其导数的关系式,解微分方程就是找出未知函数.未知函数是一元函数的,叫常 ...
- eNSP仿真模拟软件之理解Hybrid接口的应用
1. 实验原理 Hybrid接口既可以连接普通终端的接入链路又可以连接交换机间的干道链路,它允许多个VLAN的帧通过,并可以在出接口方向将某些VLAN帧的标签剥掉. Hybrid接口处理VLAN帧的过 ...