23787|30

655

帖子

29

TA的资源

版主

楼主
 

NRF24L01+设置为带数据的ACK功能 [复制链接]

 
本帖最后由 lb8820265 于 2017-4-17 22:42 编辑

       NRF24L01+拥有一个带数据的ACK功能,发现很少有介绍,这个功能使用起来很厉害,相当于双向传输了,比起原来不断切换接收发送模式来实现双向传输方便了很多。这个可用于无线调试,一方面可以将芯片上面的数据传到上位机上查看,同时也可以在线调试参数。
来看看24L01+相比于24L01的不同点:
1·可设置为250K传输速度
2·有连续载波传输功能
3·能设置为带数据的ACK功能
4·增加了RPD(传输功率检测功能)
5·然后一些功率,电流等有极小的变化
设置成ACK带数据需要设置的东西:
An ACK packet can contain an optional payload from PRXto PTX. In order to use this feature, the Dynamic Payload Length (DPL) feature must be enabled. The MCU on the PRX sidehas to upload the payload by clocking it into the TX FIFO by using the W_ACK_PAYLOAD command.
In order to enable Auto Acknowledgement with payload the EN_ACK_PAY bit in the FEATURE register must be set.
you can set the number of times it is allowed to retransmit by settingthe ARC bits in the SETUP_RETRregister.
Please take care when setting this parameter. If the ACK payload ismore than 15 byte in 2Mbps mode the ARD must be 500μS or more, if the ACKpayload is more than 5byte in 1Mbps mode the ARDmust be 500μS or more.
上面是从数据手册中摘下来的原文,没办法没有中文的24L01+数据手册,关于设置成为带数据的ACK上面主要说了几个要求:
1,需要设置成为可变长度的接收与发送
2,需要将接收数据的ACK使能
3,由于ACK带有数据因此自动重发的时间要改成500μS
4,将数据写入等待发送使用的是W_ACK_PAYLOAD命令
工作原理:
Activate PTX mode by setting the CE pin high. If there is a packetpresent in the TX FIFO the nRF24L01+ enters TX mode and transmits the packet.If Auto Retransmit is enabled, the state machine checks if the NO_ACK flag isset. If it is not set, the nRF24L01+ enters RX mode to receive an ACK packet.If the received ACK packet is empty, only the TX_DS IRQ is asserted. If the ACKpacket contains a payload, both TX_DS IRQ and RX_DR IRQ are assertedsimultaneously before nRF24L01+ returns to standby-I mode.

Activate PRX mode by setting the CE pin high. The nRF24L01+ enters RXmode and starts searching for packets. If a packet is received and AutoAcknowledgement is enabled, nRF24L01+ decides if the packet is new or a copy ofa previously received packet. If the packet is new the payload is madeavailable in the RX FIFO and the RX_DR IRQ is asserted. If the last receivedpacket from the transmitter is acknowledged with an ACK packet with payload,the TX_DS IRQ indicates that the PTX received the ACK packet with payload. Ifthe No_ACK flag is not set in the received packet, the PRX enters TX mode. Ifthere is a pending payload in the TX FIFO it is attached to the ACK packet.After the ACK packet is transmitted, the nRF24L01+ returns to RX mode.
呃,英文不好就不翻译了。。。

开发中经验:
1.       寄存器设置有几个需要注意,一个是ACK接收最大允许的时间要大于500us。
2.       然后是1C 与1D寄存器需要给相关的操作,需要设置为不定长度的发送与接收。接收的时候需要先检测R_RX_PL_WID(0x60),可以得出收到的数据长度,然后再接收。
3· 感觉16CRC8CRC没有什么区别,同样都是将需要发送的所有东西一起运算,而且大了还浪费时间,但是如果要设置为带数据包的ACK又必须设置为有CRC校验的。
4· 设置好了之后,首先在发送端还没有发送之前,接收端需要将数据放在W_ACK_PAYLOAD中,这是一个有范围的地址从0xA80xAD,通常用0xA8
5· 发送端发送过来之后,接收端将放好了的数据发送出去,但是注意一定要读取发送过来的数据或者清空接收FIFO,不然发送端无法接收到带有数据的ACK包,不读取或者清空将数据放入W_ACK_PAYLOAD也是白放,不但浪费时间,也会流失放入的数据,可以发送中断中放入新的数据,这样既能够节约时间,又不浪费数据,但要注意一定要在初始化的时候先将数据放入W_ACK_PAYLOAD中,不然无法发送。同样在接收端中可以设置IRQ引脚中断,当引脚变低了之后才经行接收与发送,可以免去不断用SPI查询时间浪费。这样设置了之后接收端发送数据的时间间隔掌握在发送端的手中。由发送方确定心跳频率。
6· 可以通过设置将发送端的发送速度最大化,可以利用REUSE_TX_PL操作指令,不断的发送,当然也可以放到接收中断中,但是要注意在使用这个操作指令前需要发送数据一次。
7· 可以通过查看RPDReceived PowerDetector)接收功率检测器查看现在信号是否强,只有两个值01,当射频信号高于 -64 dBm时为1,低于时为0,其实在这个主要是用来设置射频信号功率的,用于节能。
8·这些功能只有在挪威的NRF24L01+上才能使用,不带+的不行,有一种芯片采用黑胶封住的也不太好用。

