NRF24L01+中文翻译连载之二——增强ShockBurst™

3.2 增强ShockBurst™

强化的ShockBurst™是基于分组的数据链路层,其具有自动包组件和定时,自动确认和数据包的重传。 增强型ShockBurst™可实现与低成本主机微控制器的超低功耗和高性能通信。 增强型ShockBurst™功能可显着提高双向和单向系统的功率效率,而不会增加主机控制器端的复杂性。

3.2.1 特性

Enhanced ShockBurst™的主要特点是:

•1到32个字节的动态净荷长度
•自动数据包处理
•自动数据包事务处理
•带有有效负载的X自动确认
•自动转发
•6个数据管道MultiCeiver™,用于1:6星形网络

3.2.2 ShockBurst™综述

增强ShockBurst™使用ShockBurst™进行自动数据包处理和定时。在传输过程中,ShockBurst™组装数据包并对数据包中的位进行时钟传输。在接收期间,ShockBurst™不断在解调信号中搜索有效地址。当Shock Burst™发现有效地址时,它会处理数据包的其余部分并通过CRC对其进行验证。如果数据包有效,则将有效载荷移入RX FIFO中的空闲插槽。所有高速位处理和时序均由ShockBurst™控制。

增强型ShockBurst™具有自动数据包事务处理功能,可轻松实现可靠的双向数据链接。增强型ShockBurst™数据包事务是两个收发器之间的数据包交换,一个收发器充当主接收器(PRX),另一个收发器充当主发送器(PTX)。增强型ShockBurst™数据包事务始终由来自PTX的数据包传输启动,当PTX收到来自PRX的确认数据包(ACK数据包)时,交易完成。

PRX可以将用户数据附加到ACK数据包,从而启用双向数据链接。自动数据包事务处理的工作原理如下:

1.您通过从PTX传输数据包到PRX开始交易。 增强ShockBurst™自动将PTX设置为接收模式以等待ACK数据包。

2.如果PRX接收到数据包,Enhanced ShockBurst™会在返回到接收模式之前自动组合并向PTX发送确认数据包(ACK数据包)。

3.如果PTX没有立即收到ACK数据包,Enhanced ShockBurst™会在可编程延迟后自动重发原始数据包,并将PTX设置为接收模式以等待ACK数据包。

在Enhanced ShockBurst™中,可以配置参数,例如最大重传次数以及从一次传输到下一次重传的延迟时间。 所有自动处理都是在没有MCU参与的情况下完成的。

3.2.3 增强的Shockburst™数据包格式

本节介绍Enhanced ShockBurst™数据包的格式。 Enhanced ShockBurst™数据包包含前导码,地址,数据包控制,有效载荷和CRC字段。 图5.显示了左边MSB的数据包格式。
在这里插入图片描述

3.2.3.1 前导码

前导码是用于使接收器解调器与输入比特流同步的比特序列。前导码是一个字节长,并且是01010101或10101010.如果地址中的第一个比特是1,则前导码自动设置为10101010,并且如果第一位是0,前导码会自动设置为01010101.这样做是为了确保前导码中有足够的转换来稳定接收器。

3.2.3.2 地址

这是接收器的地址。 地址确保数据包被正确的接收器检测并接收,防止多个nRF24L01 +系统之间发生意外串扰。 您可以将AW寄存器中的地址字段宽度配置为3,4或5个字节,请参阅第63页上的表28。

注意:电平只移动一次(即000FFFFFFF)的地址通常可以在噪声中检测到,并且可能导致错误检测,这可能会导致错误率升高。 作为前导的延续(高低切换)的地址也提高了分组错误率。

3.2.3.3 数据包控制字段

图6显示了9位数据包控制字段的格式,MSB在左边。
在这里插入图片描述
分组控制字段包含6位有效负载长度字段,2位PID(分组标识)字段和1位NO_ACK标志。

3.2.3.3.1有效载荷长度

这6位字段以字节为单位指定有效载荷的长度。 有效载荷的长度可以从0到32字节。编码:000000 = 0字节(仅在空的ACK分组中使用)。100000 = 32字节,100001 =不关心。 只有在启用动态有效载荷长度功能的情况下才会使用此字段。

