找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 65970|回复: 122
打印 上一主题 下一主题
收起左侧

[原创]NRF24L01+的5个通道调试经验,总调不通的可以来看看……

  [复制链接]
跳转到指定楼层
#
ID:84652 发表于 2015-7-26 23:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
历尽千辛万苦,失败了无数回……终于把NRF24L01+所有通道全调通了。在调试过程中,总结了一些经验。(下载成功计数又刷了几百~~~~(T o T)~~~~)
总体来看,NRF24L01+模块最麻烦的就是寄存器配置问题了,搞定了各个寄存器的配置,模块就通了。而通道设置也到处是寄存器的身影,一不小心就会通信失败,所以在准备调试NRF24L01+前一定要准备好资料。如果失败了,不要着急,一点一点来,排除所有可能的故障,如果人品不错的话,一会就搞定了……(╮(╯▽╰)╭我是没这个运气了……)
我的程序原版是从——NRF24L01无线模块多机通信单片机程序 上位机+下位机(出处: 单片机论坛)——这里搞的,在此感谢huyun的无私奉献……然后我也来回报一下社会吧……
很多人卡在通道调试这里,那就说说NRF24L01+通道的事情吧,一共有6个通道(数据手册里的pipe),其中通道0最容易了,去网上随便找个程序就搞定,比如我找的这个,连通道1也稍带上了。关键是剩下的那几个,尤其是通道2(2~5是极其相似的),在网上看到了很多人调不通,可是又没有专门的解决办法,只有多对一的通信范例,最后还是不知道问题出在哪。今天我试了一下,确实不易……但是经过大量实验,发现了很多不容易想到问题,都是不能调通的原因。

通道1调试:
发送部分:
通道1其实不只是把通道0程序里有关通道0的部分直接改成通道1的那么简单,别的通道更麻烦一点,这就是很多人调不通的原因。我刚开始也是直接改的,果然失败了……(⊙﹏⊙)b……然后又去看原来的程序,看到发送的数据不论是哪个通道,都装给了通道0的地址,不知道为什么,但是实验证明,确实必须这样……其中TX_ADDR地址要和发送的地址一样。
1.    /*装载数据*/
2.   SPI_Write_Buf(WRITE_REG + TX_ADDR, (uint8_t*)ADDRn, TX_ADR_WIDTH);//写TX节点地址     
3.  SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, (uint8_t*)ADDRn, RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK            

不论通道是几,其中要改动的只有(uint8_t*)ADDRn这个东西,其实就是对应的通道地址。不要动RX_ADDR_P0。
然后是寄存器配置,原贴里的注释有这么一行:“要配置第N个​的通道,前N个通道也必须被配置,要不然配置不成功。”瞬间恍然大悟( ⊙ o ⊙ )!,上回太心急,拿了程序就走了……正如原帖代码所示:
1.           SPI_Write_Reg(WRITE_REG + EN_AA, 0x3f); //使能通道所有的自动应答   
2.           SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3f);//使能通道所有的接收地址

这个是发送函数void NRF24L01_Init_TX(uint8_t*ADDRn)里的一段,作者把所有通道都打开了。其实经过试验,这里的通道必须把当前配置的通道和它前面的都配置。比如现在是通道1,就要至少使能为0x03,而不能是只打开通道1的0x02。
下面的选择通道n有效数据宽度,实验证明没有用,我一次只发1个字节,宽度设置成32,发过来还是1个字节……所以可以去掉。不过留着也不会出错。

