LoraWAN论坛

标题: lora 关于CAD检测 [打印本页]

作者: 陈浪    时间: 2017-5-25 15:15
标题: lora 关于CAD检测
大家好,CAD检测是如何检测,芯片资料关于这个介绍的比较少,应该如何配置这个检测?

作者: BeyondDream    时间: 2017-5-25 15:24
CAD(Channel Activity Detection)是LoRa侦听信道是否空闲的机制,它快速且节能。
作者: BeyondDream    时间: 2017-5-25 15:27
CAD的原理是:
(1)LoRa Radio启动接收,从信道中捕获一个信号;
(2)LoRa Radio分析该信号,是否为一个preamble symbol;
(3)根据结果,报告:信道是否为空。
作者: BeyondDream    时间: 2017-5-25 15:29
启动CAD的代码如下所示:
/**
  * @brief  Set LoRa to CAD mode.
  * @note  The period of CAD is about 800 us.
  * @param  wTimeout: the unit is millisecond, 0=don't care.
  * @retval  Result of invoked.
  *             -1=Error that radio is busy; 0=Set CAD OK.
  */
int8_t SX1278SetCAD(uint16_t wTimeout)
{
    if (RF_IDLE != s_tRadioState)
    {
        return -1; /* Error: radio is busy! */
    }

    SX1278SetSwPin2Rx(); /* CAD needs receive signal */

    /* Enable interrupt = CadDone + CadDetected */
    SX1278Write( 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
                         );
            
    /* DIO0<10> = CadDone */
    SX1278Write( REG_DIOMAPPING1,
                          (SX1278Read(REG_DIOMAPPING1) & RFLR_DIOMAPPING1_DIO0_MASK) |
                          RFLR_DIOMAPPING1_DIO0_10 );

    s_tRadioState = RF_CAD;

    /* Set LoRa to CAD mode */
    SX1278SetOpMode(RFLR_OPMODE_CAD);

    /* Start timer for timeout of CAD */
    if (wTimeout > 0)
    {
        SX1278StartTimer(wTimeout);
    }

    return 0;
}

作者: BeyondDream    时间: 2017-5-25 15:31
CAD检测完毕后,中断服务程序代码如下:
/**
  * @brief  Handler for IRQ of DIO_0.
  * @note  Insure callback functions are SMALL, FAST and SAFE that would been invoked by ISR.
  * @param  None
  * @retval  None
  */
void SX1278Dio0IrqHandler(void)
{
    uint8_t    byRegVal;

    SX1278StopTimer(); /* At first stop the timer */

    if (RF_CAD == s_tRadioState) /* CAD Done */
    {
        bool    bIsCadDetected;
               
        /* Clear Irq of "CadDone" */
        SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE);

        if ( (SX1278Read(REG_LR_IRQFLAGS) & RFLR_IRQFLAGS_CADDETECTED_MASK) ==
              RFLR_IRQFLAGS_CADDETECTED ) /* Is CadDetected */
        {
            /* Clear Irq of "CadDetected" */
            SX1278Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDETECTED);
        
            bIsCadDetected = TRUE;
        }
        else
        {
            bIsCadDetected = FALSE;
        }

        s_tRadioState = RF_IDLE;
               
        if (s_pstRadioEvents && s_pstRadioEvents->CadDone)
        {
            s_pstRadioEvents->CadDone(bIsCadDetected);
        }   
    }

    return;
}

作者: 陈浪    时间: 2017-6-8 09:03
BeyondDream 发表于 2017-5-25 15:31
CAD检测完毕后,中断服务程序代码如下:
/**
  * @brief  Handler for IRQ of DIO_0.

有好的程序文件吗?这个只有函数 没有.h文件 我有点看不明白 这个变量的意思
作者: 陈浪    时间: 2017-6-8 10:35
本帖最后由 陈浪 于 2017-6-8 10:40 编辑
陈浪 发表于 2017-6-8 09:03
有好的程序文件吗?这个只有函数 没有.h文件 我有点看不明白 这个变量的意思 ...

我按照这个设置后 DIO3 引脚就是一直都是高电平了!
作者: 陈浪    时间: 2017-6-8 10:41
陈浪 发表于 2017-6-8 10:35
我按照这个设置后 DIO3 引脚就是一直都是高电平了!

我设置IO0 为10 IO3 为00 则是一直都是低电平
IO0 为00 IO3为00 IO3 则一直都是高电平

void SX1276_CADMode( void )
{
        SX1276_LoRa_SetMode( LORA_MODE_STDBY );
    SX1276_WriteReg( REG_LR_IRQFLAGSMASK, DEF_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
                                                                                                                          );
        SX1276_LoRa_SetFreqHoppingPeriod( 0 );  //By the FreqHopping is disabled

        SX1276_WriteReg( REG_LR_DIOMAPPING1, DEF_LR_DIOMAPPING1 | RFLR_DIOMAPPING1_DIO0_10  //RxDone
                                                                                              | RFLR_DIOMAPPING1_DIO1_00  //RxTimeout
                                                                                              | RFLR_DIOMAPPING1_DIO2_00  //FhssChangeChannel
                                                                                              | RFLR_DIOMAPPING1_DIO3_00 );  //CadDone
        SX1276_WriteReg( REG_LR_DIOMAPPING2, DEF_LR_DIOMAPPING2 | RFLR_DIOMAPPING2_DIO4_00  //CadDetected
                                                                | RFLR_DIOMAPPING2_DIO5_00 );  //Mode Ready

    SX1276_SetSwitchRx( );
    SX1276_LoRa_SetMode( LORA_MODE_CAD );
}

作者: BeyondDream    时间: 2017-6-8 12:20
陈浪 发表于 2017-6-8 10:41
我设置IO0 为10 IO3 为00 则是一直都是低电平
IO0 为00 IO3为00 IO3 则一直都是高电平

对不起,这种“工程问题”,还得由您“细心调试”,我们很难有“建设性的意见”。。。
作者: sup999    时间: 2018-7-11 10:36
请问一下 CAD侦听的只是preamble symbol;然而preamble 只是占数据包的一小部分,那怎么控制模块可以正确侦听到preamble
作者: BeyondDream    时间: 2018-7-19 20:08
本帖最后由 BeyondDream 于 2022-12-22 09:26 编辑

请链接《lora 关于CAD检测》  http://lora.timeddd.com/forum.php?mod=viewthread&tid=7
作者: brook666    时间: 2018-7-26 10:31
sup999 发表于 2018-7-11 10:36
请问一下 CAD侦听的只是preamble symbol;然而preamble 只是占数据包的一小部分,那怎么控制模块可以正确侦 ...

可以通过配置寄存器设置preamble长度
作者: wangbing123    时间: 2022-12-21 15:33
sup999 发表于 2018-7-11 10:36
请问一下 CAD侦听的只是preamble symbol;然而preamble 只是占数据包的一小部分,那怎么控制模块可以正确侦 ...

请问解决了吗,2022年的我也遇到了这个问题
作者: 语铭    时间: 2023-4-16 16:46
sup999 发表于 2018-7-11 10:36
请问一下 CAD侦听的只是preamble symbol;然而preamble 只是占数据包的一小部分,那怎么控制模块可以正确侦 ...

配置发送方的前导码,增加发送方前导码的个数,或者CAD检测的前导码个数降低。我自己配置的发送方前导码个数至少大于检测方的2倍




欢迎光临 LoraWAN论坛 (http://lora.timeddd.com/) Powered by Discuz! X3.3