3.2.3.3.2PID(数据包标识)

2位PID字段用于检测接收到的数据包是新的还是重新发送的。 PID防止PRX设备向接收主机MCU多次提供相同的有效负载。 对于通过SPI接收到的每个新数据包,PID字段在TX端递增。 PID和CRC字段(请参阅第30页的第7.3.5节)由PRX设备用于确定数据包是重新传输还是新数据包。 当链路上有多个数据包丢失时,PID字段可能会变得等于最后收到的PID。 如果数据包与前一个数据包具有相同的PID,则nRF24L01 +将比较两个数据包的CRC总和。 如果CRC总和也相等,则最后接收的数据包被认为是先前接收的数据包的副本并被丢弃。

3.2.3.3.3无确认标志(NO_ACK)

选择性自动确认功能控制NO_ACK标志。

该标志仅在使用自动确认功能时使用。 将标志设置为高,告诉接收器该数据包不被自动确认。

在PTX上,您可以使用以下命令在分组控制字段中设置NO_ACK标志位:

W_TX_PAYLOAD_NOACK

但是,首先必须通过设置EN_DYN_ACK位在功能寄存器中启用该功能。当您使用此选项时,PTX在发送数据包后直接进入待机I模式。 PRX在收到数据包时不发送ACK数据包。

3.2.3.4 有效载荷

有效载荷是用户定义的数据包内容。 它可以是0到32个字节宽,并在上传到nRF24L01 +时在空中传输。 增强型ShockBurst™提供两种处理有效载荷长度的方案; 静态和动态。 默认值是静态负载长度。 对于静态有效载荷长度,发射机和接收机之间的所有数据包具有相同的长度。 静态净荷长度由接收端的RX_PW_Px寄存器设置。 发送方的有效载荷长度由时钟输入TX_FIFO的字节数决定,并且必须等于接收器侧RX_PW_Px寄存器中的值。 动态有效载荷长度(DPL)是静态有效载荷长度的替代。 DPL使发送器能够向接收器发送具有可变有效载荷长度的分组。 这意味着对于具有不同有效负载长度的系统,不需要将数据包长度扩展到最长的有效负载。

借助DPL功能,nRF24L01 +可以自动解码接收数据包的有效负载长度,而不是使用RX_PW_Px寄存器。 MCU可以使用R_RX_PL_WID命令读取接收到的有效负载的长度。

注意:使用R_RX_PL_WID命令时,请始终检查报告的数据包宽度是否为32个字节或更短。如果它的宽度大于32字节,则数据包包含错误并且必须丢弃。 使用Flush_RX命令丢弃数据包。

为了启用DPL,必须启用FEATURE寄存器中的EN_DPL位。 在RX模式下,必须设置DYNPD寄存器。 发送到启用了DPL功能的PRX的PTX必须设置DYNPD的DPL_P0位。

3.2.3.5 CRC(循环冗余校验)

CRC是数据包中的强制错误检测机制。 它是1或2个字节,通过地址分组控制字段和有效载荷进行计算。

1字节CRC的多项式为X8 + X2 + X + 1。初始值0xFF

2字节CRC的多项式为X16 + X12 + X5 + 1。初始值0xFFFF

CRC中的字节数由CONFIG寄存器中的CRCO位设置。 如果CRC失败,没有数据包被Enhanced ShockBurst™接受。

3.2.3.6 自动数据包组装

自动数据包程序集组装前导码,地址,数据包控制字段,有效载荷和CRC以在发送之前创建一个完整的数据包。
在这里插入图片描述

3.2.3.7 自动数据包拆卸

数据包通过验证后,Enhanced ShockBurst™拆分数据包,并将有效载荷加载到RX FIFO中,并置位RX_DR IRQ。

在这里插入图片描述

3.2.4 自动数据包事务处理

增强型ShockBurst™具有两种自动数据包事务处理功能; 自动确认和自动重新传输。

