OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14345|回复: 23

NRF24L01 在TXmode下一直判断为达到最大重发次数

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-5
在线时间
1 小时
发表于 2015-8-5 13:33:40 | 显示全部楼层 |阅读模式
5金钱
<br />
在迷你版上做的实验,按键1按下去 ,进入TX_Mode,在判断NRF24L01_TXPACKET(tem_buf)==TX_ok这里一直出错<br />

<br />
<br />
一直显示达到最大发送次数,然后就进不去下面的循环也就不能发送<br />

<br />
<br />
板子用的是迷你版v3.2,nrf24l01可以校验通过,请问这是怎么回事?<br />

最佳答案

查看完整内容[请看2#楼]

回复【9楼】正点原子: --------------------------------- 是的,现在已经调试桶了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-5
在线时间
1 小时
 楼主| 发表于 2015-8-5 13:33:41 | 显示全部楼层
回复【9楼】正点原子:
<br>---------------------------------
<br>是的,现在已经调试桶了。
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-5
在线时间
1 小时
 楼主| 发表于 2015-8-5 16:34:22 | 显示全部楼层
在NRF24L01_TXPACKET中读取到的sta为0x1e,正常为0x2e;求解。
回复

使用道具 举报

70

主题

6670

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12201
金钱
12201
注册时间
2012-11-26
在线时间
3640 小时
发表于 2015-8-5 16:54:10 | 显示全部楼层
试验里貌似需要两块板子,需要对方回应,认为是发送成功
<br>
<br>不太记得了&nbsp;&nbsp;&nbsp;你自己翻翻资料看是不是这样吧
学无止境
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-5
在线时间
1 小时
 楼主| 发表于 2015-8-5 17:58:26 | 显示全部楼层
回复【3楼】jermy_z:
<br>---------------------------------
<br>用了两块板子,分别设置成了tx模式和rx模式;但是两块板子都显示失败,
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-5
在线时间
1 小时
 楼主| 发表于 2015-8-5 17:59:07 | 显示全部楼层
@正点原子&nbsp;&nbsp;原子哥,麻烦解答
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-6-23
在线时间
8 小时
发表于 2015-8-5 18:18:06 | 显示全部楼层
回复【5楼】路口农夫:
<br>---------------------------------
<br>你在哪里读取的sta的值,
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-6-23
在线时间
8 小时
发表于 2015-8-5 18:21:58 | 显示全部楼层
24L01是收发双方都需要编程的器件,这就对调试方法产生了一定的要求,如果两块一起调,那么通讯不成功,根本不知道是发的问题还是收的问题,不隐晦的说,我当时也是没理清调试思路才浪费了大半天时间看着模块干瞪眼。正确的方法应该是先调试发送方,能保证发送正确,再去调接收,这样就可以有针对性的解决问题。
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;至于怎么去调发送方,先说下发送方的工作流程:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·配置寄存器使芯片工作于发送模式后拉高CE端至少10us
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·读状态寄存器STATUS
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·判断是否是发送完成标志位置位
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·清标志
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·清数据缓冲
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发送方发送-等应答-(自动重发)-触发中断。可是这样的流程就已经把接收方给牵涉进来了,就是说一定要接收方正确收到数据并且回送应答信号之后发送方才能触发中断,结束一次完整的发送。可是这跟我们的初衷不相符,我们想单独调试发送,完全抛开接收,这样就要去配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_AA,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//失能通道0自动应答
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_RXADDR,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;//失能接收通道0
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;SETUP_RETR,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//失能自动重发
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(注:以下贴出的寄存器描述由于中文资料上有一个错误,故贴出原版英文资料)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>有了以上这三个配置,发送方的流程就变成了发送-触发中断。这样就抛开了接收方,可以专心去调试发送,可是怎么样才知道发送是否成功呢,要用到另外两个寄存器,STATUS和FIFO_STATUS。
<br>&nbsp;&nbsp;&nbsp;&nbsp;这样就很清晰了,我们可以通过读取STATUS的值来判断是哪个事件触发了中断,寄存器4、5、6位分别对应自动重发完成中断,数据发送完成中断,数据接收完成中断。也就是说,在之前的配置下,如果数据成功发送,那么STATUS的值应该为0x2e。这样就可以作为一个检测标准,另外一个标准可以看FIFO_STATUS寄存器,第5位的描述:发送缓冲器满标志,1为满,0为有可用空间;第4位的描述:发送缓冲器空标志,1为空,0为有数据;同样可以看到接收缓冲器的对应标志。这样在数据发送成功后,发送寄存器当然应该是空的,接收缓冲因为在之前已经失能,所以也应该是空,也就是说成功发送之后的FIFO_STATUS寄存器值应该是0x11。
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有了这两个检测标准,我们即使不用接收方也可以确定发送方是否成功发送。当发送方调试成功之后,在程序里让它一直发送,然后我们就可以去调试接收方,思路是一样的,同样说下接收方工作流程先。
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·配置寄存器使芯片工作于接收模式后拉高CE端至少130us
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·读状态寄存器STATUS
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·判断是否是接收完成标志位置位
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·清标志
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·读取数据缓冲区的数据
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·清数据缓冲
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后在初始化配置寄存器的时候要和发送方保持一致,比较重要的是要失能自动应答,使能通道0接收:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_AA,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//失能通道0自动应答
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_RXADDR,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;//接收要使能接收通道0
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样就可以了,接收方就可以进入接收模式去接收数据了,这次的调试就会灵活一些,因为是接收数据,可以在接收方添加一个显示设备把数据直观的显示出来,去对照看是否正确,当然还可以使用和发送方一样的方法:观察STATUS和FIFO_STATUS的值,对照寄存器描述,接收正确时STATUS的值应该是0x40,对于FIFO_STATUS的情况就多了些,因为数据宽度的不同也会造成寄存器的值不一样,24L01最大支持32字节宽度,就是说一次通讯最多可以传输32个字节的数据,在这种情况下,接收成功读数据之前寄存器值应该为0x12,读数据之后就会变成0x11;如果数据宽度定义的小于32字节,那么接收成功读数据之前寄存器值应该为0x10,读数据之后就会变成0x11。这个看起来挺复杂,其实很清晰,大家可以试着分析下,对照数据手册分析每个位的状态就可以得到结果。
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到这里对nRF24L01的调试基本上就算通了,但是要明白这些只是调试方法,最终的产品如果不加上应答和重发的话那么数据的稳定性是很难保证的,所以在基本的通讯建立之后就要把发送的配置改为:&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_AA,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能接收通道0自动应答
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_RXADDR,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能接收通道0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;SETUP_RETR,&nbsp;0x1a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//自动重发10次,间隔500us
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接收方的配置也要更改:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_AA,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//失能通道0自动应答
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_RXADDR,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;//接收要使能接收通道0
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-5
在线时间
1 小时
 楼主| 发表于 2015-8-6 13:19:24 | 显示全部楼层
回复【6楼】空空禅师:
<br>---------------------------------
<br>在while((NRF24l01_IRQ)!=0)&nbsp;&nbsp;之后,判断发送完成之后读取的状态寄存器的值,为0x1e,看网上说正常的话应该是0x2e,这样就可以再接下来的if(sta&TX_OK)判断为完成发送。
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2015-8-6 22:26:27 | 显示全部楼层
是Mni&nbsp;V3么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2015-6-4
在线时间
5 小时
发表于 2015-9-4 09:05:00 | 显示全部楼层
回复【7楼】空空禅师:
<br>---------------------------------
<br>您好,最近在调试NRF24L01,按您的方法调试发送方的时候,读取状态寄存器返回值是0x0e,NRF_Tx_Data(tmp_buf),返回值是0x20,这是怎么回事啊?求解答啊!
回复

使用道具 举报

23

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2015-2-19
在线时间
32 小时
发表于 2015-10-27 00:44:31 | 显示全部楼层
回复【11楼】路口农夫:
<br>---------------------------------
<br>如何调通的啊,能讲讲吗
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-1-11
在线时间
20 小时
发表于 2016-4-10 17:36:21 | 显示全部楼层

原子哥,我也遇到相同的问题,不过我在双mini板上无线通信没问题,但我想做51与32的无线通信时,一直卡在最大重发那循环,我用串口读回sta的值都是FD或FF,我该怎么改……
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-1-11
在线时间
20 小时
发表于 2016-4-10 20:00:41 | 显示全部楼层
打桩人—勋 发表于 2016-4-10 17:36
原子哥,我也遇到相同的问题,不过我在双mini板上无线通信没问题,但我想做51与32的无线通信时,一直卡在 ...

原子哥,不用了,我似乎找到问题,我修改了很多个寄存器,最终发现似乎是通道问题,通道0不行,一直处于最大重发次数状态,通道1可以TX_OK,虽然51还未能收到信息,或许51部分的代码有错。我想问下,TX_OK的状态下,发送方出错的概率大吗?能解释下通道问题那就更好了
回复

使用道具 举报

3

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-8-25
在线时间
53 小时
发表于 2016-9-3 12:20:42 | 显示全部楼层
这帖子都是没有结尾的帖子,
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2017-3-31
在线时间
117 小时
发表于 2017-3-31 19:15:44 | 显示全部楼层
NRF24L01_TXPACKET(tem_buf)==TX_ok这句代码改成NRF24L01_TXPACKET(tem_buf)&TX_OK就行了。NRF24L01_TXPACKET(tem_buf)的返回值是整个STATUS寄存器的值,除了标致数据发送完成的位之外,其他位也可能为1.
[img]C:\Users\CH-ZH\Pictures\status1.pngC:\Users\CH-ZH\Pictures\status2.png[/img]
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2017-3-31
在线时间
117 小时
发表于 2017-3-31 19:32:43 | 显示全部楼层
如果是用的数据通道0的话,发送地址和接收地址必须相同,不然发送端接不到应答信息,status寄存器的MAX_RT位会置1,STATUS寄存器的值不等于TX_OK的0x20
回复

使用道具 举报

163

主题

301

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
发表于 2017-3-31 19:51:25 | 显示全部楼层
Owen 发表于 2017-3-31 19:32
如果是用的数据通道0的话,发送地址和接收地址必须相同,不然发送端接不到应答信息,status寄存器的MAX_RT ...

http://www.openedv.com/forum.php ... &extra=page%3D1
能帮我看下这个问题吗,谢谢.
向你请教了.
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-5-11 14:44:06 | 显示全部楼层
路口农夫 发表于 2015-8-5 16:34
在NRF24L01_TXPACKET中读取到的sta为0x1e,正常为0x2e;求解。

我也是这个情况,这是什么原因呀?
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-5-11 14:50:49 | 显示全部楼层
路口农夫 发表于 2015-8-6 13:19
回复【6楼】空空禅师:
---------------------------------
在while((NRF24l01_IRQ)!=0)&nbsp;&nbsp;之后 ...

我的也是0x1e,这是什么原因呀?
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2017-6-8
在线时间
1 小时
发表于 2017-6-18 16:29:34 | 显示全部楼层
打桩人—勋 发表于 2016-4-10 20:00
原子哥,不用了,我似乎找到问题,我修改了很多个寄存器,最终发现似乎是通道问题,通道0不行,一直处于 ...

弱弱的问一下,通道在哪里设置的?
回复

使用道具 举报

9

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-3-7
在线时间
25 小时
发表于 2017-11-2 18:04:38 | 显示全部楼层
同样的问题,TX可以发送,RX也可以接收,但是就是在最大重发那里一直成立导致显示错误
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-12-18
在线时间
3 小时
发表于 2018-1-15 10:54:41 | 显示全部楼层
空空禅师 发表于 2015-8-5 18:21
24L01是收发双方都需要编程的器件,这就对调试方法产生了一定的要求,如果两块一起调,那么通讯不成功,根 ...

大佬,能不能留个QQ
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2017-9-26
在线时间
0 小时
发表于 2018-2-24 16:34:16 | 显示全部楼层
空空禅师 发表于 2015-8-5 18:21
24L01是收发双方都需要编程的器件,这就对调试方法产生了一定的要求,如果两块一起调,那么通讯不成功,根 ...

这么解答,就是给我这种 不看《数据手册》,不看例程详细说明的 人,哎!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 14:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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