OpenEdv-开源电子网

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

NRF24L01发送失败

[复制链接]

77

主题

198

帖子

0

精华

高级会员

Rank: 4

积分
526
金钱
526
注册时间
2013-11-25
在线时间
0 小时
发表于 2014-8-22 14:54:00 | 显示全部楼层 |阅读模式
5金钱
根据网上给出的调试NRF24L01的方法,首先调试发送程序,<br />
进行如下处理:<br />
<div   style="background-color:#E8E8E8;">
<pre class="brush:c# ;"> SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);          // 关闭通道0自动应答
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);     // 关闭接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   // 关闭自动重发[/mw_shl_code]
</div>
<br />
并写函数获得STATUS和FIFO_STATUS的值<br />
<div   style="background-color:#E8E8E8;">
<pre class="brush:c# ;">u8 NRF_Get_State(void)
{
u8 status;
status=NRF24L01_Read_Reg(READ_REG_NRF+STATUS);
return status;
}
u8 NRF_Get_FIFOState(void)
{
u8 FIFO_status;
FIFO_status=NRF24L01_Read_Reg(READ_REG_NRF+NRF_FIFO_STATUS);
return FIFO_status;
}[/mw_shl_code]
</div>
<br />
<br />
在主函数中进行验证:<br />
<div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]         if(sta==0x2e)
         {
         LED1=0;
}
if(FIFO_sta==0x11)
{
LED2=0;
}[/mw_shl_code]
</div>
<br />
<br />
实验发现两盏灯都没有亮,说明发送失败了。<br />
其余部分的NRF程序都是直接从原子的例程拷贝的,<span>在线调试时全速运行发现程序的确卡死在这里了,</span><br />
while(NRF24L01_IRQ!=0);//等待发送完成<br />
但是当我单步运行的时候发现程序正常运行过这里,且在单步调试过程中,两盏灯都是能亮起来的。<br />
为什么单步运行和全速运行结果不同呢?<br />
<br />
注:NRF24L01_Check检测到连接已经成功了<br />
<br />
下面附上我的main函数<br />
<div   style="background-color:#E8E8E8;">
<pre class="brush:c# ;">int main(void)
{
        u8 temp_buf[33]={0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,                         0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x07};
        u8 sta;
        u8 FIFO_sta;
        LED_Init();
        NRF24L01_Init();       
        while(NRF24L01_Check())
        {
                LED3=0;  
                Delay_1us(5000);
                LED3=1;
                Delay_1us(5000);
        }
        TX_Mode();
        while(1)
        {
                NRF24L01_TxPacket(temp_buf);
                sta=NRF_Get_State();
                FIFO_sta=NRF_Get_FIFOState();
                if(sta==0x2e)
                {
                        LED1=0;
                }
                if(FIFO_sta==0x11)
                {
                        LED2=0;
                }
                NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,0XFF);
                Delay_10us(10);
        }
}
[/mw_shl_code]
</div>
不知道到底怎么解决这个问题,大家有遇到这种情况么?应该怎么解决呢?求指教!谢谢!

最佳答案

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

找到原因了,是STATUS的值弄错了,应该是0x0e灯就可以亮了~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

77

主题

198

帖子

0

精华

高级会员

Rank: 4

积分
526
金钱
526
注册时间
2013-11-25
在线时间
0 小时
 楼主| 发表于 2014-8-22 14:54:01 | 显示全部楼层
找到原因了,是STATUS的值弄错了,应该是0x0e灯就可以亮了~
回复

使用道具 举报

77

主题

198

帖子

0

精华

高级会员

Rank: 4

积分
526
金钱
526
注册时间
2013-11-25
在线时间
0 小时
 楼主| 发表于 2014-8-22 15:32:15 | 显示全部楼层