3.2.4.1 自动确认

自动确认功能可在收到并确认数据包后自动将确认数据包发送至PTX。 自动确认功能降低了系统MCU的负载,并且可以消除对专用SPI硬件的需求。 这也降低了成本和平均电流消耗。 自动确认功能通过设置EN_AA寄存器来启用。
注意:如果收到的数据包设置了NO_ACK标志,则不执行自动确认。

ACK数据包可以包含从PRX到PTX的可选载荷。 为了使用此功能,必须启用动态有效载荷长度(DPL)功能。 PRX端的MCU必须通过使用W_ACK_PAYLOAD命令将有效载荷通过时钟发送到TX FIFO来上传。 有效载荷在TX FIFO(PRX)中待处理,直到从PTX收到新数据包。 nRF24L01 +可以同时在TX FIFO(PRX)中挂起三个ACK数据包有效载荷。
在这里插入图片描述
图9显示了在处理未决ACK数据包有效载荷时如何操作TX FIFO(PRX)。 使用W_ACK_PAYLOAD命令在MCU上输入有效负载。 地址解码器和缓冲控制器确保有效载荷存储在TX FIFO(PRX)中的空闲插槽中。 当收到一个数据包时,地址解码器和缓冲器控制器将通过PTX地址通知。 这确保将正确的有效载荷呈现给ACK生成器。
如果TX FIFO(PRX)包含多个到PTX的有效载荷,则使用先进先出原则处理有效载荷。 如果所有挂起的有效载荷都发送到链路丢失的PTX,则TX FIFO(PRX)将被阻塞。 在这种情况下,MCU可以使用FLUSH_TX命令刷新TX FIFO(PRX)。
为了启用有效负载自动确认功能,必须设置FEATURE寄存器中的EN_ACK_PAY位。

3.2.4.2 自动重传(ART)

自动重传是一种在未收到ACK数据包的情况下重传数据包的功能。 它用于PTX上的自动确认系统。 当数据包未被确认时,您可以通过设置SETUP_RETR寄存器中的ARC位来设置允许重传的次数。 每次发送数据包时,PTX进入接收模式并等待一个短时间的ACK数据包。 PTX处于RX模式的时间段取决于以下条件:

•自动重新传输延迟(ARD)已过。
•250μs内无地址匹配(或250kbps模式下500μs)。
•接收到数据包后(CRC正确与否)。

当收到ACK数据包时,nRF24L01 +断言TX_DS IRQ。

如果TX FIFO中没有未发送的数据且CE引脚为低电平,nRF24L01 +进入待机I模式。 如果未收到ACK数据包,nRF24L01 +将在ARD定义的延迟后返回到TX模式并重新发送数据。 这一直持续到收到确认,或达到最大重传次数。

每丢失一个数据包,OBSERVE_TX寄存器中的两个数据包丢失计数器ARC_CNT和PLOS_CNT就会增加。 ARC_CNT计算当前事务的重传次数。 您通过启动新的事务来重置ARC_CNT。 PLOS_CNT计算自上次频道更改以来的重传任务总数。 通过写入RF_CH寄存器来重置PLOS_CNT。 可以使用OBSERVE_TX寄存器中的信息对信道质量进行总体评估。

ARD定义了从传输数据包的末端到PTX重新开始传输的时间。ARD设置在SETUP_RETR寄存器中,步长为250μs。 如果PTX未收到ACK数据包,则重新发送。

使用带有有效负载的ACK数据包时,ARD的长度有限制。 ARD时间不得少于ACK数据包的启动时间和直播时间的总和:
•2Mbps数据速率和5字节地址; 15字节是ARD =250μs(复位值)的最大ACK包有效载荷长度。
•对于1Mbps数据速率和5字节地址; 5字节是ARD =250μs(复位值)的最大ACK包有效载荷长度。
ARD =500μs足够长,可用于1或2Mbps模式下的任何ACK有效负载长度。

对于250kbps数据速率和5字节地址,以下值适用:在这里插入图片描述

