arduino笔记38:PTX的超时重发机制

 

在【4. 数据传输原理第二讲】中,描述过PTX和PRX之间双向通信的基本过程。

里面说过, PTX 掌管着通信过程的主动权,其中一项就是等待PRX端回复时,如果超过限定时间,则PTX会将刚刚发过的数据包再重新发送一次。
 
这个超时重发还是有不少道道可说的,这一节单拎出来讲讲超时重发机制。
 
再强调一下: 超时和重发只跟PTX 有关系,没PRX什么事儿,所以相关寄存器的配置操作,只在PTX端的nrf24l01上配置即可,PRX端不用配置

 

arduino笔记38:PTX的超时重发机制_第1张图片

 

arduino笔记38:PTX的超时重发机制_第2张图片

上面这两张图(datasheet第43页)描述了两种导致超时重发的意外场景。

图上的内容很多,一时看不明白也不要紧,很多和本节内容无关。

只关心我红框标出的位置即可,跟着下文的描述走就行了。
 
红圈叉号表示数据包传输时意外丢失(电磁波干扰、信号太弱、PRX没准备好、PRX解析数据出错等等各种意外情况);

矩形红框圈出的是程序给PTX设定好的超时时间,简称 ARD (Auto-Retransmit-Delay)
 
任何一次PTX和PRX之间的通信过程,由PTX负责启动:
 
在【Enhanced ShockBurst】工作模式下,我们的程序只需要在上图T0时刻按照前面章节描述的方法启动PTX的数据发送,上图中后续的所有过程完全由PTX自主完成。
 
PTX首先进入TX Mode,将一个PID为1的数据包发送出去。

发送完毕后,PTX立刻开始计时,同时准备进入RX Mode(RX Mode下才能接收数据),这个切换过程的耗时是固定的、精确的、130uS。

130uS一过,PTX正式进入了RX Mode,就可以接收来自对方的数据了。
 
由于PTX发出去的包PRX没收到,或者PRX发过来的ACK包传输时意外丢失,所以PTX在RX Mode下根本不会收到正确的回复数据。
 
刚才说过,PTX是一直开着计时的,在上述意外情况下,计时时间是肯定会达到ARD预设的时间值的。当超时的那一刻,PTX就判断出需要执行重发操作了(也可能没有重发流程,这个要看ARC的配置,此细节后面再细说)。
 
PTX开始执行重发流程,由RX Mode转入TX Mode,中间同样需要130uS的转换时间。

PTX入定TX Mode之后,将刚才PID为1的数据包再给PRX发一次。

上图中这次的发送是成功的,后面一切顺利,正常完成了数据的发送,回复的接收等过程。
 
当然,上图的示例仅仅展示了重发一次就成功的场景,但我们在实际使用时,有可能遇到更坏的情况。

如果重发的那次再失败呢?那就二次重发!

二次重发也失败呢?三次重发!!

再失败呢? 四次重发!!!

没完没了了是吧?!
 
PTX当然不会允许自己陷入这种死循环,PTX 存在一个重发次数的上限 ,这个上限数值简称 ARC (Auto-Retransmit-Count)。

如果【同一个数据包】,【连续重发次数】累积达到了限定值,PTX会自动终止这种重发循环。

终止之后,PTX会立即触发MAX-RT IRQ,拉低nrf24l01的IRQ脚,告知程序:【重发次数达到上限了,我已经尽力了,你自己看着办吧!】
 
上面提到的 ARD 和 ARC这两项参数,nrf24l01允许我们的程序自由配置,只不过是N选1的自由。

这两个参数集中放置在一个寄存器中:
 
 
arduino笔记38:PTX的超时重发机制_第3张图片

 

如上图:
ARD 占用 bit4-bit7, 0000表示超时上限为250uS / 0001 为 500uS / 以此类推,最大 1111表示4000uS。

ARC 占用 bit0-bit3, 0001表示只重发一次,之后再失败就触发 MAX-RT IRQ , 以此类推,最多重发15次。

特别说一下 ARC=0000的情况,0000表示没有重发流程,如果首次发送数据包失败,就立即触发MAX-RT。
 
说到这里,再提个小细节:
细心的同学会发现,在PTX在转入RX Mode等待PRX回复的这个时间段,我的描述和实际图示在细节上有出入。

我的描述貌似在说PTX一直在RX Mode状态下等待PRX的回复,直到等待超时;

而图示中PTX在转入RX Mode之后,在里面只呆了很短的时间就退出了RX Mode,ARD期间大部分时间是不在RX Mode中的。
 
其实两种说法都是对的,看怎么理解^_^
 
【在ARD限定的时间之内没收到PRX的回复,则判定为超时,触发重发流程】

这句话只是口语化的粗略描述,PTX对于回复超时的判定有一套精确的规则:
 
规则1: 进入RX Mode那一刻起,250uS内没检测到和自己匹配的地址数据
规则2: 250uS内收到匹配地址,但回复数据太长了,直到ARD限定的时刻,完整的数据包依旧没收完
规则3: 地址匹配,回复数据没等到ARD超时就早早地收完了,但数据被污染,校验出错
 
以上3种场景任意一种都会触发PTX的超时重发机制。

显然,图示中描述的情况符合条件1,PTX早早就退出了RX Mode(为了省电^_^)。

而我描述的情况符合条件2,ARD设定的不合理,时间太短。
 
那么ARD和ARC如何选取才【安全/合理/高效】呢?
 
最安全的,ARD和ARC全部选取最大配置值,即ARD=4000uS ARC=15

安全倒是安全,但是效率太低了:

4毫秒*15=60毫秒,也就是说,4毫秒之后才会重发一次,60毫秒之后,才会触发MAX-RT IRQ。

冗余等待的时间太长了,一旦偶现通信环境短暂干扰,会严重拉低持续通信的平均传输速率。
 
为了快速重发,ARD的时间长度要尽量短,但太短也不行:

250kBps波特率下,仅仅传输32字节有效数据,就需要花费 (32*8)/250kBps=1024微秒。

再加上数据包里的前导码/地址/CRC等,至少1300多微秒才能传输完毕,所以此时ARD设定值不能小于1500微秒,不然就会触发规则2。
 
所以,ARD在不同波特率下,配置值是有个下限的,即必须保证【最长ACK包也能安全地完整地传输完毕】。
 
数据包传输花费时间有一个精确的计算公式:
 
 
arduino笔记38:PTX的超时重发机制_第4张图片
 

 

上图位于datasheet第40页。
 
【air data rate】: 波特率,250K/1M/2M

【package length】:数据包中全部信息的bit数总和
 
ARD的下限值,大家写程序时根据自己的情况套用公式自行计算。

【package length】有个理论上的上限: 8*(1+5+32+2) + 9 = 329 bit。

根据 [(329)/air-data-rate] 计算出的值可以满足各种包长情况下的完整安全传输。
 
至于ARC的选取,就没有什么严格标准了,取1也可,取15也可。

我认为一般取5-6就可以了。
 
【此节完】

 

 

 

你可能感兴趣的:(arduino学习笔记)