4. 增强型ShockBurst

增强型的ShockBurst是一个数据链路层,具有自动数据包组装和数据包的发送、定时、自动确认和重传。这些特性能够显著提高双向和单向系统的能效,而不会增加主机控制器侧的复杂性。

增强型ShockBurst数据包事务是一种数据包交换,其中一个收发器充当主收发器(PRX, Primary Receiver)而另一个收发器用作主发射器(PTX, Primary Transmitter)。

自动数据包事务处理的工作如下:

  1. PTX先发送数据,然后转为RX模式,接受PRX发送的应答包;

  2. 如果PRX收到了数据,把数据保存后会转为TX模式发送应答包,然后再返回RX模式。

  3. 如果PTX没有收到应答包,会在一个可编程的延迟时间后自动重发原始包的数据,然后切换到RX模式去接收应答包。

上面的这些事件都是增强型ShockBurst完成的,不需要MCU的参与;

4.1. packet format

4.1.1. Preamble 前导码

前导码是一个比特序列,用于将接收器解调器与输入比特流同步。前导码长一个字节,为01010101(0x55)或10101010(0xAA)。

如果地址中的第一位是1 前导码被自动设置为10101010,如果第一个比特为0 前导码被自动设置为01010101。这样做是为了确保前导码中有足够的转换来稳定接收机。

4.1.2. Adress

您可以配置 AW 寄存器中的地址字段宽度为3、4或5个字节,见表28。第63页。

注意:设置地址时要避免高低电平只反转一次的,如0x000FFFFFFF,这样的话可能会被当作噪声;也要避免一直反转的地址,否则可能会被认作前导码;

4.1.3. 包控制字段

payload length, 数据长度

  1. payload length, 此6位字段指定有效载荷的长度(以字节为单位)。有效载荷的长度可以从0到32字节。

  2. 编码:000000=0字节(仅用于空ACK数据包)100000=32字节,100001=不在乎。

  3. 此字段仅在启用动态有效载荷长度功能(EN_DPL)时使用。

PID(数据包识别)

2-bit的PID防止PRX设备向接收主机MCU多次呈现相同的有效载荷,在TX侧,每当通过SPI接受到新的数据包后PID都会自增。

PRX通过PID和CRC来判定接受的数据是新发送的还是重发的:当数据链路丢失了一些数据包后,如果新来的数据PID和最后一次成功接收的PID相同,并且CRC也相同的话,则说明这包数据是重发的;否则是新发送的数据。

PTX发送两包相同的数据包时,PID会有不用,所以CRC也会不同;而重发的数据则PID和CRC都一样。

NO_ACK, 无确认标志

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

但是,必须首先通过在FEATURE寄存器中设置EN_DYN_ACK位启用该功能。

当您使用此选项时,PTX在传输数据包后直接进入待机-I模式。PRX在接收到数据包时不发送ACK数据包。

d: 如果激活了ACK-payload,那么带有ACK数据包具有动态有效载荷长度,并且应为PTX和PRX上的管道0启用动态有效载荷长度功能。这是为了确保他们收到带有有效载荷的ACK数据包。

意思是说,开启了ACK-payload后,payload是动态数据长度的,因为它有可能回复一个数据,因此PTX和PRX的管道0都要开启EN_DPL功能。

如果在2Mbps模式下ACK有效载荷大于15字节,则ARD必须为500µS或更大,如果在1Mbps模式下确认有效载荷大于5字节,则ARD必须为500μS或更高。在250kbps模式下(即使有效载荷未处于ACK状态),ARD必须为500µS或更高。

4.1.4. payload

payload就是数据包里用户定义的内容,可以是0~32字节;有两种payload长度:静态的,动态的。

  1. 默认是静态的payload长度。发射器和接收器的长度相同,接收器的长度由RX_PW_Px设置,发射器的长度由TX_FIFO的长度确定,因此要求TX_FIFO的size要和RX_PW_Px的值相同。

  2. 动态payload长度DPL,允许发射器发射不同长度的payload,这对于需要发射数据的长度不一致很有用,不再必须填充为相同的长度了。

