一、前言
前面在无线节点的空中唤醒技术解析中由浅入深地对空中唤醒技术做了讲解,讲地非常好,建议大家多看几遍(卧槽,谁又砸砖头!)。这篇笔记将讲LoRa节点的空中唤醒具体应用。
我正在学习LoRa和LoRaWAN,基本按照 官方资料+梳理解析+相关源码 的方式来记录笔记,相信对不少同行者有所帮助,可点此查看帖子LoRa学习笔记_汇总。
本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/
二、官方资料
1. CAD 模式介绍
When in CAD mode, the device will check a given channel to detect LoRa preamble signal
CAD的功能的主要介绍是在4.1.6. LoRaTM Modem State Machine Sequences 中的 Channel Activity Detection 小节。在前文的空中唤醒的原理中,已经提到CAD功能是LoRa调制的一个特色,比普通RSSI检测方式要强大得多。
随着扩频调制技术的应用,人们在确定可能低于接收机底噪声的信号是否已经使用信道时,面临重重挑战。这种情况下,使用RSSI无疑是行不通的。为了解决这个问题,可使用信道活动检测器(CAD)来检测其他LoRaTM信号。图11显示了CAD的流程:
2. 操作原理介绍
信道活动检测模式旨在以尽可能高的功耗效率检测无线信道上的LoRa前导码。在CAD模式下, SX1276/77/78快速扫描频段,以检测LoRa数据包前导码。
在CAD过程中,将会执行以下操作:
- PLL被锁定。
- 无线接收机从信道获取数据的LoRa前导码符号。在此期间的电流消耗对应指定的Rx模式电流。
- 无线接收机及PLL被关闭,调制解调器数字处理开始执行。
- 调制解调器搜索芯片所获取样本与理想前导码波形之间的关联关系。建立这样的关联关系所需的时间仅略小于一个符号周期。在此期间,电流消耗大幅度减少。
- 完成计算后,调制解调器产生CadDone中断信号。如果关联成功,则会同时产生CadDetected信号。
- 芯片恢复到待机模式。
- 如果发现前导码,清除中断,然后将芯片设置为Rx单一或连续模式,从而开始接收数据。
信道活动检测时长取决于使用的LoRa调制设置。下图针对特定配置显示了典型CAD检测时长,该时长为LoRa符号周期的倍数。 CAD检测时间内, 芯片在(2SF+32)/BW秒中处于接收模式,其余时间则处于低功耗状态。
3. DIO 映射
CAD事件等可以利用DIO来通知给其他MCU,手册上给了映射方式。
Table 18 DIO Mapping LoRaTM Mode,其中有 CadDone 事件。
Operating Mode | DIOx Mapping | DIO5 | DIO4 | DIO3 | DIO2 | DIO1 | DIO0 |
ALL | 00 | ModeReady | CadDetected | CadDone | FhssChangeChannel | RxTimeout | RxDone |
01 | ClkOut | PllLock | ValidHeader | FhssChangeChannel | FhssChangeChannel | TxDone | |
10 | ClkOut | PllLock | PayloadCrcError | FhssChangeChannel | CadDetected | CadDone | |
11 | - | - | - | - | - | - |
4. 其他注意事项
注意:7.3章节的前导码检测等示例是FSK方式下才有的,因此这里不再讨论。
三、源码解析
1. DIO映射管脚及中断初始化
DioIrqHandler *DioIrq[] = { SX1276OnDio0Irq, SX1276OnDio1Irq,
SX1276OnDio2Irq, SX1276OnDio3Irq,
SX1276OnDio4Irq, NULL };
SX1276IoIrqInit( DioIrq );
2. 启动CAD
调用SX1276StartCad来启动CAD,配置DIO映射。
void SX1276StartCad( void )
{
switch( SX1276.Settings.Modem )
{
case MODEM_FSK:
{
}
break;
case MODEM_LORA:
{
SX1276Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
RFLR_IRQFLAGS_RXDONE |
RFLR_IRQFLAGS_PAYLOADCRCERROR |
RFLR_IRQFLAGS_VALIDHEADER |
RFLR_IRQFLAGS_TXDONE |
//RFLR_IRQFLAGS_CADDONE |
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL // |
//RFLR_IRQFLAGS_CADDETECTED
);
// DIO3=CADDone
SX1276Write( REG_DIOMAPPING1, ( SX1276Read( REG_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_00 );
SX1276.Settings.State = RF_CAD;
SX1276SetOpMode( RFLR_OPMODE_CAD );
}
break;
default:
break;
}
}
3. CAD事件处理
void SX1276OnDio3Irq( void )
{
switch( SX1276.Settings.Modem )
{
case MODEM_FSK:
break;
case MODEM_LORA:
if( ( SX1276Read( REG_LR_IRQFLAGS ) & RFLR_IRQFLAGS_CADDETECTED ) == RFLR_IRQFLAGS_CADDETECTED )
{
// Clear Irq
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDETECTED | RFLR_IRQFLAGS_CADDONE );
if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
{
RadioEvents->CadDone( true );
}
}
else
{
// Clear Irq
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
{
RadioEvents->CadDone( false );
}
}
break;
default:
break;
}
}
4. 周期性休眠唤醒
应用上,程序要实现周期性的休眠唤醒。目前LoRaWAN协议栈默认的一个流程是每5秒周期性发数据,尚未使用Cad。因此需要大家再摸索下。不过大体流程是这样:在唤醒初期进行CAD,之后进行相应的唤醒或者休眠等待下一次唤醒。
End
原文:http://blog.csdn.net/iotisan/article/details/56011689