提前中断应用参考¶
2软件设计参考¶
2.1软件设计流程¶
1、芯片初始化;
2、配置射频参数;
3、将芯片配置为提前中断模式,通过寄存器设置提前中断起始字节和包头长度(包头长度也称为计数器门限值)。起始字节是指提前中断从第几个字节开始检查,包头长度是指提前中断检查多少个字节的数据(包头长度只支持8字节或16字节,分别使用PLHD_LEN8/PLHD_LEN16表示);
4、芯片进入接收模式;
5、芯片接收数据,内部计数器开始计数,收到一个字节加1,直至计数器达到包头长度之后,芯片会产生提前中断信号,供软件读取;
6、软件判断是否为自己想要的数据,如果是,则继续往下读取,如果不是,则停止读取。
2.2 软件设计验证¶
2.2.1 验证步骤¶
1、发送模组周期性发送100字节数据包,前30字节数据为
2、接收模组配置提前中断模式,并设置从第5字节开始,共检查16字节数据;
3、当产生提前中断信号时,将提前中断得到的数据打印出来;
4、继续往下接收,将本帧数据全部打印出来;
5、通过串口助手查看打印结果。
2.2.2 SDK示例¶
Main.c参考代码:
ret = rf_init();
if(ret != OK)
{
printf(" RF Init Fail");
while(1);
}
rf_set_default_para();
rf_set_plhd_rx_on(5,PLHD_LEN16);
rf_enter_continous_rx();
while (1)
{
rf_irq_process();
if(rf_get_recv_flag() == RADIO_FLAG_PLHDRXDONE)
{
rf_set_recv_flag(RADIO_FLAG_IDLE);
printf("###Plhd Rev :##\r\n");
for(i = 0; i < RxDoneParams.PlhdSize; i++)
{
printf("0x%02x ", RxDoneParams.PlhdPayload[i]);
}
printf("\r\n");
}
if(rf_get_recv_flag() == RADIO_FLAG_RXDONE)
{
rf_set_recv_flag(RADIO_FLAG_IDLE);
printf("Rx : SNR: %f ,RSSI: %f \r\n", RxDoneParams.Snr, RxDoneParams.Rssi);
for(i = 0; i < RxDoneParams.Size; i++)
{
printf("0x%02x ", RxDoneParams.Payload[i]);
}
printf("\r\n");
cnt ++;
printf("###Rx cnt %d##\r\n", cnt);
}
if((rf_get_recv_flag() == RADIO_FLAG_RXTIMEOUT) || (rf_get_recv_flag() == RADIO_FLAG_RXERR))
{
rf_set_recv_flag(RADIO_FLAG_IDLE);
printf("Rxerr\r\n");
}
}
Radio.c参考代码:
void rf_irq_process(void)函数中
if(irq & REG_IRQ_RX_PLHD_DONE)
{
RxDoneParams.PlhdSize = rf_get_plhd_len();
rf_set_recv_flag(RADIO_FLAG_PLHDRXDONE);
RxDoneParams.PlhdSize =rf_plhd_receive(RxDoneParams.PlhdPayload,RxDoneParams.PlhdSize);
}
示例代码配置了提前中断模式,并设置从第5字节开始,共检查16字节数据。接收到提前中断信号后,主函数中选择将提前中断接收到的内容打印出来,并继续接收;随后模组会再产生一个接收中断信号,主函数中再将完整接收到的数据内容打印出来。
如果需要提前中止接收,只需要在接收到提前中断信号后执行rf_set_refresh();即可。即:
if(rf_get_recv_flag() == RADIO_FLAG_PLHDRXDONE)
{
rf_set_recv_flag(RADIO_FLAG_IDLE);
printf("###Plhd Rev :##\r\n");
for(i = 0; i < RxDoneParams.PlhdSize; i++)
{
printf("0x%02x ", RxDoneParams.PlhdPayload[i]);
}
printf("\r\n");
rf_set_refresh();//stop it
}
2.3 逻辑分析仪抓取¶
2.3.1 验证步骤¶
1、发送模组周期性发送数据包;
2、接收模组分别使用提前中断接收模式和正常接收模式进行接收,两种模式交替进行接收;
3、使用逻辑分析仪Channel8抓取发送端开始和结束信号,Channel1抓取接收端信号。
2.4 注意事项¶
提前中断功能只支持读取两种数据长度,即8字节/16字节,分别使用PLHD_LEN8/PLHD_LEN16表示。不可以使用自定义参数。
提前中断功能获取数据时,使用rf_plhd_receive()接口函数,与普通数据包rf_receive()接口函数不同,其内部FIFO地址不同。
2.5 临界情况测试¶
对于临界情况,参考如下测试结果(SF7,BW500K):
发送端配置 |
接收端配置 |
接收结果 |
||
---|---|---|---|---|
发送端发包长度 |
提前中断起始字节 |
提前中断包头长度 |
提前中断结果 |
接收中断结果 |
100字节 |
分别设置80/81/82 |
PLHD_LEN16 |
均有 |
均有 |
100字节 |
分别设置83/84 |
PLHD_LEN16 |
均有且数据内容不可靠 |
均有 |
100字节 |
分别设置85~100 |
PLHD_LEN16 |
均无 |
均有 |
可以看到,提前中断功能的设计初衷是在数据内容的包头位置,做提前检测,如果包头数据内容不符合需求,就可以提前退出接收状态,以达到节省接收时间的目的。在临界值附近,提前中断功能的软件应用价值不大,临界值附近不推荐使用此功能。