当前文档版本为 v0.8.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

CAD应用参考

1.功能介绍

PAN3029/3060芯片支持CAD-IRQ中断,开启CAD功能并进入Rx模式后,芯片会检测信道中是否存在ChirpIOT™信号,如果存在则将CAD-IRQ置高,外部MCU可以通过在一定时间内检测CAD-IRQ信号是否拉高来判断信道中是否存在ChirpIOT™信号。

用户可以通过GPIO口读取CAD-IRQ信号,信道活跃检测流程如图1-1所示:

img

图1-1 信道活跃检测(CAD)

2.软件设计参考

2.1 软件设计流程

  1. 芯片初始化;

  2. 配置CAD初始化;

  3. 芯片进入接收模式;

  4. 观察CAD-IRQ信号。

2.2 软件设计验证

2.2.1 验证步骤

  1. 发送模组周期性发送数据包;

  2. 接收模组配置为接收模式;

  3. 使用示波器抓取接收端CAD-IRQ信号。

2.2.2 SDK示例

参考代码:

ret = rf_init();
if(ret != OK)
{
  printf("  RF Init Fail");
  while(1);
}
rf_set_default_para();
rf_set_cad(CAD_DETECT_THRESHOLD_10, CAD_DETECT_NUMBER_3);//使能CAD模式,并设置Chirp-IoT信号阈值及preamble有效信号个数
rf_enter_continous_rx();
while (1);//等待示波器检测CAD-IRQ信号

示例代码配置了CAD初始化,配置GPIO11作为CAD检测IO,随后进入接收模式。

发送模组周期性发送数据包(数据包preamble+payload的持续时间约42ms),用逻辑分析仪抓取接收模组GPIO11波形,观察逻辑分析仪结果。

2.2.3 验证结果

示波器抓取结果如图2-1所示:

img

图2-1 示波器抓取结果(CAD)

根据结果显示,当发送模组发送数据包时,接收模组发生了CAD-IRQ,CAD检测引脚GPIO11被拉高约42ms,维持一个完整ChirpIOT™数据包的时间长度。

3 注意事项

3.1 关于CAD影响芯片的接收灵敏度

CAD功能初始化时,修改了芯片的接收信号检测阈值和CAD 有效信号个数阈值,设置不同的接收阈值和有效信号个数,会影响芯片的接收灵敏度,并可能存在CAD误触发的情况。

uint32_t rf_cad_on(uint8_t threshold, uint8_t chirps)
{
    rf_set_gpio_output(11);
    RF_ASSERT(rf_reset_spec_page_reg_bits(PAGE0_SEL, 0x5E, BIT6));
    RF_ASSERT(rf_write_spec_page_reg_bits(PAGE1_SEL, 0x25, chirps, BIT0|BIT1));
    RF_ASSERT(rf_write_spec_page_reg(PAGE1_SEL, 0x0f, threshold));
    return OK;
}

接收阈值的设置,需要修改rf_cad_on(uint8_t threshold, uint8_t chirps)函数的传参,修改接收阈值对接收灵敏度及误触发概率的影响如下(实验数据在办公室日常应用场景测试):

表 3-1 接收阈值设置

接收阈值

有效信号个数

误触发概率

接收灵敏度

0x0a

0x03

较低(数小时一次)

不影响

0x10

0x03

极低(24小时0次)

恶化1dBm

用户在使用CAD功能时,需要根据应用场景选择修改rf_cad_on(uint8_t threshold, uint8_t chirps)函数中的传参,在使用完CAD功能后,建议调用rf_set_cad_off()函数,rf_set_cad_off()函数可以关闭CAD功能并将接收阈值恢复。

3.2 关于SDK及演示系统板

SDK中提供了CAD功能所需的接口函数,CAD-IRQ被触发时,检测引脚GPIO11会被拉高。GPIO11接入演示系统板MCU的PA09。

#define	GPIO_PIN_CAD	Pin09
#define	GPIO_PORT_CAD	PortA
#define  CHECK_CAD()  PORT_GetBit(GPIO_PORT_CAD, GPIO_PIN_CAD);

3.3 关于CAD使用方法

PAN3029可以对preamble和payload进行CAD检测。

3.3.1 对preamble检查方式

当完整的preamble+payload信号到来时,用户可以在接收端通过GPIO口读取到CAD-IRQ信号,CAD检测引脚GPIO11被拉高,拉高时间为preamble+payload的持续时间。此时,接收端可以产生正确的rxdone结果。

