您的位置:首页 > 其它

NRF24L01 使用小结—1

2016-06-27 15:50 176 查看
nrf24L01被设置为接收模式后,可通过6个不同的数据通道(data pipe)接收数据。

每个数据通道都有一个唯一的地址但是各数据通道的频率是相同的。这意味着可以有6个被配置成发送状态的nRF24L01可以和一个配置成接收状态的nRF24L01通信,并且接收方可以区分(通过判断状态寄存器的1-3位即可达到区分的目的)。

数据通道0有一个唯一的40bit的可设置的地址。其余的通道1到通道5则地址前32位相同,而后8位不同。所有的数据通道都可以实现Enhanced ShockBurst模式。

在发送端,数据通道0被用来接收确认信息,因此发送端的数据通道0的地址必须等于发送地址,这样才能收到应答信息。

当一个24L01发送结束后,它会打开接收器并等待确认。如果没有收到确认,则重发,直到收到确认。当重发超过一定次数则发出中断并改变状态寄存器。重发次数的限制在SETUP_RETR_ARC寄存器中设置。

无论何时收到确认,都会认为上一个数据包发送成功,这个数据包将被从发送缓冲区清除,并且把TX_DS IRQ置为高。

每次开始spi写,读回来的都是状态字。

 

增强型ShockBurst包格式

前置域1byte

地址域3-5byte

包控制域9bit

载荷0-32字节

CRC1-2字节

地址域是接收机地址

包控制域

载荷长度6bit

Pid2bit

NO_ACK1bit

载荷长度:6bit说明最多32字节

Pid:用于包编号,用于确定是重发包还是新包

NO_ACK:用于表示是否自动应答,如为1则表示无需自动应答

自动应答的延时和重发次数是可编程的。

 

24L01的工作模式和寄存器及IO口的关系如下

CE引脚的作用

一个ESB(Enhanced ShockBurst)周期,发送一个字节连带收到ACK大约339us

从powerdown状态需要先进入standyby状态,该状态转换需要1.5ms延迟,从standyby状态进入rx/tx状态,需要130us

置高CE维持最少10us,启动Enhanced ShockBurst发送。

 

Enhanced ShockBurst™模式下发送数据流程

1.配置config寄存器,将PRIM_RX置为0,表示发送模式

2. 当需要发送数据时,首先需要配置地址TX_ADDR,这个地址应该是接收端地址(即应该是接收端6个data pipe地址中的一个即可保证对方收到)。如果要使用自动应答,因为应答消息由发送端的datapipe0接收,所以发送的datapipe0的地址应等于TX_ADDR(若是和上一次发送是相同地址,则可不用重写地址)。

3.配置数据负载长度TX_PLD,将需要发送的数据送入nrf24L01,通过SPI连续写入数据载荷时,nrf24L01将自动对字节数计数。(数据载荷必须在cs为低的时候连续写入)

4.将CE置高并维持最少10us,这个脉冲将启动ShockBurst发送

5.NRF24L01:

    a)打开射频

    b)启动晶振

    c)数据打包

    d)发送数据

6.如果启动了自动应答(且重传次数未达到最大值),NRF24L01将自动转入接收状态。

  1:若在规定时间内收到了应答包,则这是一次成功的发送,TX FIFO中的数据被清除,同时置高status寄存器中的TX_DS位。

  2:如果在规定时间内未收到应答包则自动重传(当启用自动重传时,由SETUP_RETR寄存器中的ARC位指定重传次数)。

  3:当重传次数到达最大值依然没有收到应答,则status寄存器中的MAX_RT被置高,TX FIFO缓冲区中的数据并不被移除。

MAX_RT或TX_DS被置高都会在IRQ引脚上引起中断(低电平有效,重写status寄存器中的对应位可清除)。在到达最大重传次数并引发中断后,在没有清除MAX_RT之前,任何数据都不能发送。每次发生MAX_RT中断,PLOS_CNT计数器都会加1,用于统计丢包数。

7.CE置低以后,设备进入STANDBY_I状态。否则TX FIFO缓冲区中的下一个数据载荷将被发送。如果数据缓冲区空,而CE仍然为高,设备将进入STANDBY-II模式。

8.如果设备处于STANDBY-II模式,当CE置低后,设备将进入STANDBY-I模式。

(STANDBY模式可减少电流的消耗,在该模式下,SPI通信仍然可以完成)

 

Enhanced ShockBurst™模式下接收数据流程

1.设置config寄存器中的PRIM_RX为1,且置CE为高

2.130us之后,NRF24L01开始监视射频信号

3. 当合法的包被接收到(地址匹配),数据被存储到RX-FIFO缓冲区中,status寄存器中的RX_DR被置高,IRQ引脚同时发出中断信号(如果未屏蔽该信号)。Status寄存器中的RX_P_NO指示这个应该接收该数据的DATA PIPE号。

