NRF24L01入门总结

nRF24L01 是一款工作在 2.4~2.5GHz 世界通用 ISM 频段的低功耗单片无线收发器芯片。无线收发器包括:频率发生器、增强型 SchockBurstTM 模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过 SPI 接口进行设置。

一、NRF24L01功能特性

  • 自动应答以及自动重发功能
  • 地址以及CRC检验功能
  • 无线速率:1Mbps/2Mbps
  • SPI接口速率:0~8Mbps
  • 125个可选工作频道

二、怎么控制(读写)NRF24L01?

  1. NRF24L01是通过SPI接口与其通信,通过SPI访问(读/写)内部寄存器达到控制NRF24L01的效果。
  2. NRF24L01的SPI接口最大传输速率10Mbps
  3. 如果想通过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就知道发送成功了(若发送完成中断开启,这时会触发中断)。

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

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

六、一对一通信比较简单、多对一呢?

实际应用中,多对一通信的场景也是很多的,但是NRF24L01通过6个接收数据通道来实现1对6,往往不能满足我们的们求,比如我想1对100该怎么实现?
其实一对多或多对一就是想多个模块通信,又不发生干扰,查资料知道可用“跳频”、“设置不同收发地址”、“分时访问”等方法,等测试后再总结。

  • 60
    点赞
  • 333
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

izar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值