首页 > 编程知识 正文

nrf24l01一对多通信(NRF24L01的使用)

时间:2023-05-04 13:20:39 阅读:121558 作者:1480

1、NRF24L01

2、引脚功能

3、51单片机I/O端口输出为5V,NRF24L01电源输入为1.9—3.6V,如果直接连接单片机电源,模块会烧毁,所以单片机电源端口

4、要通过NRF24L01进行通信,首先要知道发送接收的流程

发送过程:

MCU通过SPI基本配置NRF24L01,配置自动响应信道使能,将自动重发次数设置为0 (此处设置为允许重发分组),并设置为发送模式。 还有其他配置等

MCU将发送的数据和接收数据的设备的地址通过SPI写入NRF24L01

提高ce引脚开始发送

在这种情况下,有两种情况。

1 .如果在有限的时间内接收到响应信号,则将TX_DS设置为高(传输数据成功标记位),将IRQ中断(引脚IRQ设置为低),以清除TX BUf )。 IRQ中断需要复位写入状态寄存器)其中IRQ来自TX_DS,因此将TX_DS

2 .当数据重传次数超过设定值时,将MAX_RT提高到(达到最大重传次数标志位),产生IRQ中断),不清除TX BUf。 IRQ中断需要在写入状态寄存器中复位(其中IRQ发生在MAX_RT中,因此只要复位MAX_RT就可以复位IRQ ) )。

接收应答信号发生中断或达到最大重发次数发生中断后,NRF24L01继续发送下一个数据包数据。

TX BUf为空时进入待机模式2 (ce为高,txbuf为空时进入待机模式2; NRF24L01的操作模式曲线在最后,操作模式不必太在意,只要在合适的时候提升CE进行发送即可,配置NRF24L01时降低CE )

接收流程:

与发射模式类似,MCU最初通过SPI基本上布置NRF24L01,允许数据信道自动响应(可设置为在EN_AA寄存器接收到数据之后向主机发送响应信号),以及允许接收数据信道(例如

提高ce端子(提高ce )开始接收状态

接收到有效数据包后,数据保存在RX BUf中,设置为RX_DR中断(RX_DR为接收数据成功标志位,接收成功为1 )。 中断必须像发送模式一样复位。

接收设备自动向发送设备发送确认信号(不需要自己写代码) () ) ) ) ) ) ) ) ) ) )

将ce引脚设置为低,NRF24L01进入待机模式1

MCU通过SPI读取NRF24L01接收的数据

发送过程:

a. MCU通过SPI基本配置NRF24L01,配置NRF24L01

b .将要由MCU发送的数据和接收数据的设备的地址写入NRF24L01

提高c. CE端子,开始发送

接收过程:

a. MCU通过SPI基本配置NRF24L01,配置NRF24L01

b .提高ce端子,开始接收

c. MCU向NRF24L01读取数据

5、我们在使用NRF24L01时,有一个关于NRF24L01寄存器定义和相关函数创建的头文件。 这个文档在网上有很多。 我们只需要按照它的发送和接收过程调用相关函数来配置寄存器就可以了。

程序中,通过读取寄存器STATUS、FIFO判断发送部分的状态,发送成功后寄存器的值发生变化。 同样,在接收端也读取了寄存器CD的值。 这可能意味着,当接收侧接收到载波时,寄存器的值变为1,并且当没有检测到载波信号时,寄存器的值变为0。

通过检测寄存器的状态,可以判断两个模块是否正常工作。 例如,发送侧的2个寄存器的值正常变化时,发生侧正常动作。 从接收端来看,如果CD的值始终为0,则表示接收端的模块有问题。 这样可以缩小误区的范围。

通常,如果发送和接收正常,则函数NRF 24l 01 _ rx packet (可以通过rx buf读取接收端缓冲区的值。 此数组值的大小与发送的数组大小相同。

in-top:0px; margin-bottom:1.1em; color:rgb(51,51,51); font-family:'microsoft yahei'; line-height:26px"> 6、我在调试过程中遇到的问题 

按照上述的方法,我的三个寄存器都有数值上的变化,说明我的发射端正常工作,接受端也检测到了载波信号,但是仍然读不出数据。经过检查,我的有问题的地方如下: 
1、程序我是在单机收发的基础上修改的,所以配置寄存器的程序有两套。然后我在读取RXBUF的时候用到了我只定义但并没有写内容,然后编译器也没有报错,所以检查了好久。所以今后的程序但凡有重复的都要多加注意,可能稍不注意就用到了别的类似的函数,然后编译器还不会报错。
2、解决掉上面的问题后,我的功能还是没有实现,检查良久之后,发现我在发射检测得时候,把自动应答关掉了,就是SPI_RW_Reg_A(WRITE_REG + EN_AA, 0x01); 改回来之后就实现功能了。这个收获就是凡是在调试阶段改变的寄存器,在最后都要改回来,因为调试的时候因为某些原因不得不关掉某些寄存器的功能,但在最后通信的时候,这些功能都要打开。
7、总结 
1、读取相关寄存器的值可以辅助我们判断模块的工作状态。
2、调试改变的东西都要记录下来,在最后都是要改回来的。
3、在有相同功能的两个函数(用于不同的模块)时,一点要加倍注意调用的是哪个模块的函数。


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。