4. CAD(信道活动检测)与RSSI在同步中的作用

好,咱们进入第四讲。这一章我打算聊聊CAD和RSSI——这两个东西在LoRa同步里扮演的角色,说实话,比很多人想象的要重要得多。

我刚开始做LoRa项目时,觉得同步嘛,无非就是发个前导码,收端检测到就完事了。后来被现实狠狠教育了一顿——尤其是在低功耗场景下,你不可能让接收机一直开着。这时候,CAD就成了救命稻草。

4.1 CAD模式原理:到底在检测什么?

CAD,全称Channel Activity Detection,信道活动检测。说白了,就是让芯片以极低的功耗去“偷听”一下信道里有没有LoRa信号。

它的工作方式很有意思。芯片会打开接收链路,但只开很短的时间——大概相当于几个symbol的长度。在这段时间里,它会采样I/Q数据,然后跟已知的LoRa前导码特征做匹配。

匹配上了,就产生一个CAD中断,告诉你“嘿,有人在发数据”。没匹配上,芯片就继续睡大觉。

关键点:CAD检测的不是数据内容,而是前导码的“存在性”。它只关心有没有LoRa信号,不关心信号里是什么。

我习惯把CAD比作门卫。门卫不需要知道来访者是谁、来干嘛,只需要判断“有没有人来了”。这个判断过程要快、要省电。

具体到寄存器层面,CAD模式通过设置RegOpModeMode字段为0b1000来进入。芯片会自动完成采样、匹配、判决,然后退出。

// 进入CAD模式的典型配置
void enterCADMode() {
    // 设置模式为CAD
    writeRegister(RegOpMode, 0x8B);  // CAD模式 + LoRa + 低频
    // 等待CAD完成
    while((readRegister(RegIrqFlags) & 0x01) == 0);
    // 读取CAD检测结果
    uint8_t cadDetected = readRegister(RegIrqFlags) & 0x02;
    if(cadDetected) {
        // 检测到前导码,准备接收
        setMode(RX_CONTINUOUS);
    } else {
        // 没检测到,继续休眠
        setMode(SLEEP);
    }
}

嗯,这里要注意一点:CAD完成后,芯片会自动回到待机模式。你需要手动切换到接收模式才能收数据。这个细节我当年就踩过坑——检测到了,但忘了切模式,结果数据全丢了。

4.2 RSSI阈值设定:不是越大越好

RSSI,Received Signal Strength Indicator,接收信号强度指示。在CAD里,RSSI的作用是辅助判决——光有前导码特征匹配还不够,信号强度也得够。

为什么?因为噪声里也可能出现类似前导码的波形。尤其是在信噪比很低的时候,误检率会飙升。加一个RSSI阈值,相当于加了一道保险。

阈值设多少合适?我个人的经验是:

  • 对于室内环境: -100dBm 到 -110dBm 之间。室内干扰少,可以设低一点。
  • 对于室外环境: -115dBm 到 -120dBm。室外信号衰减大,阈值设高了会漏检。
  • 对于工业环境: -95dBm 到 -105dBm。工业干扰多,阈值设高一点减少误触发。
应用场景 推荐RSSI阈值 说明
室内/家庭 -105 dBm 干扰少,可接受较低信噪比
室外/城市 -115 dBm 信号衰减大,需降低阈值
工业/工厂 -100 dBm 电磁干扰多,提高阈值防误检
地下/隧道 -120 dBm 信号极弱,阈值必须放低

你可能会问:阈值设低了,误检怎么办?设高了,漏检怎么办?

这个问题没有标准答案。我一般会在产品里留一个配置接口,让现场工程师根据实际环境调。你想想看,一个抄表系统装在小区里,跟装在化工厂里,环境能一样吗?

小技巧:可以在产品启动时做一次RSSI扫描,统计背景噪声的平均值,然后动态设定阈值。比如:阈值 = 背景噪声 + 6dB。这样能自适应不同环境。

4.3 实际应用中的坑:我踩过的那些雷

这部分我得多说几句。CAD和RSSI看起来简单,实际用起来坑不少。我一个个说。

坑一:CAD检测到信号,但接收不到数据

我曾经在一个项目中遇到这个问题。CAD中断来了,我切到接收模式,结果等了半天没收到数据。查了半天,发现是前导码长度太短。

LoRa的前导码默认是12个symbol。CAD检测需要至少4-6个symbol来完成匹配。如果你把前导码设成8个symbol,CAD可能刚检测到,前导码就结束了,来不及切到接收模式。

解决办法:前导码长度不要低于10个symbol。我习惯用12个,稳妥。

坑二:RSSI阈值导致漏检

有一次在郊区做测试,设备老是丢包。我检查了所有配置,都没问题。后来用频谱仪一看,发现信号强度在-118dBm左右,而我的阈值设的是-110dBm。

说白了,阈值设得太高了,信号被“拒之门外”了。

解决办法:把阈值降到-120dBm,问题解决。但代价是误检率稍微上升了一点——不过在这个场景下可以接受。

坑三:CAD频繁误触发,功耗飙升

这个坑发生在工业现场。设备周围有大功率电机,启动时会产生强烈的电磁干扰。CAD被频繁触发,芯片不断从休眠切到接收模式,功耗直接翻了好几倍。

我当时的做法是:在CAD检测到信号后,不立即切到接收模式,而是再做一次RSSI确认。如果RSSI在短时间内跳变超过10dB,就认为是干扰,忽略这次CAD中断。

// 抗干扰的CAD处理流程
void onCADInterrupt() {
    if(cadDetected) {
        // 读取当前RSSI
        int16_t rssi1 = readRSSI();
        delay(1);  // 等1ms
        int16_t rssi2 = readRSSI();
        
        // 如果RSSI变化太大,认为是干扰
        if(abs(rssi2 - rssi1) > 10) {
            // 干扰,忽略
            setMode(SLEEP);
            return;
        }
        
        // 正常信号,准备接收
        setMode(RX_CONTINUOUS);
    }
}

警告:不要在生产环境中直接使用上述代码中的delay()。实际项目中应该用定时器或状态机来实现延时,避免阻塞主循环。

坑四:不同SF下CAD表现差异巨大

这个很多人不知道。SF7和SF12下,CAD的检测灵敏度是不一样的。SF12的symbol时间长,CAD有更多时间做匹配,所以灵敏度更高。SF7的symbol时间短,CAD容易漏检。

我做过实测:在相同RSSI下,SF12的CAD检测成功率比SF7高出约15%。

建议:如果你的系统使用自适应速率(ADR),在切换到低SF时,适当提高RSSI阈值,或者增加前导码长度来补偿。

4.4 总结一下

CAD和RSSI是LoRa同步中的两个重要工具。CAD负责“有没有信号”,RSSI负责“信号够不够强”。两者配合好了,能大幅降低功耗、提高可靠性。

但要注意:

  • 前导码长度别太短,至少10个symbol
  • RSSI阈值要根据环境动态调整
  • 工业现场要做好抗干扰处理
  • 不同SF下CAD表现不同,需要区别对待

下一章我会讲同步字(Sync Word)的配置和常见问题。那个坑也不少,尤其是多设备共存的时候。咱们下回见。