接收部分:
首先经过试验,不设置TX_ADDR和RX_ADDR_P0没出错,所以可以去掉。
但是然后发生了奇怪的问题,经过大量试验,我这里通道1地址设置完了以后还要重新设置低位地址,不然没法调通,不知道为什么。如代码所示:
SPI_Write_Buf(WRITE_REG +RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK            
SPI_Write_Buf(WRITE_REG +RX_ADDR_P1, RX_ADDRESS1, 1);  //设置RX节点地址,主要为了使能ACK   
(奇怪的NRF24L01+(O__O"…),然后我想……我删掉的部分可能在别人那里就不一样了……可能。如果最后调不通就把我删掉的加上试试。)
后面的就是很正常的设置了,可以只开对应通道,比如通道1:0x02,对应数据宽度什么的……不用管别的通道怎么样。

通道2~5调试:
发送部分:
和通道1的调试方法一样,注意:
1.不要动RX_ADDR_P0。
2.配置第N个​的通道,前N个通道也必须被配置。

接收部分:
也和通道1一样……但是需要注意的是数据地址的写入,在定义数据地址的时候,根据数据手册,通道2~5与通道1共用32位地址,只有低8位可以改变且不能一样。如图:
所以改通道2~5地址的话只能通过改通道1的,然后写入对应通道低8位地址。数据手册里的RX_ADDR_P1表格里还有一句话:LSByteis written first。(先写最低位。)这很重要。所以根据写入字节的程序,地址要定义为:

这样,看懂没?除了通道0,只有地址数组的第0个元素在变化。网上很多程序是最后一个元素在变,好像数据手册的表里似的,这样就会导致只有通道0和1能调通,别的不能用。因为通道0和1是40位地址写入的,随便改,但是后面的地址必须只能改低位,如果高低位弄混了,改错了当然就不能调通了。当然我(Copy)的程序是先写第0个元素,如果别人的程序不一样那要另当别论。
知道了顺序以后就好办了,但是要注意写入的时候先写通道1的40位地址,再写所用通道的低8位地址,但是经过多次试验,那32位不要重复写入,数值一样也不行。这样就OK,程序如下:
SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK               
SPI_Write_Buf(WRITE_REG + RX_ADDR_P2, RX_ADDRESS2, 1);  //设置RX节点地址,主要为了使能ACK(地址长度只能是1,不能多写,写一样的值也不行)
然后剩下的就简单了,数据通道和数据宽度该是几就设置几,不用管别的通道。

对,结束了,其实并不难,只是可能有的问题没想到而已……我把原程序重新改了一下,进行了通道变换的封装,输入对应通道就可以在对应通道上点对点通信了,像这样:
  1. /***************************************************************************
  2. 函数名称:void NRF24L01_Init_TX(uchar pipe)
  3. 函数功能:初始化NRF24L01
  4. 函数备注:在调用NRF24L01作为发射时,都要先调用该函数对NRF24L01进行初始化
  5. ***************************************************************************/
  6. void NRF24L01_Init_TX(uchar pipe)//输入通道值
  7. {   
  8.         /*待机模式*/
  9.         CE=0;
  10.         CSN=1;
  11.         SCK=0;
  12.         /*装载数据*/
  13.         SPI_Write_Buf(WRITE_REG + TX_ADDR, pipe_add[pipe], TX_ADR_WIDTH);//写TX节点地址
  14.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, pipe_add[pipe], RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK  
  15.         /*配置寄存器*/
  16.         SPI_Write_Reg(WRITE_REG + EN_AA, 0x3F); //使能所有通道自动应答   
  17.         SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3F);//使能所有通道的接收地址(这两项定义的通道数不得小于当前使用的通道数,奇怪的NRF24L01+(O__O "…))
  18.         SPI_Write_Reg(WRITE_REG + RF_CH, 40);//设置RF通道为40   收发必须一致!
  19.         SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xFF);//自动重发  4000+86us    重发15次
  20.         SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启  收发必须一致!                  
  21.         SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断                          
  22. }


  23. /***************************************************************************
  24. 函数名称:void NRF24L01_Init_RX(uchar pipe)
  25. 函数功能:初始化NRF24L01
  26. 函数备注:在调用NRF24L01作为接收时,都要先调用该函数对NRF24L01进行初始化
  27. ***************************************************************************/
  28. void NRF24L01_Init_RX(uchar pipe)//输入通道值
  29. {   
  30.         /*待机模式*/
  31.         CE=0;   
  32.         CSN=1;   
  33.         SCK=0;   
  34.         /*装载数据*/
  35.         if(pipe == 0)                //通道,对应设置40位地址
  36.         {                             
  37.                 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, RX_ADR_WIDTH);  //设置RX节点地址,主要为了使能ACK
  38.                 SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), RX_ADDRESS0+pipe, RX_ADR_WIDTH);  //设置RX节点地址,主要为了使能ACK
  39.         }
  40.         else                                //其他通道,对应设置通道1公共地址和相应8位地址
  41.         {
  42.             SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK                  
  43.             SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), pipe_add[pipe], 1);  //设置RX节点地址,主要为了使能ACK(地址长度只能是1,不能多写,写一样的值也不行)                        
  44.         }
  45.         /*配置寄存器*/
  46.         SPI_Write_Reg(WRITE_REG + EN_AA, 1<<pipe);//使能通道的自动应答
  47.         SPI_Write_Reg(WRITE_REG + EN_RXADDR, 1<<pipe); //使能通道的接收地址   
  48.         SPI_Write_Reg(WRITE_REG + RF_CH, 40); //设置RF通道为40   收发必须一致!
  49.         SPI_Write_Reg(WRITE_REG + (RX_PW_P0+pipe), RX_PLOAD_WIDTH); //选择通道的有效数据宽度
  50.         SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启  收发必须一致!
  51.         SPI_Write_Reg(WRITE_REG + CONFIG, 0x0F); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  52. }
