NRF24L01 无线通信模块使用
最后更新于:2022-04-01 14:51:30
NRF24L01驱动代码下载:[http://download.csdn.net/detail/ieczw/7029597](http://download.csdn.net/detail/ieczw/7029597)
NRF24L01调试了近一个星期!多多少少有点浪费感情,因为由于板子的问题害的我一直无法调通,后来又找了两块板子,立马搞好!当然我的程序很大成分上是参考老一辈革命家的;但是在这之间,由于板子的问题,迫使我对NRF24L01的datasheet进行了一番研究!
NRF24L01与控制器的通信采用的SPI通信协议,这个协议具体细节大家可能都懂,不懂的可以之间百度;他们的通信模型是这样的:

NRF*之间基本上可以互相通信,只要你地址设置的没有问题!他有六个通道,每一个通道都有自己的缓冲区,这六个通道可以同时跟不同的NRF进行通信,但是通信的两个之间的TX_ADDR和RX_ADDR一定要相同;

这幅图能够充分的说明这个问题;Point1 to Point2,Point1和Point2的通道地址一定要一样;具体的设置在下面这个寄存器里面配置:

NRF24L01有RX模式,TX模式,Standby-I模式,Standby-II模式,掉电模式;他们之间的模式转换如下图:

这张图看着可能没有一点感觉,比较乱,下面这张可能会比较清晰一点:

只要我们想切换到什么模式就可以根据这个对寄存器进行配置;不过在配置的过程中,一点要注意适当的延时,我这次也被这个延时纠结了半天;

从Standy Mode转化到Tx/Rx mode 我这次就是可能延时的比较长,导致初始化一直没有成功,我刚开始一直的想法是,只要我等待的时间越长,他就越容易实现我的配置;看来这种观念需要改正下;
为了让整个传输稳定和快速,我可以可以设置自动应答模式;但是他只适合单通道模式:

当发送方把数据发送给接收方,接收方会有一个短暂的延时大致130us,然后会高速发送方我接收了;然后接收方会产生一个中断信号,当发送方没有接收到这个ACk,他就会一直卡在这里;
说到他的中断,他有三种中断模式,一种是接收中断,二是发送完成中断,三发送超时中断;具体我们可以看STATU寄存器:

我们一般判断的主要是[6:4],RX_DR是接收到中断标志位,TX_DS发送完成中断标志位,MAX_RT超过最大发送次数标志位;这三位是可读可写的;写1的时候是清除中断标志位;这里还有一个预留位,我们一般不用,但是有时候我可以用他来测试看看是否写寄存器成功;当然,其他寄存器的预留位也可以来测试是否控制器与NRF模块通信是否正常。
另外还有FIFO_STATUS寄存器,他主要是检测FIFO寄存器的状态:

说这么久了,忘记说这个FIFO寄存器,也就是数据寄存器,他有32个Byte,所以我们在设置装载数据的大小时,只能最大设置为32byte;当然可以小于32byte;在接收模式下,如果接收完毕,我们最好把FIFO寄存器清空了,可以看FLUSH_RX寄存器,不过理论上,只要把数据读走,他都会自动清空;但是为了以防万一,还是清空了好;

这几个是比较重要的寄存器,要写寄存器的话,必须以W_REGISTER为基地址+命令地址进行写操作;读的话同样的方法;但是一般不写R_REGISTER,因为AAAAA=5bit Register Map Address,正好R_Register的高三位为0,所有Register Map Address的高三位都为0,所以我们可以不用写了;但是对于写操作,高三为为001,故我们一般定义W_REGISTER为0x20,然后与Command与操作;即可;
R_RX_PAYLOAD与W_TX_PAYLOAD作为发送和接收的缓冲区;
有什么不懂得,我们可以留言继续进行讨论,我觉得datasheet说的真的是太清晰了,有点地方你没有看懂,我估计是你没有找到。
请各位多多指教!