1 CLASS_A
接收时隙图
image.png
其中Transmait表示一帧上行包的发送时间
RX1表示下行窗口1
R2表示下行窗口2
RECEIVE_DELAY1表示定时器1的定时时长
RECEIVE_DELAY2表示定时器1的定时时长
1.1 下行流程说明
当上行数据发送完毕之后将会打开两个定时器,其一被设定为定时RECEIVE_DELAY1,当定时器超时后打开下行数据接收窗口RX1,RX1的接收频率和上行频率相关,对应关系被表述在了地区规范的文档中,下列将简述一下。默认第一窗口的速率是和最后一次上行的速率相同。
在470~510Mhz的通讯频率中,上行被分为了0~95共96个通道,从470.3Mhz间隔200KHz增加到489.3Khz。下行被分为了0到47共48个信道,从500.3Mhz间隔200KHz增加到509.7KHz。上行的通道0和下行的通道0对于,例如上行频率是470.3则下行频率是500.3,
定时器2被设定延时RECEIVE_DELAY2,它是和定时器1同时打开的。在地区规范中被定义为RECEIVE_DELAY1+1s。它的频率与速率都是固定的,可以通过MAC命令修改,默认遵循地区规范(505.3KHz - DR0)
RX1和RX2打开的窗口时间在规范中被要求至少能接受到前导码。该时长在每次打开窗口时都会根据带宽速率计算一次。大概也就百多毫秒。当RX1接受到正确数据后,RX2将不会被打开。
2 CLASS_C
时隙图
image.png
CLASS_C是遵循CLASS_A的基础上衍生出的具备持续下行接收的模式。在CLASS_C下,窗口2将被一直打开。
2.1 由代码了解该模式
当数据发送完毕后OnRadioTxDone函数被调用,方便理解,下列用伪代码表述
/*首先判断如果是C模组,则当即打开RX2窗口*/
if(mode != class_c)
{
radio.sleep();
}
else
{
RxWindowTimer2.stop();
Rx2Window.open();
}
/*配置定时器*/
RxWindowTimer1.start(RECEIVE_DELAY1);
if(mode != class_c)
{
RxWindowTimer2.start(RECEIVE_DELAY2);
}
由上面可知,当处于CALSS_C模式的时候,传输完成便立马打开了RX2,接收超时时间是0,也就是持续处于接收状态,然后设定了定时器延时RECEIVE_DELAY1。当该定时器超时后跳转到OnRxWindow1TimerEvent函数
static void OnRxWindow1TimerEvent( void )
{
RxWindowTimer1.stop();
if(mode == class_c)
{
Radio.Standby( );
}
Rx1Window.open();
}
这里先判断如果是C模式则要将射频从RX2切换为待机模式,然后再打开RX1。该处的RX1是有超时时间的,也就是前文提到的接收前导码的时间,频率和上行频率相关。其实单单看RX1窗口,和CLASS_A是完全一样的,CLASS_C只是将RX1以外的所有空闲时隙都变成了RX2。
代码到这里分为两条路,其一当在RX1接收到数据后,进入OnRadioRxDone,当处理完接收后,通用是通过判断模式来开启RX2。其二是当RX1未接收到数据则进入OnRadioRxTimeout,在该函数中直接判断模式等于C则开启RX2,否则射频进入休眠。
到了这里回头看看时隙图就完全对的上了。这里补充一下关于两种模式的入网其实是完全一样的。都是在RX1窗口接收到入网应答。
网友评论