刚刚重新研究下调试教程,感觉自己理解错误了,教程里面说的是<br />
<br />
<span>我们可以通过读取STATUS的值来判断是哪个事件触发了中断,寄存器4、5、6位分别对应自动重发完成中断,数据发送完成中断,数据接收完成中断。也就是说,<span style="color:#E53333;">在之前的配置下</span>,如果数据成功发送,那么STATUS的值应该为0x2e。这样就可以作为一个检测标准,另外一个标准可以看FIFO_STATUS寄存器,第5位的描述:发送缓冲器满标志,1为满,0为有可用空间;第4位的描述:发送缓冲器空标志,1为空,0为有数据;同样可以看到接收缓冲器的对应标志。这样在数据发送成功后,发送寄存器当然应该是空的,接收缓冲因为在之前已经失能,所以也应该是空,也就是说成功发送之后的FIFO_STATUS寄存器值应该是0x11。&nbsp;</span><br />
<br />
也就是说,应该是使能重发等参数的时候,有STATUS=0x2e,
所以就将以下配置改回来了<br />
<div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);&nbsp;[/mw_shl_code]
[mw_shl_code=c,true]NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);&nbsp;[/mw_shl_code]
[mw_shl_code=c,true]NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);[/mw_shl_code]
</div>
<br />
发现LED2是亮了,证明FIFOSTATUS的值的确是0x11 <br />
但是LED1还是不亮的,即无论上述三个参数是否使能,STATUS都不能得到0x2e的值 <br />
请问是不是我对上面教程中的话理解错误了呢? <br />
到底什么时候才有STATUS=0X2E FIFOSTATUS=0X11? <br />
是不自动重发失能应答和接收地址的时候?还是自动重发且使能自动应答和接收地址的时候??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-22 23:11:08 | 显示全部楼层
帮顶....
回复

使用道具 举报

5

主题