复制代码

亲测通道0~5均可用。如果想多对一通信,只需增加相应通道即可,反正配置方法已经告诉你了,这下没问题了吧。O(∩_∩)O哈哈~。当然,这样做了没问题却还是调不通的朋友可以在论坛里搜索,搜不到就去百度,百度不到可以用雅虎,不行再用谷歌,不行再用搜狗,不行再用360搜索,不行再用好搜,不行再用搜搜,不行再用Bing……要是还不行,可以选择联系我……w(゚Д゚)w。

       附上我稍作修改后的代码,太长,而且有3段,就打包了。
NRF24L01 .zip (36.7 KB, 下载次数: 780)

NRF24L01 资料.rar (10.58 MB, 下载次数: 451)


评分

参与人数 11黑币 +119 收起 理由
Jun默默淡定 + 10 很给力!
NPC-1024 + 10 绝世好帖!
zkkfly + 5 很给力!
perfect123 + 10 还没测试,回头有需要了再测试
有一天 + 5 很给力!
fqsqsdq123456 + 5 很给力!
qjzyx + 3 赞一个!
晴空依旧 + 8
李志岗 + 5
ssfc + 8 很给力!
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏51 分享淘帖 顶顶9 踩踩
回复

使用道具 举报

来自 122#
ID:199624 发表于 2017-5-12 15:32 | 只看该作者
那个CY应该是进位标记?我用的51 mcu,没这个CY,
我给他改成在dat左移之前的MOSI = dat & 0x80;

哈哈,这个真的能用啊,谢谢楼主。
网上分享的24L01P的各种代码满天飞,各个号称调通能用。结果没有一个好用。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

来自 121#
ID:84652 发表于 2018-5-27 13:28 | 只看该作者
诶呀呀,还有那么多人在看呀……其实通道应该用单词channel,不是pipe……英语水平太渣,希望大家不要介意……
回复

使用道具 举报

120#
ID:383843 发表于 2022-12-7 18:10 | 只看该作者
感谢分享,找了好久的资料了
回复

使用道具 举报

119#
ID:937285 发表于 2021-7-21 09:49 | 只看该作者
最近被这个模块搞懵逼了
回复

使用道具 举报

118#
ID:743449 发表于 2020-5-5 16:50 | 只看该作者
楼主,好不容易才有6个黑币,第一次下载就给你了哦,谢谢分享。

评分

参与人数 1黑币 +15 收起 理由
王朗的诱惑 + 15 稳赚不赔!

查看全部评分

回复

使用道具 举报

117#
ID:84652 发表于 2020-5-3 10:16 | 只看该作者
zhut290948199 发表于 2020-5-3 07:42
下载下来只有一个工程文件,你不是说有三个吗,收端的我下载下来没有,是什么原因呢

哦,我表述的不清楚……工程就1个,里面的源代码是3个文件: main.c, nrf.c, NRF24L01.H。用 main.c 里面的 #define RX 宏设置为发送或接收。
回复

使用道具 举报

116#
ID:739602 发表于 2020-5-3 10:10 | 只看该作者
多谢楼主了
回复

使用道具 举报

115#
ID:459370 发表于 2020-5-3 07:42 | 只看该作者
王朗的诱惑 发表于 2020-5-3 02:07
可能是keil版本问题,如果打不开可以自己新建个工程,反正源码都在,复制过去就好。

下载下来只有一个工程文件,你不是说有三个吗,收端的我下载下来没有,是什么原因呢
回复

使用道具 举报

114#
ID:84652 发表于 2020-5-3 02:07 | 只看该作者
zhut290948199 发表于 2020-5-2 22:44
我下载下来打不开是什么原因呀

可能是keil版本问题,如果打不开可以自己新建个工程,反正源码都在,复制过去就好。
回复

使用道具 举报

113#
ID:459370 发表于 2020-5-2 22:44 | 只看该作者
我下载下来打不开是什么原因呀
回复