作为自动重传的替代方案,可以手动设置nRF24L01 +多次重传数据包。这由REUSE_TX_PL命令完成。 当使用此命令时,MCU必须在CE引脚上发送脉冲来启动每次数据包的传输。(译者注:该方案类似手动自动重传功能)

3.2.5 增强的ShockBurst流程图

本节包含概述增强型ShockBurst™中PTX和PRX操作的流程图。

3.2.5.1 PTX(发送端)操作

图10中的流程图概述了配置为PTX的nRF24L01 +在进入待机I模式后的行为。
在这里插入图片描述
注意:ShockBurst™操作用虚线框标出。

通过将CE引脚设置为高电平来激活PTX模式。 如果TX FIFO中存在数据包,则nRF24L01 +进入TX模式并发送数据包。 如果启用了自动重传功能,状态机会检查是否设置了NO_ACK标志。 如果未设置,则nRF24L01 +进入RX模式以接收ACK数据包。 如果收到的ACK数据包为空,则只有TX_DS IRQ被置位。 如果ACK数据包包含有效负载,则在nRF24L01 +返回待机I模式之前,TX_DS IRQ和RX_DR IRQ都会同时生效。

如果在超时发生之前未收到ACK数据包,则nRF24L01 +将返回到待机II模式。 在ARD过去之前,它一直处于Standby- II模式。 如果重传次数还没有达到ARC,则nRF24L01 +进入TX模式并再次发送最后一个数据包。

在执行自动重发功能时,重发次数可以达到ARC中定义的最大数量。 如果发生这种情况,nRF24L01 +会置位MAX_RT IRQ并返回待机I模式。(译者注,如果MAX_RT IRQ清除,之后继续重新发送数据)

如果CE为高电平且TX FIFO为空,则nRF24L01 +进入Standby-II模式。

3.2.5.2 PRX(接收端)操作

图11中的流程图概述了配置为PRX的nRF24L01 +在进入待机I模式后的行为。
在这里插入图片描述
注意:ShockBurst™操作用虚线框标出

通过将CE引脚设置为高电平来激活PRX模式。 nRF24L01 +进入RX模式并开始搜索数据包。 如果接收到数据包并启用了自动确认功能,nRF24L01 +将决定数据包是新数据包还是先前接收数据包的副本。 如果数据包是新的,则有效载荷在RX FIFO中可用,并且RX_DR IRQ被置位。 如果从发送器接收到的最后一个数据包被带有有效载荷的ACK数据包确认,则TX_DS IRQ指示PTX收到带有有效载荷的ACK数据包。 如果接收的数据包中没有设置No_ACK标志,则PRX进入TX模式。 如果TX FIFO中有一个挂起的有效载荷,它将附加到ACK数据包。 ACK数据包传输完成后,nRF24L01 +返回RX模式。

如果ACK数据包丢失,可能会收到先前收到的数据包的副本。 在这种情况下,PRX丢弃收到的数据包,并在返回RX模式之前发送ACK数据包。

3.2.6 MultiCeiver™

MultiCeiver™是一种用于RX模式的功能,它包含一组具有唯一地址的六个并行数据管道。 数据管道是物理RF信道中的逻辑信道。 每个数据管道在nRF24L01 +中都有自己的物理地址(数据管道地址)解码。
在这里插入图片描述
配置为PRX(主接收器)的nRF24L01 +可以在一个频率通道中接收发往六个不同数据通道的数据,如图12所示。每个数据通道都有其自己的唯一地址,可以针对个人行为进行配置。

配置为PTX的最多六个nRF24L01 +可以与一个配置为PRX的nRF24L01 +进行通信。 同时搜索所有数据管道地址。 一次只有一个数据管道可以接收数据包。所有数据管道都可以执行Enhanced ShockBurst™功能。

以下设置对所有数据管道通用:

•启用/禁用CRC(增强ShockBurst™启用时,CRC始终启用)
•CRC编码方案
•接收地址宽度
•频道
•空中数据速率
•LNA增益

数据管道使用EN_RXADDR寄存器中的位启用。 默认情况下只启用数据管道0和1。 每个数据管道地址都配置在RX_ADDR_PX寄存器中。