4.如果自动应答启用的话,一个应答信号将被发出

5.MCU将CE置为低将进入STANDBY-I模式

6.MCU可通过SPI读出接收到的数据

 

另外:关于24L01组网想说明几点应注意的地方:

(1)注意地址的分配

文档中明确说明只有通道0具有5个字节的可配置地址,其他的5个节点都只有1字节可自由配置地址,

比如可以在接收节点这样配置:uint const RXADR0[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};   //接收地址

uint const RXADR1[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc1};     //通道1地址

uint const RXADR2[1]= {0xc2};         //通道2地址

uint const RXADR3[1]= {0xc3};         //通道3地址

uint const RXADR4[1]= {0xc4};         //通道4地址

uint const RXADR5[1]= {0xc5};         //通道5地址

然后将各发送节点地址与接收端相应通道地址设置相同即可

(2)接收节点对各发送节点进行区分

这个就是判断状态寄存器的1-3位即可达到区分的目的

//--------------------------------------------------------------------------------------------------------------------------------------------------------

1、一个发送通道,6个接收通道。发送端发送通道地址寄存器中的地址指向的就是接收端哪个接收通道接收发送端的数据,所以发送端地址寄存器的值要与接收端需要接受数据的通道地址相同。

看一下无线数据传输的数据帧格式



第二部分的地址,就是接收端接收数据的通道地址,这个地址由发送端TX_ADDR寄存器搞定。

2、必须要搞清楚发送地址和接收地址的意义。下面两端描述的是一个意思。我的两次理解。

要先搞清楚TX_ADD和RRX_ADDR_PX。TX_ADD就一个,是发送数据帧格式中发送的地址信息,如上1所示,这个地址指定了向接收端接收数据通道的地址。

发送端的职责:1、发送:发送数据给接收端。2接收:接收某接收端的应答信号。

接收端的职责:1、接收:接收发送端发送的数据。2发送:发送应答信号给发送端。

所以整个过程发送端接收端都有发送和接收的功能。只是发送和接收的东西不一样。

NRF24L01发送端把数据发送给接收端,接收端在确认收到数据后记录发送端的地址,并以此地址为目标地址发送应答信号(这个是自动的,不是程序设置的,应属于硬件实现),(就是说接收端的发送地址寄存器TX_ADDR中存的地址就是发送端TX_ADDR中的地址,而发送端要以又要用通道0来接收应答,所以需要将通道0的地址设置为该地址,即发送端TX_ADDR中的值)。在发送端,数据通道0被用作接收应答信号因此发送端通道0的接收地址要与发送地址端地址相等,以确保接收到正确的应答信号。

注意每个NRF24L01只有一个发送通道,用来指示向接收端NRF24l01的哪个接收通道发送数据,即TX_ADDR(即只有一个发送目标地址寄存器)不要被TX5迷惑,这里5是指第五个NRF24l01.但一个NRF24L01是有6个接收通道的,每个通道有自己的地址。所以一个2401可以接收6个2401发送来的数据。在发送模式下,发送端的2401会用自己接收通道0来接受 接收端的2401发送来的相应信号。但是接收端的2401发送应答信号的时候,也发送的地址就是接收端的某个接受通道的地址。所以发送端的接收通道0的地址要设置成这个地址。

例子:

TX5:TX_ADDR=0xB3B4B5B605

TX5:RX_ADDR_P0=0xB3B4B5B605

RX:RX_ADDR_P5=0xB3B4B5B605

3、

两种数据双方向的通讯方式:

如果想要数据在双方向上通讯,PRIM_RX 寄存器必须紧随芯片工作模式的变化而变化。处理器必须保证PTX和PRX端的同步性。在RX_FIFO和TX_FIFO寄存器中可能同时存有数据。

另外还有自己的查阅的一些资料:



这是使用手册上的关于地址的图。

对于发送方他的Rx通道0要和他的发送地址配成一样的。对于接收方0~6必有的哥通道的地址配置为发送发的地址。就是其实所有的地址都是自己设置的,但是要配对的进行设置。

也有人这样理解:

发送方发送了一段代码,代码中携带地址(看做代码的身份证),

接收方接收代码,但接受方设置成了只接收特定身份代码的数据,也就是主机TX_ADDR和从机RX_ADDR要求设置成相同的原因吧。

从机接受完数据之后,将应答信号还发送给刚才设置的那个地址,

主机还是只识别与发送数据时携带的地址相同的数据。

其实,这么理解之后,发现主机和从机根本就没有地址,只是数据携带的地址(数据的身份证)将主机和从机联系起来的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: