NRF24L01入门

12/25/2023 7:15:19 PM
679
0

硬件概述

无线电频率

nRF24L01+模块设计用于在全球ISM频段2.4 GHz下运行,并使用GFSK调制进行数据传输。数据传输速率是可配置的,可以是250kbps、1Mbps和2Mbps。

电源

该模块的工作电压范围为1.9至3.6V,但好消息是逻辑引脚可承受 5V 电压,因此您可以放心地将其与您最喜欢的 3.3V 或 5V 微控制器一起使用。

该模块支持可编程输出功率,即 0 dBm、-6 dBm、-12 dBm 或 -18 dBm。在 0 dBm 时,模块在传输期间仅消耗 12 mA,低于单个LED灯的消耗。另外它在待机模式下消耗 26 µA,在断电模式下消耗 900 nA。这就是为什么它是低功耗应用的首选无线设备。

SPI接口

nRF24L01+ 通过 4 针 SPI(串行外设接口)进行通信,最大数据速率为 10Mbps。频率通道(125 个可选通道)、输出功率(0 dBm、-6 dBm、-12 dBm 或 -18 dBm)和数据速率(250kbps、1Mbps 或 2Mbps)等所有参数都可以通过 SPI 接口进行配置。

SPI 总线使用主从的概念。在我们的大多数项目中,Arduino 是主机,nRF24L01+ 模块是从机。

与 I2C 总线不同,SPI 总线的从机数量有限。这就是为什么您可以在一个Arduino 上使用最多两个 SPI 从设备,即两个 nRF24L01+ 模块。

技术规格

以下是完整的规格:

●    频率范围:2.4 GHz ISM 频段

●    最大空中数据速率:2 Mb/s

●    调制格式:GFSK

●    最大输出功率: 0 dBm

●    工作电源电压:1.9 V 至 3.6 V

●    最大工作电流:13.5mA

●    电流(待机模式):26µA

●    逻辑输入:5V 容限

●    通信范围: 800+ m

nRF24L01+ 模块与nRF24L01+ PA/LNA模块

市场上有多种基于 nRF24L01+ 芯片的模块。以下是两个最受欢迎的版本。

第一个版本使用板载天线,允许更紧凑的分支版本。然而,更小的天线也意味着更短的传输范围。

使用此版本,您将能够在100米的距离内进行通信。当然,那是在户外的空旷地方。它的范围在房子内变得有点弱。

第二个版本带有一个 SMA 连接器和一个鸭形天线,但这不是唯一的区别。它带有一个特殊的RFX2401C范围扩展芯片,集成了PA、LNA和收发切换电路。该芯片帮助模块实现更大的传输范围,可达 1000 米。

除了这个区别,两个模块都是兼容的。这意味着,如果您使用其中一个构建项目,您可以简单地拔下它并使用另一个,而无需对系统进行任何更改。

什么是PA和LNA?

PA代表功率放大器。它只会放大从 nRF24L01+ 芯片传输的信号强度。而LNA代表低噪声放大器,其功能是从天线获取极弱的信号(通常低于微伏或 -100 dBm)并将其放大到更有用的电平(通常约为 0.5 至 1 V)。

接收路径的低噪声放大器 (LNA) 和发射路径的功率放大器 (PA) 通过双工器连接到天线,将两个信号隔离,防止相对强大的 PA 输出使敏感的 LNA 输入过载。

nRF24L01+ 模块如何工作?

nRF24L01+ 模块在称为信道的特定频率上发送和接收数据。要让两个或多个模块相互通信,它们必须在同一信道上。该信道可以是 2.4 GHz ISM 频段中的任何频率,或者更准确地说,它可以在 2.400 到 2.525 GHz(2400 到 2525 MHz)之间。

每个信道占用不到 1MHz 的带宽。这为我们提供了 125 个可能的信道,间隔为 1MHz。

这意味着 nRF24L01+ 可以使用 125 个不同的信道,允许您在一个地方创建一个由 125 个独立工作的调制解调器组成的网络。

该信道在250kbps和1Mbps空中数据速率下占用小于 1MHz 的带宽。然而,在 2 Mbps 的空中数据速率下,需要 2MHz 的带宽(大于 RF 通道频率设置的分辨率)。因此,在 2 Mbps 模式下,您应该在两个信道之间保持 2MHz 的间隙,以确保信道不重叠并减少串扰。

您选择的信道的频率根据以下公式确定:

频率(选定)= 2400 + CH(选定)

例如,如果您选择 108 作为您的数据传输通道,则您的通道的 RF 通道频率将为 2508 MHz (2400 + 108)。

nRF24L01+ 多接收器网络

nRF24L01+ 具有称为 Multiceiver 的功能。它是Multiple Transmitter Single Receiver的缩写。

 

在多接收机网络中,每个RF通道在逻辑上分为6个并行数据通道,称为数据管道。换言之,数据管道是单个物理射频通道中的六个逻辑通道之一。每个数据管道都有自己唯一的地址,称为数据管道地址。一次只能有一个数据管道接收一个数据包。

 

多接收机网络可以描述如下。

要了解多服务器网络,请想象主接收器充当集线器接收器,同时从 6 个不同的发送器节点收集信息。集线器接收器可以随时停止收听并充当发送器。

增强型 ShockBurst 协议

nRF24L01+ 使用称为增强型 ShockBurst 的数据包结构。这个简单的数据包结构分为 5 个不同的字段,如下所示。

 

 

最初的Shockburst 结构只包括Preamble、Address、Payload 和Cyclic Redundancy Check (CRC) 字段。增强型 Shockburst 使用新引入的数据包控制字段 (PCF) 为更高级的通信带来了更多功能。

 

这种新结构之所以很棒,有几个原因。

●    首先,它允许带有有效载荷长度说明符的可变长度有效载荷,这意味着有效载荷可以在 1 到 32 字节之间变化。

●    其次,它为每个发送的数据包分配一个数据包 ID,这允许接收设备确定消息是新消息还是已重传。

●    最后,也是最重要的一点,每条消息都可以请求接收者在收到消息后发送确认。

 

nRF24L01+ 自动数据包处理

让我们讨论三个场景,以更好地了解两个nRF24L01+模块如何相互交互。

 

●    带有确认的事务

这是一个主动情景的例子。在这里,发送器通过向接收器发送数据包来启动通信。一旦数据包被发送,它会等待大约 130 µs 以接收确认数据包(ACK 数据包)。当接收器接收到数据包时,它会向发送器发送 ACK 数据包。当发送方收到 ACK 数据包时,事务结束。

 

 

●    丢失数据包的事务

这是由于传输的数据包丢失而需要重新传输的被动示例。数据包发送完毕后,发送方等待接收 ACK 数据包。

 

如果发送器在自动重传延迟 (ARD) 时间内没有收到它,它会重传数据包。当接收方接收到重传的数据包时,它会发送 ACK 数据包,从而终止事务。

 

●    确认丢失的事务

这又是一个负面情况,其中由于ACK数据包丢失而需要重新传输。这里即使接收者自己在第一次尝试中已经收到了数据包,但由于ACK数据包丢失,发送者认为接收者没有收到数据包。

因此,在 Auto-Retransmit-Delay 超时后,发送器重新传输数据包。现在,当接收方收到与之前相同ID的数据包时,它会丢弃它并再次发送ACK数据包。当发送方收到ACK数据包时,事务结束。

 

 

整个数据包处理由 nRF24L01+ 芯片自动完成,无需微控制器参与。

 

怎么控制(读写)NRF24L01?

NRF24L01是通过SPI接口与其通信,通过SPI访问(读/写)内部寄存器达到控制NRF24L01的效果。
NRF24L01的SPI接口最大传输速率10Mbps
如果想通过SPI读写NRF24L01内部寄存器,那需要符合NRF24L01的指令格式,NRF24L01才能识别发送的指令,指令格式如下:

NRF24L01的SPI指令格式

例如:配置通信信道为40
通信信道寄存器为0x05,所以向NRF24L01的0x05地址写入40,则先发送0x25到NRF24L01,再发送40到NRF24L01即可(0x25 是由 0x20|0x05得到)

注意:写指令前先拉低CSN,写一条指令后拉高CSN。每写一次指令都必须经历”拉低CSN”、”写入指令”、“拉高CSN”三个步骤。

总体了解NRF24L01工作模式

NRF24L01是分不同的模式的,比如发送模式、接收模式、待机模式II、待机模式I、掉电模式,特定的模式做特定的事情,且不同模式下功耗也不同。怎么配置NRF24L01的模式呢?通过寄存器和外部引脚配合使其在不同模式下转换,如下图:

掉电模式:在掉电模式下,NRF24L01各功能关闭。功耗最小。