注意:始终确保没有任何数据管道具有相同的地址。

每个管道最多可以有一个5字节的可配置地址。 数据管道0有一个唯一的5字节地址。 数据管道1-5共享四个最重要的地址字节。 LSByte对于所有六个管道必须是唯一的。 图13.是数据管道0-5如何解决的一个例子。
在这里插入图片描述
使用MultiCeiver™和Enhanced ShockBurst™的PRX从多个PTX接收数据包。 为了确保来自PRX的ACK分组被发送到正确的PTX,PRX取得其接收分组的数据管道地址,并在发送ACK分组时使用它作为TX地址。图14是地址的示例 PRX和PTX的配置。 在PRX上,定义为管道地址的RX_ADDR_Pn必须是唯一的。 在PTX上,TX_ADDR必须与RX_ADDR_P0相同,并作为指定管道的管道地址。
在这里插入图片描述
只有当数据管道接收到完整的数据包时,其他数据管道才能开始接收数据。 当多个PTX传输到PRX时,可以使用ARD来歪曲自动重传,以便它们仅阻塞对方一次。

3.2.7 增强的ShockBurst™时序

本节介绍增强ShockBurst™的时序以及所有模式如何启动和操作。 增强ShockBurst™时序通过数据和控制接口进行控制。可以将nRF24L01 +设置为静态模式或自主模式,其中内部状态机控制事件。 每个自主模式/序列以IRQ引脚处的中断结束。 所有中断都在时序图中表示为IRQ事件。
在这里插入图片描述
在这里插入图片描述
图16显示了一个数据包的传输和确认。 PRX器件激活RX模式(CE = 1),PTX器件在TX模式下激活(CE = 1,最小10μs)。 经过130μs后,传输开始并在TOA过去后结束。

当传输结束时,PTX设备自动切换到RX模式,等待来自PRX设备的ACK数据包。 当PRX设备接收到数据包时,它为主MCU设置中断,并切换到TX模式发送ACK。 在PTX设备收到ACK包后,它将中断设置给MCU,并从TX FIFO中清除该包。

在图17中,当第一个ACK分组丢失时,显示分组传输的PTX定时。在ACK数据包失败时查看完整传输,请参见第40页上的图20。 在这里插入图片描述

3.2.8 增强ShockBurst™事物图

本节介绍增强型ShockBurst™自动事务处理的几种情况。本节数字中的标注表示IRQ和其他事件。对于MCU活动,事件可以放置在不同的时间段。

注意:本节中的数字表示数据包到MCU的最早可能下载(DL)以及发送器最近可能的有效载荷上载(UL)。

3.2.8.1 带ACK数据包和中断的单个事务

在图18中显示了基本的自动确认。 在PTX发送分组并由PRX接收分组后,将ACK分组从PRX发送到PTX。 在PRX接收到数据包后,RX_DR IRQ被置位,而当数据包被确认并且PTX接收到ACK数据包时,TX_DS IRQ被置位。
在这里插入图片描述
(译者注:如果能在PTX发送第一个数据包并且PRX接收到这个数据包进入接收中断的时候,以最快的速度130us内(这个可以设置SPI速度为 36/4 =9 M,也就是硬件SPI的速率,而NRF2401+最大能支持10M,所以这个频率是可以的,这样理论上1个命令字节+ 32负载字节大约需要33us,然后MCU做的一些其他处理工作,时间足够用)上传应答有效负载数据,那么就能赶在PRX第一个应答数据包发送之前,把数据加载到应答信号中,这样PTX只需要发送一次数据包,就能把想要的数据接收回来,而不需要等待PRX装载数据后再由PTX发送下一个数据包。换句话说,NRF为用户预留了130us的时间用于应答数据的上传,只要在这个时间内将数据上传,就不需要等待下一个数据包接收后再发送应答数据)

3.2.8.2 单个事务与丢失的数据包