4.1.5. CRC

CRC校验的字节由CONFIG寄存器中的CRCO位设置,校验的内容包括:地址、分组控制字段和有效载荷。

The polynomial for 1 byte CRC is $X8+X2+X+1$ , Initial value 0xFF.

The polynomial for 2 byte CRC is $X{16}+X+X^5+1$ . Initial value 0xFFFF.

4.2. 自动包处理

4.2.1. AA, Auto acknowledgement 自动应答

自动应答是在PRX接受到有效数据后自动发送应答包数据,通过设置EN_AA寄存器启用自动确认功能。如果接收的包数据NO_ACK标志位被置位,也不会有自动应答。

一个自动应答包,是可以包含payload的,也就是说可以回传一些数据。为了实现这一点,DPL, Dynamic Payload Length动态数据长度功能必须启用,同时PRX侧的MCU需要把payload上传到TX-FIFO里,最多存3个payload(3字节?),

TODO: 这里有点不清楚,

这样在收到新的数据时就可以把payload发送出去。24L01+有3个payload缓存FIFO

当收到数据包后会解析出用哪个地址的payload进行应答,盲猜是利用PID匹配,但是只有3个而不是4个缓存区呢

4.2.2. ART, Auto Retransmission, 自动重发

  1. 自动重发是指在没有收到ACK时重发一次payload,它被用在开启了自动应答的PTX上。如果一个数据包没有被应答,你可以通过在SETUP_RETR寄存器中设置ARC位来设置一个时间重新传输。

  2. PTX在每次发送完数据后都会进入RX模式下等待很少的时间,等待时间基于以下条件:

    • 自动重传延迟(ARD)已过:没有收到数据或者数据不对,会根据用户的重发时间延迟后自动重发,不再等待;
    • 250µs内(或250kbps模式下的500µs内)没有地址匹配:芯片自己的地址匹配,就是收到了数据但是地址不对,不是发给自己的;
    • 收到数据包后(CRC是否正确):数据受到了干扰
  3. 在收到ACK时会触发TX_DS中断

  4. 每一次丢包时会有两个计数器增加:OBSERVER_TX寄存器的ARC_CNT,PLOS_CNTARC_CNT记录的是当前payload重发的次数,当触发下一次新的发送前会被清零。PLOS_CNT记录着自从上次切换通道后总共的重发的次数,当修改RF_CH的值将会清零。这两个数值可以评估当前信道的质量

  5. Auto Retransmit Delay (ARD) 定义着上次发送完成到下次开始重发的时间延迟,ARD在SETUP_RETR寄存器中以250µs的步长设置。ARD的时间不能设置的过短(有可能发射的数据还没有完成,怎么接受应答呢):

    • 2Mbps数据速率和5字节地址;15字节是最大ACK数据包有效载荷长度 ARD=250µs(重置值)。

    • 1Mbps数据速率和5字节地址;5 字节是最大ACK数据包有效载荷长度 ARD=250µs(重置值)。

      ARD=500µs对于1或2Mbps模式下的任何ACK有效载荷长度来说都足够长。

    • 对于250kbps数据速率和5字节地址,适用以下值:

  6. 除了自动重发,你还可以使用 REUSE_TX_PL命令进行手动重发;当这个命令使用时,MCU需要利用 CE管脚初始化每一次的传输。

4.3. MultiCeiver 多接收机

在接收模式下,MultiCeiver允许最多6个数据通道,每个数据通道都有自己独立的物理地址;可以理解为可以接收来自6个发射器的数据。

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

  2. 6个信道必须都在相同的频率下,他们是依靠地址不同来区分设备的,频率不同就通讯不上了。

  3. 同一时刻最多只有1个信道是工作的,否则的话就会相互干扰通信。

  4. 信道0有唯一的5字节地址,信道1-5共享信道1的高4字节地址;

  5. PRX的自动应答,会将接受到的包地址作为发射地址传输:PTXn的发射地址TX_ADDR必须和PRX的RX_ADDR_Pn相同

    对于PTX来说,不就是数据相当于发给自己了,只不过自己发射的收不到?

4.4. 增强ShockBurst时序

  1. $T_{OA}$, Time On-Air,

  2. $T_{ACK}$, Time On-Air ACK

  3. $T_{UL}$, Time upload

  4. $T_{ESB}$, Time Enhanced ShockBurst cycle

4.5. 增强型ShockBurst传输图

4.5.1. 单次传输图,带ACK和中断

  1. PTX发送数据给PRX

  2. 当PRX接收到数据数据后,RX_DR中断被触发(表示当前DL数据可读),然后发送应答给PTX

  3. 当PTX接受到应答后,TX_DS中断被触发

4.5.2. 单次传输,但是丢了一包数据

  1. PTX发送数据给PRX,但是受到了干扰,导致PRX没有收到或者收到后数据错误;

  2. ARD延迟后重发PRX相同的数据

  3. 当PRX接收到数据数据后,RX_DR中断被触发(表示当前DL数据可读),然后发送应答给PTX

  4. 当PTX接受到应答后,TX_DS中断被触发

4.5.3. 单次传输,但是丢了一帧应答

  1. PTX发送数据给PRX

  2. 当PRX接收到数据数据后,RX_DR中断被触发(表示当前DL数据可读),然后发送应答给PTX

  3. 当PTX没有收到应答,在延迟ARD时间后重发上次的数据

  4. 当PRX接收到数据数据后,发现是重发数据中断RX_DR不再触发丢弃这次接收的数据,然后发送应答给PTX

  5. 当PTX接受到应答后,TX_DS中断被触发

4.5.4. 单次传输,有应答数据

  1. PTX发送数据给PRX

  2. PRX接收到数据后会触发RX_DR中断,接着PRX发送带数据的应答给PTX

  3. 当PTX收到应答后会触发TX_DS中断已经RX_DR中断(PRX的应答数据),然后发送下一个新的数据(PID=2)

  4. 当PRX收到新的数据后会触发RX_DR数据中断以及TX_DS应答中断(PTX发送的新数据可以理解为给PRX的应答,否则PTX就会重发了)

4.5.5. 单次传输,带应答数据,但是丢了数据

  1. PTX发送数据给PRX,但是受到了干扰,导致PRX没有收到或者收到后数据错误;

  2. ARD延迟后重发PRX相同的数据

  3. PRX接收到数据后会触发RX_DR中断,接着PRX发送带数据的应答给PTX

  4. 当PTX收到应答后会触发TX_DS中断已经RX_DR中断(PRX的应答数据),然后发送下一个新的数据(PID=2)

  5. 当PRX收到新的数据后会触发RX_DR数据中断以及TX_DS应答中断(PTX发送的新数据可以理解为给PRX的应答,否则PTX就会重发了)

4.5.6. 2次传输,带数据应答;但是第一次的应答包丢失

4.5.7. 两次传输,但是达到最大重发次数

4.6. 和ShockBurst的兼容性

将寄存器EN_AA=0x00ARC=0设置为禁用增强型ShockBurst,此外,nRF24L01+空中数据速率必须设置为1Mbps或250kbps。

4.6.1. ShockBurst包格式

和增强型的相比,区别在于:

  1. 少了9位宽的包控制管理

  2. CRC在ShockBurst数据包格式中是可选的,由CONFIG寄存器中的EN_CRC位控制 。

