NRF24L01注意点
nrf24L01被设置为接收模式后,可通过6个不同的数据通道(data pipe)接收数据。
每个数据通道都有一个唯一的地址但是各数据通道的频率是相同的。这意味着可以有6个被配置成发送状态的nRF24L01可以和一个配置成接收状态的nRF24L01通信,并且接收方可以区分(通过判断状态寄存器的1-3位即可达到区分的目的)。
数据通道0有一个唯一的40bit的可设置的地址。其余的通道1到通道5则地址前32位相同,而后8位不同。所有的数据通道都可以实现Enhanced ShockBurst模式。
在发送端,数据通道0被用来接收确认信息,因此发送端的数据通道0的地址必须等于发送地址,这样才能收到应答信息。
当一个24L01发送结束后,它会打开接收器并等待确认。如果没有收到确认,则重发,直到收到确认。当重发超过一定次数则发出中断并改变状态寄存器。重发次数的限制在SETUP_RETR_ARC寄存器中设置。
无论何时收到确认,都会认为上一个数据包发送成功,这个数据包将被从发送缓冲区清除,并且把TX_DS IRQ置为高。
每次开始spi写,读回来的都是状态字。
增强型ShockBurst包格式
前置域1byte
地址域3-5byte
包控制域9bit
载荷0-32字节
CRC1-2字节
地址域是接收机地址
包控制域
载荷长度6bit
Pid2bit
NO_ACK1bit
载荷长度:6bit说明最多32字节
Pid:用于包编号,用于确定是重发包还是新包
NO_ACK:用于表示是否自动应答,如为1则表示无需自动应答
自动应答的延时和重发次数是可编程的。
24L01的工作模式和寄存器及IO口的关系如下
CE引脚的作用
一个ESB(Enhanced ShockBurst)周期,发送一个字节连带收到ACK大约339us
从powerdown状态需要先进入standyby状态,该状态转换需要1.5ms延迟,从standyby状态进入rx/tx状态,需要130us
置高CE维持最少10us,启动Enhanced ShockBurst发送。
Enhanced ShockBurst™模式下发送数据流程
1.配置config寄存器,将PRIM_RX置为0,表示发送模式
2. 当需要发送数据时,首先需要配置地址TX_ADDR,这个地址应该是接收端地址(即应该是接收端6个data pipe地址中的一个即可保证对方收到)。如果要使用自动应答,因为应答消息由发送端的datapipe0接收,所以发送的datapipe0的地址应等于TX_ADDR(若是和上一次发送是相同地址,则可不用重写地址)。
3.配置数据负载长度TX_PLD,将需要发送的数据送入nrf24L01,通过SPI连续写入数据载荷时,nrf24L01将自动对字节数计数。(数据载荷必须在cs为低的时候连续写入)
4.将CE置高并维持最少10us,这个脉冲将启动ShockBurst发送
5.NRF24L01:
a)打开射频
b)启动晶振
c)数据打包
d)发送数据
6.如果启动了自动应答(且重传次数未达到最大值),NRF24L01将自动转入接收状态。
1:若在规定时间内收到了应答包,则这是一次成功的发送,TX FIFO中的数据被清除,同时置高status寄存器中的TX_DS位。
2:如果在规定时间内未收到应答包则自动重传(当启用自动重传时,由SETUP_RETR寄存器中的ARC位指定重传次数)。
3:当重传次数到达最大值依然没有收到应答,则status寄存器中的MAX_RT被置高,TX FIFO缓冲区中的数据并不被移除。
MAX_RT或TX_DS被置高都会在IRQ引脚上引起中断(低电平有效,重写status寄存器中的对应位可清除)。在到达最大重传次数并引发中断后,在没有清除MAX_RT之前,任何数据都不能发送。每次发生MAX_RT中断,PLOS_CNT计数器都会加1,用于统计丢包数。
7.CE置低以后,设备进入STANDBY_I状态。否则TX FIFO缓冲区中的下一个数据载荷将被发送。如果数据缓冲区空,而CE仍然为高,设备将进入STANDBY-II模式。
8.如果设备处于STANDBY-II模式,当CE置低后,设备将进入STANDBY-I模式。
(STANDBY模式可减少电流的消耗,在该模式下,SPI通信仍然可以完成)
Enhanced ShockBurst™模式下接收数据流程
1.设置config寄存器中的PRIM_RX为1,且置CE为高
2.130us之后,NRF24L01开始监视射频信号
3. 当合法的包被接收到(地址匹配),数据被存储到RX-FIFO缓冲区中,status寄存器中的RX_DR被置高,IRQ引脚同时发出中断信号(如果未屏蔽该信号)。Status寄存器中的RX_P_NO指示这个应该接收该数据的DATA PIPE号。
4.如果自动应答启用的话,一个应答信号将被发出
5.MCU将CE置为低将进入STANDBY-I模式
6.MCU可通过SPI读出接收到的数据
另外:关于24L01组网想说明几点应注意的地方:
(1)注意地址的分配
文档中明确说明只有通道0具有5个字节的可配置地址,其他的5个节点都只有1字节可自由配置地址,
比如可以在接收节点这样配置:uint const RXADR0[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
uint const RXADR1[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc1}; //通道1地址
uint const RXADR2[1]= {0xc2}; //通道2地址
uint const RXADR3[1]= {0xc3}; //通道3地址
uint const RXADR4[1]= {0xc4}; //通道4地址
uint const RXADR5[1]= {0xc5}; //通道5地址
然后将各发送节点地址与接收端相应通道地址设置相同即可
(2)接收节点对各发送节点进行区分
这个就是判断状态寄存器的1-3位即可达到区分的目的
一种Tx初始化过程
初始化步骤 | 24L01相关寄存器 |
1)写 Tx 节点的地址 | TX_ADDR |
2)写 Rx 节点的地址(主要是为了使能 Auto Ack) | RX_ADDR_P0 |
3)使能 AUTO ACK | EN_AA |
4)使能 PIPE 0 | EN_RXADDR |
5)配置自动重发次数 | SETUP_RETR |
6)选择通信频率 | RF_CH |
7)配置发射参数(低噪放大器增益、发射功率、无线速率) | RF_SETUP |
8 ) 选择通道0 有效数据宽度 | Rx_Pw_P0 |
9)配置 24L01 的基本参数以及切换工作模式 | CONFIG |
Rx初始化过程
初始化步骤 | 24L01相关寄存器 |
1)写 Rx 节点的地址 | RX_ADDR_P0 |
2)使能 AUTO ACK | EN_AA |
3)使能 PIPE 0 | EN_RXADDR |
4)选择通信频率 | RF_CH |
5) 选择通道0 有效数据宽度 | Rx_Pw_P0 |
6)配置发射参数(低噪放大器增益、发射功率、无线速率) | RF_SETUP |
7)配置 24L01 的基本参数以及切换工作模式 | CONFIG |
NRF24L01注意点的更多相关文章
- NRF24L01 无线模块的使用
NRF24L01 是一款工作在2.4-2.5GHz通用ISM频段的单片收发芯片 工作电压:1.9-3.6V低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象 多频点 ...
- [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程
前言: nRF51可以支持基于2.4G的互相通信.与NRF24LE1的通信.与NRF24LU1的通信.与NRF24L01的通信. 一.nRF51822基于2.4G和nRF51822通信 其中nRF5 ...
- nRF24L01芯片控制——迈向无线的第一步
nRF24L01芯片是一款专供单片机的射频收发芯片.工作于2.4GHz~2.5GHz ISM频段.融合了shockburst技术. 我先列出该芯片的硬件参数资料: 至于每个引脚的具体用途,可以参见技术 ...
- 2.4G无线射频通信模块nRF24L01+开发笔记(基于MSP430RF6989与STM32f0308)(1.(2)有错误,详见更正)
根据网上的nRF24L01+例程和TI提供的MSP430RF6989的硬件SPI总线例程编写程序,对硬件MSP-EXP430RF6989 Launch Pad+nRF24L01P射频模块(淘宝购买)进 ...
- 51单片机对无线模块nRF24L01简单的控制收发程序
它的一些物理特性如工作频段.供电电压.数据传输速率就不详细介绍了,直接上代码. 1.首先是发送端: // Define SPI pins #include <reg51.h> #defin ...
- [stm32] NRF24L01+USART搞定有线和无线通信
前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...
- [51单片机] SPI nRF24L01 无线简单程序 1
main.c #include <reg51.h> #include <api.h> #define uchar unsigned char /**************** ...
- [51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]
main.c #include<reg51.h> #include"2401.h" #define uint unsigned int #define uchar un ...
- [51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制
哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过 ...
- 自制单片机之十八……无线通讯模块NRF24L01+
(一)基础知识篇 今天刚调试好,先看图吧! 这张是AT89C2051控制NRF24L01+做发射调试. 看看NRF24L01细节吧! 这是LCD屏显示: AT89S52做接收测试: 正在接收时的显示: ...
随机推荐
- bind: Invalid argument
出现此问题在于,listen函数在socket函数和bind函数之间. 例: /*客户端程序开始建立sockfd描述符*/ listenfd = socket(AF_INET,SOCK_STREAM, ...
- java String类为什么是final的
1.为了安全 java 必须借助操作系统本身的力量才能做事,jdk提供的很多核心类比如String,这类内的很多方法 都不是java编程语言本身编写的,很多方法都是调用操作系统本地的api,如果被继承 ...
- 【杂谈】RN的一点回顾与未来的展望
从开始到现在,笔者接触RN已经接近半年,适逢各种变化的发生,于是,简单的遐想了一下RN的未来. Airbnb在今年早些时候,宣布了放弃继续使用RN,并且发布了一篇“React Native at Ai ...
- [SDOI2013]spring
Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT 容 ...
- [Usaco2005 Jan]Muddy Fields泥泞的牧场
Description 雨连续不断的击打了放牛的牧场,一个R行C列的格子(1<=R<=50,1<=C<=50).虽然这对草来说是件好事,但这却使得一些没有草遮盖的土地变得很泥泞 ...
- 文件输入输出C++操作
基于C++的文件操作 在C++中,有一个stream这个类,所有的I/O都以这个"流"类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符: 1.插入器(& ...
- DFS Codeforces Round #306 (Div. 2) B. Preparing Olympiad
题目传送门 /* DFS: 排序后一个一个出发往后找,找到>r为止,比赛写了return : */ #include <cstdio> #include <iostream&g ...
- Kali linux 2016.2(Rolling)里的应用更新和配置额外安全工具
写在前面的话 你去打人家 ,你不伪装一下,化化妆 ,穿上盔甲,难道你傻逼一样的 拿着棍子就去打人家,人家 一眼不认出你是谁了.做坏事要伪装好自己 ,要把自己藏起来 ,让别人找不到你,你以为网络公 ...
- Java多线程——线程的创建方式
Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...
- 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路
1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文 ...