使用道具 举报

112#
ID:84652 发表于 2020-4-21 02:20 | 只看该作者
JF.y 发表于 2020-4-20 01:52
楼主,能请你帮我做一个例程吗。能收发使用就行。我头都大了。

不能。要冷静啊,独立思考然后克服困难才可以成长。
冷静下来,分析下问题先。既然大家试验过程序,那么先假设程序没有问题。检查硬件:
1. 滤波一定要做好,检查给模块加上0.1uF电源滤波电容了没。调试成功前各种滤波电容要多加。
2. 模块电源供电电压3.3V是否正常?
3. 信号线上的信号是否正常?要排除断线或接触不良的可能,可以用示波器看看。
4. 找现成的平台,最好是开发板或者什么板子上带这个模块的,替换模块看看是不是模块坏了。
……
BTW,心烦意乱的时候推荐薯条炸鸡快乐水。
回复

使用道具 举报

111#
ID:710522 发表于 2020-4-20 01:52 | 只看该作者
楼主,能请你帮我做一个例程吗。能收发使用就行。我头都大了。
回复

使用道具 举报

110#
ID:84652 发表于 2020-1-7 22:21 | 只看该作者
龙凌敏月 发表于 2020-1-7 10:40
请问数据通道跟2.4G的信道有联系吗,我想改一下信道,但是不知道怎么改

这个不一样吧……我就不知道了。多研究下数据手册,多实验,加油。
回复

使用道具 举报

109#
ID:84652 发表于 2020-1-7 22:20 | 只看该作者
龙源大唐 发表于 2020-1-6 15:49
楼主,你好,刚接触NRF24L01,找了很多相关资料,还是没弄明白,向你请教,
如果接收端6个通道都接收数据 ...

没明白你遇到的问题……是多对一通信?还是一对一切换了通道?此外,我的建议是搞个通信协议,这个模块就是单纯的收发数据,没有协议的话很不稳定,之前试过多对一如果一起发就会卡死。
回复

使用道具 举报

108#
ID:476556 发表于 2020-1-7 10:40 | 只看该作者
请问数据通道跟2.4G的信道有联系吗,我想改一下信道,但是不知道怎么改
回复

使用道具 举报

107#
ID:637830 发表于 2020-1-6 15:49 | 只看该作者
楼主,你好,刚接触NRF24L01,找了很多相关资料,还是没弄明白,向你请教,
如果接收端6个通道都接收数据,可以把指定通道或所有通道的数据读取出来。测试了一下,不是6个通道依次读取的。(通道一接受了两次,然后通道二接受一次。。。)
怎么依次读取所有通道的数据?
回复

使用道具 举报

106#
ID:564280 发表于 2020-1-5 16:54 | 只看该作者
最近在学,感谢楼主
回复

使用道具 举报

105#
ID:296060 发表于 2019-5-29 14:18 | 只看该作者
好东西啊,学习下。。。
回复

使用道具 举报

104#
ID:548726 发表于 2019-5-27 20:19 | 只看该作者
你好,我没有积分,可以吧NRF2401+的代码发到我邮箱724469586@qq.com吗,谢谢,困扰好多天了

评分

参与人数 1黑币 +8 收起 理由
王朗的诱惑 + 8 拿去下载

查看全部评分

回复

使用道具 举报

103#
ID:548726 发表于 2019-5-27 20:10 | 只看该作者
我也刚开始搞,几天了没搞出来,发现楼主好贴,就是没积分下载

评分

参与人数 1黑币 +8 收起 理由
王朗的诱惑 + 8 拿去下载

查看全部评分

回复

使用道具 举报

102#
ID:501249 发表于 2019-3-31 15:23 | 只看该作者
谢谢楼主
回复

使用道具 举报

101#
ID:110278 发表于 2019-3-25 10:36 | 只看该作者
说的很清楚。收藏了。
回复

使用道具 举报

100#
ID:492708 发表于 2019-3-23 10:12 | 只看该作者
王朗的诱惑 发表于 2019-3-22 12:10
对,可以在软件里加通道识别码,不过我记得模块也有通道号相关的寄存器,不过这个我就没试过了。

好的,感谢楼主!
回复

使用道具 举报

99#
ID:84652 发表于 2019-3-22 12:10 | 只看该作者
_晨昏线 发表于 2019-3-20 15:41
那要如何判断数据是从哪个通道发出的?是在通信协议里规定好吗?(是个初学者)