[nRF24L01+] 4. 增强型ShockBurst的更多相关文章

  1. NRF24L01注意点

    nrf24L01被设置为接收模式后,可通过6个不同的数据通道(data pipe)接收数据. 每个数据通道都有一个唯一的地址但是各数据通道的频率是相同的.这意味着可以有6个被配置成发送状态的nRF24 ...

  2. NRF24L01学习

    一.工作模式 PWR_UP和PRIM_RX在寄存器0x00中的第0位和第1位. 待机模式I:只是使用晶振工作,CE=0时是拉低? 待机模式II:部分时钟缓冲器处在工作模式.TX FIFO为空并且CE为 ...

  3. [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程

    前言:  nRF51可以支持基于2.4G的互相通信.与NRF24LE1的通信.与NRF24LU1的通信.与NRF24L01的通信. 一.nRF51822基于2.4G和nRF51822通信 其中nRF5 ...

  4. NRF24L01双向无线通信

    最近闲来无事,利用手头资源研究了一下基于nrf24L01的双向通信实验,整个系统如下图所示. 原理: nrf24L01本身是一种单向通信的无线模块,但是,当nrf24L01工作在增强型的 ShockB ...

  5. nRF24L01芯片控制——迈向无线的第一步

    nRF24L01芯片是一款专供单片机的射频收发芯片.工作于2.4GHz~2.5GHz ISM频段.融合了shockburst技术. 我先列出该芯片的硬件参数资料: 至于每个引脚的具体用途,可以参见技术 ...

  6. 【Espruino】NO.15 nRF24L01+无线收发器

    http://blog.csdn.net/qwert1213131/article/details/35853747 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] [Espru ...

  7. 玩转X-CTR100 l STM32F4 l NRF24L01+ 2.4G无线通信

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 NRF24 ...

  8. nRF24L01P的ShockBurst与Enhance ShockBurst

    nRF24L01P的数据手册里讲到了两个两种发射模式ShockBurst Mode和Enhanced ShockBurst Mode.但是呢,手册里着重的一直在讲Enhanced ShockBurst ...

  9. nRF24L01无线模块笔记

    nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据 ...

  10. NRF24L01 无线模块的使用

    NRF24L01 是一款工作在2.4-2.5GHz通用ISM频段的单片收发芯片 工作电压:1.9-3.6V低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象 多频点 ...

随机推荐

  1. Wakelocks 框架设计与实现

    Wakelocks 框架是基于Wakeup Source实现的为Android系统上层提供投票机制,以阻止系统进入休眠. 1.功能说明 该模块的支持受宏CONFIG_PM_WAKELOCKS控制.在使 ...

  2. 采集modbus设备数据转wincc项目案例

    1         文档说明 1.   网关设置采集Modbus设备数据 2.   把采集的数据转成profinet协议转发给wincc. 2         VFBOX网关工作原理 VFBOX网关是 ...

  3. HTTP协议 学习:1-报文分析

    HTTP协议 学习:1-报文分析 背景 上一讲我们介绍了HTTP协议的一些 概念 ,对HTTP协议有了一个基础的认识. 正如之前学习MQTT协议一样,我们需要对HTTP的报文进行分析. HTTP 报文 ...

  4. uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

    按各地址起作用的顺序,uboot引导linux内核启动涉及到以下地址: load address: entry point: 这两个地址是mkimage时指定的 bootm address:bootm ...

  5. 全国产!全志T3+Logos FPGA核心板(4核ARM Cortex-A7)规格书

    核心板简介 创龙科技SOM-TLT3F是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核全国产工业核心板,ARM C ...

  6. [UG 二次开发 python] 生成略缩图并保存

    保存到零件同名的文件夹下,名称相同,类型是 jpg 用到 numpy,PIL,cv2 blockstyler 文件略 # nx: threaded __version__ = "0.0.1& ...

  7. 严格根号带修 RMQ

    其实很简单,把之前随机数据的解法中维护块内数据的数据结构换成约束 RMQ,这样子复杂度 严格 单点修改 \(O(\sqrt n)\),区间查询 \(O(1)\),线性空间. 唯一的问题是常数太大了,有 ...

  8. Java权限认证框架比较

    认证.授权.鉴权和权限控制 定义 英文 实现方式 认证 确认声明者的身份 identification 根据声明者独特的识别信息 授权 获取用户的委派权限 authorization 颁发一个授信媒介 ...

  9. yb课堂 下单页面组件开发 《四十三》

    Pay.vue <template> <!--视频信息--> <div> <div class="info"> <p clas ...

  10. Spring(XML方式)简单入门

    环境准备 maven jdk Spring Eclipse 项目创建 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...