OpenEdv-开源电子网

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

(小白求助)NRF24L01接收端status寄存器值是0x0e

[复制链接]

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
发表于 2016-11-9 17:52:21 | 显示全部楼层 |阅读模式
10金钱
我在调试NRF04L01的时候,调试发送端时候配置改为             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);      //失能自动重发
STATUS是0x2e fifo_status值是0x11  说明发送端配置正常;
                 在将发送端程序改回来成下面样子并运行:
            SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);             //使能接收通道0自动应答
             SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);      //使能接收通道0         
             SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);      //自动重发10次,间隔500us

再调试接收端,接收端STATUS值是0x0e,fifo_STATUS是0x11,这里出问题了,STATUS应该是0x40但我却是0x0e,想问一下大神们这个怎么回事??????




@正点原子 原子哥   帮忙看看




最佳答案

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

原子哥 我应该是搞定了 因为我都是用焊锡含在上面的 可能有电磁干扰什么的,具体也说不上来 我把他都焊接成线效果好了很多 0-0
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2016-11-9 17:52:22 | 显示全部楼层

原子哥   我应该是搞定了   因为我都是用焊锡含在上面的  可能有电磁干扰什么的,具体也说不上来   我把他都焊接成线效果好了很多    0-0
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2016-11-9 17:54:24 | 显示全部楼层
我是按照这个调试的一步步:






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

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2016-11-9 17:59:43 | 显示全部楼层
补充一下    有时候接收发送通   有时候就不通了(有时候在接收端重新上电后接收发送会通@正点原子 )    求解啊    硬件什么问题吗????????
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
 楼主| 发表于 2016-11-9 18:07:06 | 显示全部楼层
现在接收端收不到数据   STATUS状态是0x00    是什么原因??求助大神@正点原子
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2016-11-9 22:14:48 | 显示全部楼层
这个我也不太清楚
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-1-5
在线时间
6 小时
发表于 2020-3-12 17:03:16 | 显示全部楼层
楼主这个问题怎么解决的,我遇到了和你一样的问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-9 17:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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