目录
- 1 前言
- 2 实验验证疑问
- 2.1 SetRx的timeout模式和SetLoRaSymbNumTimeout
- 2.1.1 实验1
- 2.1.2 实验2
- 2.1.3 结论
- 2.2 SetRx的single与continuous模式和SetLoRaSymbNumTimeout
- 2.2.1 实验1
- 2.2.2 实验2
- 2.2.3 实验3
- 3 小结
1 前言
本章节介绍LoRa芯片的寄存器SetLoRaSymbNumTimeout,此寄存器的作用在datasheet中的解释是可降低误检测率,但经过了解及实验,使用SetRx的timeout功能也可以实现同样的效果,而且也更容易理解。相反,如果在代码中同时使用寄存器SetLoRaSymbNumTimeout和SetRx的timeout,其效果反而不好,本章将详细解释。
在此,我先将datasheet中对这个寄存器的描述放到这里,下图为SX126x的,其他系列芯片类似。
2 实验验证疑问
2.1 SetRx的timeout模式和SetLoRaSymbNumTimeout
Q:在使用SetRx的timeout模式时,会设定一个timeout值,在使用寄存器SetLoRaSymbNumTimeout时也会设定一个timeout值,是以哪个时间为准去产生timeout中断的?
2.1.1 实验1
程序中使用参数SF7,BW125,则单个symbol时间为1.02ms。将SymbNum设为200,则换算成时间为200 * 1.02ms = 204ms,程序如下:
sx126x_set_lora_symb_nb_timeout(context, 200 ); // 204ms
而将SetRx的timeout值设置为300ms,程序如下:
sx126x_set_rx( context, 300 ); // 300ms
运行程序,然后通过逻辑分析仪抓取中断引脚DIO上的波形,此时为RX timeout中断,每隔205ms,产生一次,如下图:
2.1.2 实验2
修改SetRx的timeout值,其他条件与实验1相同,然后再次测试。程序如下:
sx126x_set_lora_symb_nb_timeout(context, 200 ); // 204ms
sx126x_set_rx( context, 100 ); // 100ms
通过逻辑分析仪抓取中断引脚DIO上的波形,每隔100ms产生一次RX timeout中断,如下图:
2.1.3 结论
SetRx和SetLoRaSymbNumTimeout分别设定了一个timeout值,哪个值小,就以哪个值来产生timeout中断。
另外有一个小结论,就是SetLoRaSymbNumTimeout寄存器只需要在初始化的时候设置一遍即可,不用每产生一次timeout中断就设置一次。
2.2 SetRx的single与continuous模式和SetLoRaSymbNumTimeout
Q:如果使用SetRx的single或者continuous模式,并设置寄存器SetLoRaSymbNumTimeout,那么还会产生RX timeout中断吗?
2.2.1 实验1
使用RX的single模式,同时设置寄存器SetLoRaSymbNumTimeout。参数不变,使用SF7,BW125,单个symbol时间为1.02ms。将SymbNum设为200,换算成时间为200 * 1.02ms = 204ms。
sx126x_set_lora_symb_nb_timeout(context, 200 ); // 204ms
sx126x_set_rx( context, 0 ); // single mode
通过逻辑分析仪抓取中断引脚DIO上的波形,如下图,是每隔205ms产生一次timeout中断的。
2.2.2 实验2
使用RX的continuous模式,同时设置寄存器SetLoRaSymbNumTimeout。
sx126x_set_lora_symb_nb_timeout(context, 200 ); // 204ms
// continuous mode,但只在初始化时设置一次,正常来讲radio会一直处于RX状态
sx126x_set_rx_with_timeout_in_rtc_step(context, 0xFFFFFF);
实验现象是产生了一次timeout中断后,就停止运行了,猜测原因是radio此时已经由RX转到standby模式了,所以需要再进行一次实验。
2.2.3 实验3
将continuous模式当作timeout模式看待,在RX Timeout中断回调函数中重新设置RX,程序如下:
// continuous mode,在每次timeout中断函数中重设RX
sx126x_set_rx_with_timeout_in_rtc_step(context, 0xFFFFFF);
实验现象与实验1一致,每隔205ms产生一次timeout中断。
3 小结
- 简单理解,只要设置了寄存器SetLoRaSymbNumTimeout,RX由三种模式single、timeout和continuous变成了一种,即timeout模式。
- 当同时设置了寄存器SetLoRaSymbNumTimeout和SetRx的timeout模式,哪个设置的时间小,就以哪个时间产生timeout中断。
- datasheet中描述寄存器SetLoRaSymbNumTimeout的作用时,有这么一句话 … will wait for a total of SymbNum LoRa symbol to validate…。我分两种情况解析这句话,第一种假设当LoRa芯片检测到LoRa信号时,并且小于设定的SymbNum个数,那radio也会立马从检测模式进入信号解调模式。第二种是假设当LoRa芯片检测时间达到了设定的SymbNum个数时,还是没有检测到LoRa信号,就会产生timeout中断,那这与RX的timeout模式又没什么区别。所以综上而得出的结论是不建议使用寄存器SetLoRaSymbNumTimeout。