同时也有一个问题:NRF24L01中有三个FIFO 发送与接收存储,感觉这个东西应该是可以加快数据的接收与发送,我一直没有使用出来,使用了的分享一下呗

相关的代码可以参考帖子:https://bbs.eeworld.com.cn/thread-474622-1-1.html中的STM32F411程序.zip(接收端)和上位机接收端程序.zip(发送端)


此帖出自无线连接论坛

最新回复

请教个问题,我第一次发送时候,发送端接收到的ack中的数据,是我第一次接收时写入的数据,还是接收之前写入的数据呢?   详情 回复 发表于 2019-6-14 20:04
点赞(1) 关注(8)
个人签名QQ:252669569
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
楼主研究的比较透彻呀~
ACK功能的确不错,但是ACK功能会影响通讯距离的效果。

此帖出自无线连接论坛

点评

敢问如果使用ACk功能,通讯距离大概多远?  详情 回复 发表于 2014-9-16 20:20
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
楼主现在研究的怎么样了,能否交流一下啊!
此帖出自无线连接论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

4
 
radio_smart 发表于 2014-9-16 16:20
楼主研究的比较透彻呀~
ACK功能的确不错,但是ACK功能会影响通讯距离的效果。

敢问如果使用ACk功能,通讯距离大概多远?
此帖出自无线连接论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
指出两点错误,后人学习使用
1.REUSE_TX_PL只是可以手动重发最近后的一次数据,是说在TX FIFO没有新数据的情况下。
2.带数据的ACK,在NRF24l01就已经有了。
此帖出自无线连接论坛

点评

嗯嗯,谢谢你的评论,不过NRF24L01的数据手册中没看到相关带数据的ACK的介绍  详情 回复 发表于 2014-10-22 18:44
 
 
 

回复

655

帖子

29

TA的资源

版主

6
 
iloveufly 发表于 2014-10-18 00:54
指出两点错误,后人学习使用
1.REUSE_TX_PL只是可以手动重发最近后的一次数据,是说在TX FIFO没有新数据的 ...

嗯嗯,谢谢你的评论,不过NRF24L01的数据手册中没看到相关带数据的ACK的介绍
此帖出自无线连接论坛
个人签名QQ:252669569
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

7
 
楼主你好。接收的时候先检测,是指在判断RX_DR之前检测,还是在判断RX_RD之后检测。
我的接收函数如下:
       
        state=SPI_NRF_ReadReg(STATUS);

        SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);
       if(state&RX_DR)                                 
        {
          //first read received length from the R_RX_PAYLOAD
                receive_length=SPI_NRF_RW(R_RX_PL_WID);        //接收的时候需要先检测R_RX_PL_WID(0x60)
                printf("data_length = %d\r\n",receive_length);
                SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,receive_length);
          SPI_NRF_WriteReg(FLUSH_RX,NOP);        
          return RX_DR;
        }