110

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2013-9-16
在线时间
0 小时
发表于 2014-12-25 12:56:54 | 显示全部楼层
主机可以通过切换频率参数来分别和B&nbsp;C节点通讯,方法如下
<br>&nbsp;
<br>第一步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第二步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x9F&nbsp;0x00&nbsp;0x03&nbsp;0x07&nbsp;0x2f&nbsp;0xD8
<br>第三步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;0x07&nbsp;0x2f&nbsp;0xD8&nbsp;后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第四步-&gt;&nbsp;输入要传的数据即可将数据传输给B节点
<br>&nbsp;
<br>&nbsp;
<br>第五步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第六步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x9F&nbsp;0x00&nbsp;0x03&nbsp;0x07&nbsp;0x33&nbsp;0xC0
<br>第七步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;0x07&nbsp;0x33&nbsp;0xC0后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第八步-&gt;&nbsp;输入要传的数据即可将数据传输给C节点
<br>&nbsp;
<br>更多节点以此类推即可
<br>&nbsp;
<br>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<br>例如变址多点通讯,
<br>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<br>&nbsp;
<br>例如
<br>当主机为WLK01L39模块,
<br>主机A本机地址1:0x01,本机地址2:0x01,
<br>从机B本机地址1:0x02&nbsp;,本机地址2:0x01&nbsp;,
<br>从机C本机地址1:0x03,本机地址2:0x01&nbsp;,&nbsp;&nbsp;
<br>主机可以通过切换目标地址参数来分别和B&nbsp;C节点通讯,因为在频率一样的前提下
<br>只有主机的目标地址和从机的本机地址一致时,对应从机才能与其建立通讯,并接收数据方法如下
<br>&nbsp;
<br>第一步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第二步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x8E&nbsp;0x00&nbsp;0x01&nbsp;0x02&nbsp;
<br>第三步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;&nbsp;0x02&nbsp;后再&nbsp;设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第四步-&gt;&nbsp;输入要传的数据即可将数据传输给B节点
<br>&nbsp;
<br>&nbsp;
<br>第五步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第六步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x8E&nbsp;0x00&nbsp;0x01&nbsp;0x03
<br>第七步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;&nbsp;0x03&nbsp;后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第八步-&gt;&nbsp;输入要传的数据即可将数据传输给C节点
<br>&nbsp;
<br>更多节点以此类推即可
<br>&nbsp;
<br>###################################################################
<br>多点通讯还有一种最简单的方式,就是点名通讯
<br>###################################################################
<br>1.主机和从机的参数都完全一样
<br>2.都处于正常收发模式
<br>3.当主机A发0x01(该指令可自定义),
<br>&nbsp;&nbsp;当从机B和从机C都收到0x01,
<br>&nbsp;&nbsp;从机B视0x01为上传数据命令,立刻发射要上传数据,然后主机A会收到B上传数据,而从机C视0x01为无效指令,不发送数据
<br>&nbsp;&nbsp;当主机A发0x02(该指令可自定义),
<br>&nbsp;&nbsp;当从机B和从机C都收到0x01,
<br>&nbsp;&nbsp;从机C视0x02为上传数据指令,立刻发射要上传数据,然后主机A会收到C上传数据,而从机B视0x02为无效指令,不发送数据
<br>更多节点以此类推即可
<br>------------------
<br>NRF905&nbsp;RF903&nbsp;CC1100&nbsp;CC2500&nbsp;CC1020&nbsp;NRF2401&nbsp;NRF24L01&nbsp;无线数传芯片/模块性能汇总及应用指南
<br>你好,我们是无线制造供应商,欢迎交流
<br>QQ:35625400&nbsp;&nbsp;&nbsp;&nbsp;MSN:ll88mm88@hotmail.com&nbsp;
<br>HONE:13704018223&nbsp;&nbsp;&nbsp;陈工
RFinchina 团队欢迎无线方面的技术交流 QQ 474882985
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-8-30
在线时间
0 小时
发表于 2015-4-12 16:24:51 | 显示全部楼层
回复【3楼】正点原子:
<br>---------------------------------
<br>原子哥,我nRF24L01开启自动应答,但是TX_DS一直不置位,这有没有什么原因?基本的读写函数是没问题的,写进去读出来没问题,使用的模拟SPI
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-4-12 22:48:47 | 显示全部楼层
回复【6楼】hzw:
<br>---------------------------------
<br>不知道哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-7-22
在线时间
11 小时
发表于 2015-11-9 11:16:14 | 显示全部楼层
回复【3楼】正点原子: <br />
--------------------------------- <br />
原子哥,我想向你请教两个问题。 <br />
一、我用战舰开发板做发送端时,程序老是卡在&nbsp;while(NRF24L01_IRQ!=0)上,老是出不去,如若选为接收端,还可以接收到数据 <br />
二、我用自己做的一块板子做实验,也都能进去,开始还能发送数据,可是后来也卡在一个地方,就是在&nbsp;u8&nbsp;NRF24L01_TxPacket(u8&nbsp;*txbuf)&nbsp;这个函数里, <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state=NRF24L01_Read_Reg(STATUS&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取状态寄存器的值 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,state);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清除TX_DS或MAX_RT中断标志 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (state&amp;MAX_TX&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NRF24L01_Write_Reg(FLUSH_TX,0XFF);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp;MAX_TX; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state的值老是0x1E,之前发送成功的时候是0x2E,不知道为什么,就变成0x1E了。还希望原子哥能帮忙答疑解惑啊
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2015-12-30
在线时间
0 小时
发表于 2015-12-30 15:08:37 | 显示全部楼层
状态位一直都是0x01,到达最大重发次数,什么情况啊,跟楼上问题一样,原子哥求助!
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2015-12-17
在线时间
9 小时
发表于 2015-12-30 20:39:33 | 显示全部楼层
看看。。菜鸟飘飘。正在学习
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-6-17
在线时间
3 小时
发表于 2016-7-13 21:31:59 | 显示全部楼层
你好,我也遇到了类似问题,通过了Check,但是一直发送失败,返回值是MAX_TX,说明发送到最大次数也没有发送成功,请赐教
回复

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2014-2-18
在线时间
12 小时
发表于 2016-7-21 18:25:58 | 显示全部楼层
飞牛 发表于 2016-7-13 21:31
你好,我也遇到了类似问题,通过了Check,但是一直发送失败,返回值是MAX_TX,说明发送到最大次数也没有发送 ...

我也遇到这样的问题了
怎么回事呢.
你解决了吗
回复

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2014-2-18
在线时间
12 小时
发表于 2016-7-21 20:27:42 | 显示全部楼层
hugo01chen 发表于 2016-7-21 18:25
我也遇到这样的问题了
怎么回事呢.
你解决了吗

因为使能了ACK功能,所以需要一个发送节点,还有一个接收节点。增加了一个接收节点后,成收发。
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-5-11 15:12:50 | 显示全部楼层
西江月拂晓 发表于 2015-11-9 11:16
回复【3楼】正点原子:
---------------------------------
原子哥,我想向你请教两个问题。

我也是这个问题,这是什么原因呀?
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-5-11 15:14:46 | 显示全部楼层
飞牛 发表于 2016-7-13 21:31
你好,我也遇到了类似问题,通过了Check,但是一直发送失败,返回值是MAX_TX,说明发送到最大次数也没有发送 ...

有没有解决呀,我也是这个问题,一直是0x1e
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-1-19
在线时间
20 小时
发表于 2017-5-25 19:09:32 | 显示全部楼层
我也是  换到c8t6 后就这样了 一直返回MAX_TX
回复

使用道具 举报

22

主题

48

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-2-26
在线时间
32 小时
发表于 2017-8-23 14:39:27 | 显示全部楼层
同求啊,一直返回max
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-3-4
在线时间
9 小时
发表于 2017-9-29 10:41:50 | 显示全部楼层
我想说我也是这个问题。。用的c8t6
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 03:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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