图19是由于丢失第一个分组传输而需要重传的场景。数据包传输后,PTX进入RX模式接收ACK数据包。 在第一次传输之后,PTX等待ACK数据包的指定时间,如果它不在特定的时隙中,则PTX重新发送数据包,如图19所示。
在这里插入图片描述
当检测到地址时,PTX保持RX模式,直到收到数据包。当PRX接收到重新发送的数据包时(参见图19),RX_DR IRQ被置位,并且ACK被发送回PTX。 当PTX收到ACK时,TX_DS IRQ被置位。

3.2.8.3 丢失ACK包的单个事务

图20是丢失ACK分组后需要重传的场景。 相应的中断也被指示。
在这里插入图片描述

3.2.8.4 带有ACK净荷分组的单个事务

图21.是带有有效负载的基本自动确认方案。 在PTX发送分组并由PRX接收到分组后,带有有效载荷的ACK分组从PRX发送到PTX。在PRX接收分组后,RX_DR IRQ被置位;而在PTX侧,当PTX收到ACK数据包时TX_DS IRQ被设置。在PRX端,收到来自PTX的新数据包后,ACK数据包有效负载的TX_DS IRQ被置位。图21中IRQ的位置显示了MCU可以响应中断的位置。
在这里插入图片描述

3.2.8.5 带有ACK净荷分组和丢失分组的单个事务

图22.是在PRX侧的RX_DR IRQ被声明之前,第一个数据包丢失并需要重新传输的情况。 对于PTX,在收到ACK数据包之后,TX_DS和RX_DR IRQ都被置位。 在PRX端接收到第二个数据包(PID = 2)后,RX_DR(PID = 2)和TX_DS(ACK数据包有效负载)IRQ都被置位。
在这里插入图片描述

3.2.8.6 具有ACK有效载荷数据包和第一个ACK数据包的两个事务丢失

在这里插入图片描述

在图23中,ACK分组丢失,并且在TX_DS IRQ(PTX)被设置之前需要重传,但是RX_DR IRQ(PRX)立即被设置。分组的重传(PID = 1)导致PRX丢弃分组。对于PTX,TX_DS和RX_DR IRQ在接收到ACK的第二次传输之后被设置。 在PRX上接收到第二个数据包(PID = 2)后,RX_DR(PID = 2)和TX_DS(ACK1PAY)IRQ均被置位。 标注解释了不同的事件和中断。

3.2.8.7 两次达到最大重传次数的交易

在这里插入图片描述
如果自动重发计数器(ARC_CNT)超过编程的最大限制(ARC),则MAX_RT IRQ被置位。在图24中,数据包传输以MAX_RT IRQ结束。TX FIFO中的有效载荷不会被移除,MCU将决定协议中的下一步。CE的翻转启动相同数据包的新传输序列(译者注:意思就是说通过CE的电平翻转可以实现新的传输,此时还是使用之前的数据,不需要再上传新数据。当然也可以上传新数据)。使用FLUSH_TX命令可以从TX FIFO中删除有效载荷。

3.2.9 与ShockBurst™兼容

您必须禁用Enhanced ShockBurst™,以便与nRF2401A,nRF2402,nRF24E1和nRF24E2向后兼容。 设置寄存器EN_AA = 0x00和ARC = 0禁用Enhanced ShockBurst™。此外,nRF24L01 +空中数据速率必须设置为1Mbps或250kbps。

3.2.9.1 ShockBurst™数据包格式

图25显示了左侧MSB的数据包格式。
在这里插入图片描述
ShockBurst™数据包格式具有前导码,地址,有效载荷和CRC字段,与第28页7.3节中描述的增强型ShockBurst™数据包格式相同。

ShockBurst™数据包与Enhanced ShockBurst™数据包的区别在于:

•9位分组控制字段不在ShockBurst™数据包格式中。
•CRC在ShockBurst™数据包格式中是可选的,并由CONFIG寄存器中的EN_CRC位控制。

下一篇:
NRF24L01+中文翻译连载之三——数据和控制接口

关注微信公众号,获取最新技术文章

猜你喜欢

转载自blog.csdn.net/weixin_42876465/article/details/87647836