在【4. 数据传输原理第二讲】中,描述过PTX和PRX之间双向通信的基本过程。
里面说过,
PTX
掌管着通信过程的主动权,其中一项就是等待PRX端回复时,如果超过限定时间,则PTX会将刚刚发过的数据包再重新发送一次。
这个超时重发还是有不少道道可说的,这一节单拎出来讲讲超时重发机制。
再强调一下:
超时和重发只跟PTX
有关系,没PRX什么事儿,所以相关寄存器的配置操作,只在PTX端的nrf24l01上配置即可,PRX端不用配置
上面这两张图(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的自由。
这两个参数集中放置在一个寄存器中:
如上图:
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包也能安全地完整地传输完毕】。
数据包传输花费时间有一个精确的计算公式:
上图位于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就可以了。
【此节完】