但是此时receive_length=255.我发送端发送了6个数据,接收端能接收,但是receive_length是错误的。

   nRF24L01+RX模式如下:
   SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);   
   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);
   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);     
   //SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);     //static payload length setting
   SPI_NRF_WriteReg(NRF_WRITE_REG+FEATURE, 0x04);     // Enable Dynamic payload length
   SPI_NRF_WriteReg(NRF_WRITE_REG+DYNDP, 0x01);       //Enable dynamic payload lenght data pipe 0
   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);   
   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);  


  TX模式如下:
   SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    // Set PTX Address
   SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); // Set PRX Address for EN_Auto_ACK
   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);     //Enable Auto ack data pipe 0
   //SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //   Enable data pipe 0
   SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x2a);//   Setup of Automatic Retransmission   750uS,10 retranmsion
   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);       //Channel 40
   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);  // 2Mbps,0dB       
   SPI_NRF_WriteReg(NRF_WRITE_REG+FEATURE, 0x04);  //Enable Dynamic payload length
   SPI_NRF_WriteReg(NRF_WRITE_REG+DYNDP, 0x01);     //Enable dymamic payload length data pipe 0
   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);    //  PTX,Power UP,CRC 2Bytes,EN_CRC


请问楼主指教下在使用Dynamic Payload Length发送和接收数据时需要注意哪些问题啊?

此帖出自无线连接论坛

点评

你好,看了你的程序发现了一个问题:SPI_NRF_WriteReg(NRF_WRITE_REG+FEATURE, 0x04); // Enable Dynamic payload length [/backcolor]关于寄存器FEATURE的设置你设置为[/backcolor]Enables Dynamic Payload  详情 回复 发表于 2015-3-5 15:33
 
 
 

回复

655

帖子

29

TA的资源

版主

8
 

   你好,看了你的程序发现了一个问题:SPI_NRF_WriteReg(NRF_WRITE_REG+FEATURE, 0x04);     // Enable Dynamic payload length 关于寄存器FEATURE的设置你设置为Enables Dynamic Payload Length不够的,Enables Payload with ACK也需要同时设置,所以这个寄存器要设置为0x06。



此帖出自无线连接论坛
个人签名QQ:252669569
 
 
 

回复

168

帖子

0

TA的资源

一粒金砂(高级)

9
 
lz写的不错 这个功能确实可以用起来 FIFO还没用过
此帖出自无线连接论坛
个人签名逆水行舟,不进则退。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
楼主的程序方便分享一下嘛?
此帖出自无线连接论坛

点评

https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=474622&page=1#pid1931147这个里面有程序,分别在STM32f411和上位机接收端中,你可以从中提取出想要的代码。  详情 回复 发表于 2015-10-26 08:58
 
 
 

回复

655

帖子

29

TA的资源

版主

11
 
la9998372 发表于 2015-10-24 14:10
楼主的程序方便分享一下嘛?

https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=474622&page=1#pid1931147这个里面有程序,分别在STM32f411和上位机接收端中,你可以从中提取出想要的代码。
此帖出自无线连接论坛
个人签名QQ:252669569
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

12
 
想问下你,24L01+ 开启ACK功能,发送端怎么读取接收端回复的带数据信息的ACK包,我现在的状况是,接收端能接收到,但是我不知道接收端ACK了没,发送端没有接收到任何ACK数据
此帖出自无线连接论坛

点评

QQ中问题解决,原因:接收中断未开  详情 回复 发表于 2015-12-22 17:54
 
 
 

回复

655

帖子

29

TA的资源

版主

13
 
qjbyy 发表于 2015-12-22 16:48
想问下你,24L01+ 开启ACK功能,发送端怎么读取接收端回复的带数据信息的ACK包,我现在的状况是,接收端能 ...

QQ中问题解决,原因:接收中断未开
此帖出自无线连接论坛
个人签名QQ:252669569
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

14
 
楼主,请问2.4G连续通信
此帖出自无线连接论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

15
 
通道地址不一样传输的成功率也不一样,像全5和全A的传输数据老是失败
此帖出自无线连接论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

16
 
, 谢谢, 真相认识你一下
此帖出自无线连接论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

17
 
非常棒,正好需要
此帖出自无线连接论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

18
 
谢谢楼主分享,下来学习一下nrf24L01带数据的ACK
此帖出自无线连接论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

19
 
谢谢楼主,调了好久还是不成功
此帖出自无线连接论坛

点评

如果不成功,欢迎加我QQ,我的QQ就是我的签名  详情 回复 发表于 2016-5-11 10:14
 
 
 

回复

655

帖子

29

TA的资源

版主

20
 
xtayyu 发表于 2016-5-10 11:57
谢谢楼主,调了好久还是不成功

如果不成功,欢迎加我QQ,我的QQ就是我的签名
此帖出自无线连接论坛
个人签名QQ:252669569
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表