img

图3-1 逻分抓取结果(完整preamble)

当不完整的preamble+payload信号到来时(发射端先进行数据发射,随后接收端在preamble时间段内打开了CAD检测),此时,用户可以在接收端通过GPIO口读取到CAD-IRQ信号,CAD检测引脚GPIO11的变化有两种情况:

1、如果preamble比较完整,内部含preamble数量大于配置的chirp_num时,GPIO11会被拉高preamble+payload的持续时间(preamble不完整,因此GPIO11整体拉高时间短于图3-1的情况)。此时,接收端可以产生正确的rxdone结果。

img

图3-2逻分抓取结果(较完整preamble)

2、如果preamble不完整,内部含preamble数量小于配置的chirp_num时,GPIO11会一直处于低电平。此时,接收端不会产生正确的接收结果。

3、只有payload信号时,GPIO11会一直处于低电平。此时,接收端不会产生正确的接收结果。

2.3.2 软件应用参考

CAD检测的时间以单个chirp持续时间作为单位计算,单个chirp持续时间为2^SF/BW(SF为扩频因子,BW为带宽,BW单位为Hz,时间单位为秒)。

下面给出两个CAD典型应用的软件设计参考:

uint32_t rf_get_chirp_time(uint8_t bw, uint8_t sf)
{
    const uint32_t bw_table[4] = {62500, 125000, 250000, 500000};

    if(bw < BW_62_5K || bw > BW_500K)
    {
        return 0;
    }

    return (1000000 / bw_table[bw - BW_62_5K]) * (1 << sf);
}/*return us*/

1、CAD功能被用于发射前的信道检测,以保证当前信道空闲,随后进行数据发射,避免无线信号碰撞干扰,提高通信成功率。

CAD IO中断处理函数,将CAD事件置位为ACTIVE。

void Cad_Irq_Callback(void)
{
  cad_tx_timeout_flag = MAC_EVT_TX_CAD_ACTIVE;
}

CAD定时器超时回调函数,将CAD事件置位为TIMEOUT。

void cad_tx_timeout_cb(void)
{
  stimer_stop(&stimer_txcad_event);
  cad_tx_timeout_flag |= MAC_EVT_TX_CAD_TIMEOUT;
}

CAD检测函数,配置进入CAD接收状态,将CAD事件置位为NONE,并打开定时器。

uint32_t rf_cad_detect_start(void)
{
    uint32_t bw, sf;
    uint32_t one_chirp_time;
    bw = rf_get_bw();
    sf = rf_get_sf();
    one_chirp_time = rf_get_chirp_time(bw, sf); // us
    RF_ASSERT(rf_cad_on(CAD_DETECT_THRESHOLD_10, CAD_DETECT_NUMBER_3));
    cad_tx_detect_flag = MAC_EVT_TX_CAD_NONE;
    RF_ASSERT(rf_enter_continous_rx())
    SET_TIMER_MS(one_chirp_time * 7 / 1000 + 1);
    return OK;
}

等待并检测CAD事件即可。如果为TIMEOUT则可以立即发射,如果为ACTIVE则需要退避并等待一段时间再发射,再次发射之前需要再按上述步骤检测一次信道状态。

2、CAD功能被用于接收前的信道检测,用来检查当前信道是否存在有用信号,随后决定,继续接收,或是关闭接收,进入待机或休眠状态,以降低功耗。

bool check_cad_rx_inactive(uint32_t one_chirp_time)
{
    rf_delay_us(one_chirp_time * 7);
    rf_delay_us(360); // state machine start up time after enter rx state

    if (CHECK_CAD() != 1)
    {
        rf_set_mode(RF_MODE_STB3);
        return LEVEL_INACTIVE;
    }

    return LEVEL_ACTIVE;
}

根据返回值判断CAD检测结果,如果为LEVEL_ACTIVE则继续接收,等待接收结果;如果为LEVEL_INACTIVE,可以立即关闭RX,以降低功耗。

//主函数可以使用如下逻辑调用check_cad_rx_inactive

//主函数可以使用如下逻辑调用check_cad_rx_inactive
while (1)
{ 
		if(check_cad_rx_inactive(one_chirp_time) == LEVEL_ACTIVE)
		{//检测到信号,等待接收完成
}else{
//未检测到信号,不需要继续接收,可进行休眠处理		
}
}

关于check_cad_rx_inactive和check_cad_tx_inactive的软件应用示例可以参考TX DEMO和RX DEMO。