注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

NRF24L01+设置为带数据的ACK功能  

2016-04-08 10:59:07|  分类: STM32 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://bbs.eeworld.com.cn/thread-443708-1-1.html

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 发送与接收存储,感觉这个东西应该是可以加快数据的接收与发送,我一直没有使用出来,使用了的分享一下呗
  评论这张
 
阅读(7)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017