nRF24L01 是一款工作在 2.4~2.5GHz 世界通用 ISM 频段的低功耗单片无线收发器芯片。无线收发器包括:频率发生器、增强型 SchockBurstTM 模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过 SPI 接口进行设置。
目录
一、NRF24L01功能特性
- 自动应答以及自动重发功能
- 地址以及CRC检验功能
- 无线速率:1Mbps/2Mbps
- SPI接口速率:0~8Mbps
- 125个可选工作频道
二、怎么控制(读写)NRF24L01?
- NRF24L01是通过SPI接口与其通信,通过SPI访问(读/写)内部寄存器达到控制NRF24L01的效果。
- NRF24L01的SPI接口最大传输速率10Mbps
- 如果想通过SPI读写NRF24L01内部寄存器,那需要符合NRF24L01的指令格式,NRF24L01才能识别发送的指令,指令格式如下:
例如:配置通信信道为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来接收:
- 首先,模块A和模块B需要在同一信道(频道)
- 也需要配置模块A发送数据长度和模块B接收数据长度相等
- 然后给模块B配置一个接收地址ADDR_B
- 再配置模块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接收(他们都开启了自动应答和自动重发功能)
- 配置模块B的接收地址为ADDR_B
- 配置模块A的发送地址也为ADDR_B
- 假设模块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。
通过原理图可看到,TXEN没接到MCU而是接到了NRF24L01的VDD_PA引脚,因为VDD_PA引脚在NRF24L01发送数据时会为高电平,接收数据时为低电平(通过示波器观察)。符合上图的RFX2401C的控制逻辑。
- 假设模块A发送数据,模块B没有收到,这时模块A收不到ACK并等待超时,就是重新发送数据,直到超过配置的重发次数。达到最多重发次数后,如果“达到最大重发次数”中断开启了,就会触发中断。(至于怎么开启自动重发、配置哪个寄存器等,在数据手册上可以查到)
六、一对一通信比较简单、多对一呢?
实际应用中,多对一通信的场景也是很多的,但是NRF24L01通过6个接收数据通道来实现1对6,往往不能满足我们的们求,比如我想1对100该怎么实现?
其实一对多或多对一就是想多个模块通信,又不发生干扰,查资料知道可用“跳频”、“设置不同收发地址”、“分时访问”等方法,等测试后再总结。