各个模式状态转换图:

怎样实现一个NRF24L01发送,另一个就能收到呢?

可以这样理解,有两个NRF24L01模块A和B,模块A发送,模块B来接收:

  1. 首先,模块A和模块B需要在同一信道(频道)
  2. 也需要配置模块A发送数据长度和模块B接收数据长度相等
  3. 然后给模块B配置一个接收地址ADDR_B
  4. 再配置模块A的发送地址(发给谁,就配成谁的接收地址)也为ADDR_B,这样模块A发送数据,模块B就能收到。

实际上模块B配置的接收地址ADDR_B只是它其中的一个接收数据通道的地址,一个模块有6个接收通道,模块B可以同时接收6个模块发来的数据(当然,应该不能同时发送,因为在同一信道(频道)同时发送会有干扰)。
以上就是两个模块通信的简单介绍,这里还可以继续深入了解,NRF24L01在收发数据时,硬件会将要发送的数据按照一定的格式封装成数据包,包括包头、包内容、校验等,这个格式可以不用具体关注,因为只要两个通信的NRF24L01配置相同即可,比如都开启CRC校验。

数据手册中也常提到ShockBurstTM模式和增强型ShockBurstTM模式,要知道这两种模式是说的数据包的处理方式。ShockBurstTM模式可以与Nrf2401/nRF24E1等通信兼容。

两种模式的主要区别如下(不是全部区别)

  ShockBurstTM 增强型ShockBurstTM
接收数据中断
CRC校验
自动应答 ×
自动重发 ×
可以看到增强型ShockBurstTM可以接收成功时自动应答和发送失败时自动重发,这样会极大的减少MCU工作量。    

   

自动应答和自动重发需要注意什么呢?

上面说的,一个模块有6个接收数据通道,分别为通道0、通道1……通道5,当开启自动应答和自动重发时,举例:还是模块A发送数据,模块B接收(他们都开启了自动应答和自动重发功能)

  1. 配置模块B的接收地址为ADDR_B
  2. 配置模块A的发送地址也为ADDR_B
  3. 假设模块A发送数据,模块B接收到了,这时模块B会回复A一个ACK,A就知道发送成功了(若发送完成中断开启,这时会触发中断)。
  4. 假设模块A发送数据,模块B没有收到,这时模块A收不到ACK并等待超时,就是重新发送数据,直到超过配置的重发次数。达到最多重发次数后,如果“达到最大重发次数”中断开启了,就会触发中断。(至于怎么开启自动重发、配置哪个寄存器等,在数据手册上可以查到)

注意:A是发送模块,应该处于上面讲的工作模式中的发送模式。所以这里有个细节就是当A开启自动应答和自动重传功能时,发送数据完成后会自动切换到接收模式等待接收端回复的ACK。

模块B回复ACK给模块A,那模块A的哪个接收数据通道接收呢?是数据通道0,所以要想数据通道0接收到ACK,模块A必须在发送数据前,就配置好接收数据通道0的地址,用来接收ACK,那这个地址配置成多少呢?这里NRF24L01就规定,接收端接收到数据后,会以“发送端发送地址”回复ACK,而发送端的发送地址就是接收端的接收地址ADDR_B,所以这几个地址都配置成ADDR_B就可以了,如下:

模块A 模块B
发送地址:ADDR_B 接收地址(某个通道):ADDR_B
数据通道0:ADDR_B  


为什么讲要注意NRF24L01发送数据时,数据发送完后会“硬件自动”切换为接收模式呢?
是因为,如果NRF24L01想配合RFX2401C芯片使用的话,RFX2401C是需要TXEN和RXEN两个引脚控制其处于 “发送-功率放大器”还是“接收-低噪声放大器”两个模式,如果将TXEN和RXEN两个管脚接到MCU控制就不太好了,因为MCU只知道配置了NRF24L01为发送模式,但是实际NRF24L01自己会自动切换为接收模式来接收ACK!所以MCU没办法正确控制RFX2401C,只能将它的TXEN和RXEN根据其逻辑接到NRF24L01的引脚上,让NRF24L01自动控制RFX2401C。

通过原理图可看到,TXEN没接到MCU而是接到了NRF24L01的VDD_PA引脚,因为VDD_PA引脚在NRF24L01发送数据时会为高电平,接收数据时为低电平(通过示波器观察)。符合上图的RFX2401C的控制逻辑。

全部评论



提问