对,可以在软件里加通道识别码,不过我记得模块也有通道号相关的寄存器,不过这个我就没试过了。
回复

使用道具 举报

98#
ID:492708 发表于 2019-3-20 15:41 | 只看该作者
王朗的诱惑 发表于 2019-3-18 13:32
不能简单的一起发,会卡住,得自己搞个通信协议,协调好所有模块,一个一个排队才行。

那要如何判断数据是从哪个通道发出的?是在通信协议里规定好吗?(是个初学者)
回复

使用道具 举报

97#
ID:84652 发表于 2019-3-18 13:32 来自触屏版 | 只看该作者
_晨昏线 发表于 2019-3-17 20:29
楼主,一直搞不懂资料说的多对一通信?这个模块能实习多对一的同时通信吗?如果能又要如何实现

不能简单的一起发,会卡住,得自己搞个通信协议,协调好所有模块,一个一个排队才行。
回复

使用道具 举报

96#
ID:403027 发表于 2019-3-17 21:38 | 只看该作者
谢谢楼主,谢谢分享
回复

使用道具 举报

95#
ID:492708 发表于 2019-3-17 20:29 | 只看该作者
楼主,一直搞不懂资料说的多对一通信?这个模块能实习多对一的同时通信吗?如果能又要如何实现
回复

使用道具 举报

94#
ID:200070 发表于 2018-12-18 10:23 | 只看该作者
谢谢楼主
回复

使用道具 举报

93#
ID:405002 发表于 2018-10-3 10:33 | 只看该作者
哇,没黑币了,肥肉眼前飘。。。谢谢楼主

评分

参与人数 1黑币 +35 收起 理由
王朗的诱惑 + 35 拿去花~

查看全部评分

回复

使用道具 举报

92#
ID:401417 发表于 2018-9-25 19:07 | 只看该作者
好东西谢谢分享
回复

使用道具 举报

91#
ID:302850 发表于 2018-9-25 16:30 | 只看该作者
这个必须顶啊,太好了,找的好辛苦
回复

使用道具 举报

90#
ID:84652 发表于 2018-8-28 12:09 | 只看该作者
落叶飘飘 发表于 2018-8-24 11:49
楼主,我的发送端状态一直是0x2e,应该表示发送成功,接收端偶尔能接收到一包数据,不知道怎么排查原因呢

确认能收到,而且是偶尔能收到的话,会不会是有干扰?干扰严重的话丢包率会很高。周围有没有运转的直流电机什么的?
回复

使用道具 举报

89#
ID:32630 发表于 2018-8-24 11:49 | 只看该作者
楼主,我的发送端状态一直是0x2e,应该表示发送成功,接收端偶尔能接收到一包数据,不知道怎么排查原因呢
回复

使用道具 举报

88#
ID:377611 发表于 2018-8-10 15:53 | 只看该作者
谢谢,这个真的太好了!
回复

使用道具 举报

87#
ID:377611 发表于 2018-8-10 15:53 | 只看该作者
谢谢,真的很好,比百度找的好太多了
回复

使用道具 举报

86#
ID:267810 发表于 2018-8-9 17:04 | 只看该作者
非常好,谢谢楼主,我对照着研究研究
回复

使用道具 举报

85#
ID:361917 发表于 2018-6-29 17:46 | 只看该作者
多对一通信,并发量太大,RX FIFO 很容易就FULL,难搞啊
回复

使用道具 举报

84#
ID:361917 发表于 2018-6-29 17:44 | 只看该作者
多对一通信,并发量太大,RX FIFO老是FULL,难搞
回复

使用道具 举报

83#
ID:84652 发表于 2018-6-1 08:04 来自触屏版 | 只看该作者
ZYP999 发表于 2018-5-30 18:18
楼主你好,我需要做两个从机,一个主机。我的思路是修改从机的射频通道。主机通过不停切换两个射频通道,这 ...

行吧。试试看。
回复

使用道具 举报

82#
ID:84652 发表于 2018-6-1 08:04 来自触屏版 | 只看该作者
582080360 发表于 2018-5-27 20:01
1475779659@qq.com,能不能发我邮箱啊,感谢

已发。
回复

使用道具 举报

81#
ID:184649 发表于 2018-5-30 18:18 | 只看该作者
楼主你好,我需要做两个从机,一个主机。我的思路是修改从机的射频通道。主机通过不停切换两个射频通道,这样可行吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表