微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > NRF24L01+设置为带数据的ACK功能

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

时间:10-02 整理:3721RD 点击:


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· 感觉16位CRC与8位CRC没有什么区别,同样都是将需要发送的所有东西一起运算,而且大了还浪费时间,但是如果要设置为带数据包的ACK又必须设置为有CRC校验的。

4· 设置好了之后,首先在发送端还没有发送之前,接收端需要将数据放在W_ACK_PAYLOAD中,这是一个有范围的地址从0xA8到0xAD,通常用0xA8。

5· 发送端发送过来之后,接收端将放好了的数据发送出去,但是注意一定要读取发送过来的数据或者清空接收FIFO,不然发送端无法接收到带有数据的ACK包,不读取或者清空将数据放入W_ACK_PAYLOAD也是白放,不但浪费时间,也会流失放入的数据,可以发送中断中放入新的数据,这样既能够节约时间,又不浪费数据,但要注意一定要在初始化的时候先将数据放入W_ACK_PAYLOAD中,不然无法发送。同样在接收端中可以设置IRQ引脚中断,当引脚变低了之后才经行接收与发送,可以免去不断用SPI查询时间浪费。这样设置了之后接收端发送数据的时间间隔掌握在发送端的手中。由发送方确定心跳频率。

6· 可以通过设置将发送端的发送速度最大化,可以利用REUSE_TX_PL操作指令,不断的发送,当然也可以放到接收中断中,但是要注意在使用这个操作指令前需要发送数据一次。

7· 可以通过查看RPD(Received PowerDetector)接收功率检测器查看现在信号是否强,只有两个值0和1,当射频信号高于 -64 dBm时为1,低于时为0,其实在这个主要是用来设置射频信号功率的,用于节能。

8·这些功能只有在挪威的NRF24L01+上才能使用,不带+的不行,有一种芯片采用黑胶封住的也不太好用。

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


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


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

楼主现在研究的怎么样了,能否交流一下啊!

敢问如果使用ACk功能,通讯距离大概多远?

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

嗯嗯,谢谢你的评论,不过NRF24L01的数据手册中没看到相关带数据的ACK的介绍

楼主你好。接收的时候先检测,是指在判断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 关于寄存器FEATURE的设置你设置为Enables Dynamic Payload Length不够的,Enables Payload with ACK也需要同时设置,所以这个寄存器要设置为0x06。

lz写的不错 这个功能确实可以用起来 FIFO还没用过

楼主的程序方便分享一下嘛?

http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=474622&page=1#pid1931147这个里面有程序,分别在STM32f411和上位机接收端中,你可以从中提取出想要的代码。

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

QQ中问题解决,原因:接收中断未开

楼主,请问2.4G连续通信

通道地址不一样传输的成功率也不一样,像全5和全A的传输数据老是失败

, 谢谢, 真相认识你一下

非常棒,正好需要

谢谢楼主分享,下来学习一下nrf24L01带数据的ACK

谢谢楼主,调了好久还是不成功

如果不成功,欢迎加我QQ,我的QQ就是我的签名

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top