打印
[应用相关]

NRF24L01模块使总结

[复制链接]
1467|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dingbo95|  楼主 | 2018-8-31 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.首先,NRF24L01是一个基于2.4GHZ的射频模块,增强型的具有更好的稳定性。
沙发
dingbo95|  楼主 | 2018-8-31 16:02 | 只看该作者
2.NRF使用的是SPI协议来进行操作,所以,需要理解SPI的几个输入输出口,再加以正确的时序操作,即可以操作NRF

使用特权

评论回复
板凳
dingbo95|  楼主 | 2018-8-31 16:02 | 只看该作者
3.对NRF的操作,总体上的是,使用SPI的六根线,IRQ,MISO,MOSI,SCK,CSN,CE对NRF中的寄存器进行操作以及状态的转换。

使用特权

评论回复
地板
dingbo95|  楼主 | 2018-8-31 16:03 | 只看该作者
4.SPI传输一组数据是使用交换的方式,即,通过时钟信号,一位一位的,在MOSI和MISO两个端口中读取,再交换数据的过程,当然,这是在时钟信号SCK的跳变下进行的,高电平到来,MOSI中数据被送出,下降沿到来,MISO中数据为从机发送过来的,依次进行八次交换,就可以交换一个字节的数据了。

使用特权

评论回复
5
buxieqiuzhi| | 2018-8-31 16:03 | 只看该作者
会不会受WiFi等的影响?

使用特权

评论回复
6
dingbo95|  楼主 | 2018-8-31 16:05 | 只看该作者
5.对NRF中的寄存器进行读取的话,思想:读取NRF中某个寄存器中的一个字节数据,而读取的话,有一个SPI指令,专门读取寄存器的,格式Read_cmd= 0x00 + 需要读取的寄存器地址,具体的还是要见NRF的中文手册,有专门的一张表,说明了对NRF各种操作的命令字。

使用特权

评论回复
7
dingbo95|  楼主 | 2018-8-31 17:17 | 只看该作者
6.对NRF中的寄存器进行写的话,思想和读取差不多,只要传入需要的参数即可,与此同时也可以返回寄存器中的状态寄存器的状态,这样可以知道当前NRF的工作状态。

使用特权

评论回复
8
dingbo95|  楼主 | 2018-8-31 17:17 | 只看该作者
7.那么,会读写操作以后,就要进行对NRF中专门收发的RX_FIFO和TX_FIFO寄存器操作了,在读写操作时,CSN先要置0,读写完了再置1,也就是说,读写需要先片选使能该模块。读写的时候,就是调用一个字节读写的方法进行一定长度的数据的读写,推荐使用地址长度为5个字节长度,数据长度4个字节长度。

使用特权

评论回复
9
dingbo95|  楼主 | 2018-8-31 17:18 | 只看该作者
8.在设置模式时,需要先把CE置0,使其进入待机模式,最后再置1

使用特权

评论回复
10
dingbo95|  楼主 | 2018-8-31 17:37 | 只看该作者
发送模式配置具体的一些配置见下:

/*首先配置发送地址,需要写命令到发送地址寄存器中,然后写入地址,再写入地址的宽度

参数一:写寄存器,写入到发送地址寄存器,表示要对其操作

         参数二:写入地址,收发地址相同,通道0的地址为5个字节大小可以随意改变

         参数三:写入的地址长度,为5个字节长度

         */

         SPI_Write_TxFIFO(W_REGISTER + TX_ADDR,TxAddr, TX_ADDR_WITDH);

         /*

     然后写入需要使用0通道作为接收端的应答通道,接收端在接收到数据后,记录该地址,然后通过0通道回复应答,

所以,0通道的地址需要和发送端的发送地址相同,这样才能保证接收到接收方发来的应答信号

         参数一:写寄存器,写入到通道0寄存器中

         参数二:写入通道0的地址,地址和发送端地址相同,保证接收到应答信号

         参数三:地址长度,为5个字节长度

         */

         SPI_Write_TxFIFO(W_REGISTER + RX_ADDR_P0,TxAddr, TX_ADDR_WITDH);

         /*紧接着可以开始写入数据了

         参数一:还是写寄存器,写入到写寄存器中,表示开始写数据了

         参数二:需要写入的数据

         参数三:需要写入的数据长度,长度为4个字节

         */

        SPI_Write_TxFIFO(W_TX_PAYLOAD,TxData,TX_DATA_WITDH);

              /*接下来需要配置各个寄存器,比如应答方式等,主要配置头开始的六个寄存器*/

//通过写一个字节就可以设置各个寄存器,所以不使用SPI_Write_TxFIFO();函数

SPI_Write_NRF(W_REGISTER+ EN_AA, 0x01);//使能通道0,通道0自动应答允许,要是不需要自动应答,则置0x00

              SPI_Write_NRF(W_REGISTER+ EN_RXADDR, 0x01);//允许通道0

            

              //SPI_Write_NRF(W_REGISTER+ SETUP_AW, TX_DATA_WITDH);

            

SPI_Write_NRF(W_REGISTER+ SETUP_RETR, 0x1a);//设置自动重发,,自动重发十六次

              SPI_Write_NRF(W_REGISTER+ RF_CH, 0x40);//设置通道频率是0!!!

         SPI_Write_NRF(W_REGISTER + RF_SETUP, 0x07);//射频寄存器使用000 0 11 1,采用1Mbps  0dBm,

              SPI_Write_NRF(W_REGISTER+ CONFIG, 0x0e);//设置CRC检验使能有效,十六位iCRC校验,上电,发射模式

使用特权

评论回复
11
dingbo95|  楼主 | 2018-8-31 17:56 | 只看该作者
10.  一个比较有用的是检测应答信号,这是一个检验是否成功发送过的重要标志,一旦接受到应答,或者是重发次数已经达到了最大值,都可以触发中断,也就是以下几位:

/*状态寄存器的4 5 6位,详见中文手册P17*/

unsigned charbdata sta;   //状态标志,bdata是允许对一个八位的数据,如sta的每一位进行操作,相当如IO口

sbit RX_DR=sta^6;//接收数据中断,当接收到有效数据后置一,写1清除中断

sbit TX_DS=sta^5;//发送数据中断,自动工作方式下,只有当收到应答信号以后此位才为1,写1清除中断

sbit MAX_RT=sta^4;//达到最多次重发中断,如果它的中断产生,则需要清除后,系统才能进行通讯



使用的是置1清除中断,也就是说,发送完一次,无论是发送成功还是发送达到最大次数,都会产生中断,这种中断是需要清除的,以保证下一次的正常发送操作。

使用特权

评论回复
12
dingbo95|  楼主 | 2018-8-31 22:06 | 只看该作者
11. 接收具体配置如下:

  //参数一:写入命令到通道0接收寄存器中,使用的地址和发送地址相同,才能保证正确的传输

         SPI_Write_TxFIFO(W_REGISTER + RX_ADDR_P0,TxAddr, TX_ADDR_WITDH);//写给NRF告诉它,现在准备接受通道0的数据

      

         /*接下来设置各个寄存器,使NRF工作在接受模式下!*/

         SPI_Write_NRF(W_REGISTER + EN_AA, 0x01);//使能通道0,通道0自动应答允许,要是不需要自动应答,则置0x00

              SPI_Write_NRF(W_REGISTER+ EN_RXADDR, 0x01);//允许通道0

              //地址宽度,不知要不要写,感觉应该是要写的

              //SPI_Write_NRF(W_REGISTER+ SETUP_AW, 0x03);//设置地址宽度,000000XX,因为使用五个地址宽度,所以XX = 11,即0x03

              SPI_Write_NRF(W_REGISTER+ RF_CH, 0x40);//设置通道频率是0!!!收发双方必须保持一致

              SPI_Write_NRF(W_REGISTER+ RX_PW_P0,RX_DATA_WITDH);//设置接收通道0的数据宽度,宽度需要和发射端一样宽??

         SPI_Write_NRF(W_REGISTER + RF_SETUP, 0x07);//射频寄存器使用000 0 11 1,采用1Mbps  0dBm,

         SPI_Write_NRF(W_REGISTER + CONFIG, 0x0f);//设置CRC检验使能有效,十六位iCRC校验,上电,接收模式

使用特权

评论回复
13
dingbo95|  楼主 | 2018-8-31 22:06 | 只看该作者
11.大概的NRF操作就是以上的几步,一次可以传输四个字节的数据,当连续的传输,就可以做到对一定的数据进行收集处理工作了。虽然我也是在别人程序的基础上,加以理解以后根据NRF的中文手册编写的程序,但是,我还是调试了三天,理解代码和最后有效的差距还是很大的,需要经过近乎绝望的调试,还要以防模块的烧坏,我已经十分小心了,还是烧坏了一个NRF模块,它对于电压还是很敏感的,使用时千万要小心。

使用特权

评论回复
14
dingbo95|  楼主 | 2018-8-31 22:07 | 只看该作者
12.讲一下调试步骤:①首先调试发送端,单纯的发送,不管接收端,这时候要把自动重发和校验关闭,要是发送成功,读取status状态寄存器中内容就可以判断是否正确发送了,如果正确发送了,status中的内容应该是2EH,这是根据NRF的数据手册得出的值,具体可以见手册。而发送端成功以后,就让发送端一直发送数据,去调试接收端,接收端的话,要是正确接收了,status中应该是40H,这样,NRF基本就通了,这里调试的时候可以借助串口调试工具,看到status寄存器中的值,串口是调试的好方法。

使用特权

评论回复
15
keaibukelian| | 2018-9-1 15:17 | 只看该作者
无遮挡通讯距离多少

使用特权

评论回复
16
木木guainv| | 2018-9-1 15:51 | 只看该作者
请问有代码吗

使用特权

评论回复
17
xiaoqizi| | 2018-9-4 11:01 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

1197

帖子

5

粉丝