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

CAD应用参考

1.功能介绍

PAN3029芯片支持CAD-IRQ中断,开启CAD功能并进入Rx模式后,PAN3029会检测信道中是否存在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 PAN3029_cad_en(uint8_t threshold, uint8_t chirps)
{  
  PAN3029_set_gpio_output(MODULE_GPIO_CAD_IRQ);
  if(PAN3029_write_spec_page_reg(PAGE1_SEL, 0x0f, threshold) != OK)
  {
    return FAIL;
  }
  if(PAN3029_write_spec_page_reg(PAGE0_SEL, 0x5e, chirp_num) != OK)
  {
    return FAIL;
  }
  return OK;
}

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

表 3-1 接收阈值设置

接收阈值

有效信号个数

误触发概率

接收灵敏度

0x0a

0x03

较低(数小时一次)

不影响

0x10

0x03

极低(24小时0次)

恶化1dBm

用户在使用CAD功能时,需要根据应用场景选择修改PAN3029_cad_en(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典型应用的软件设计参考:

/*return us*/
uint32_t get_chirp_time(uint32_t bw,uint32_t sf)
{
  switch(bw)
  {
    case 6:
      bw = 62500;
      break;
    case 7:
      bw = 125000;
      break;
    case 8:
      bw = 250000;
      break;
    case 9:
      bw = 500000;
      break;
    default:
    return FAIL;
  }
  return (1000000/bw)*(1<<sf);
}

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 check_cad_tx_inactive(void)
{
  uint32_t bw,sf;
  rf_get_para(RF_PARA_TYPE_BW, &bw);
  rf_get_para(RF_PARA_TYPE_SF, &sf);
  uint32_t one_chirp_time = get_chirp_time(bw,sf);
  if(rf_set_cad(CAD_DETECT_THRESHOLD_10, CAD_DETECT_NUMBER_3)!= OK)
  {
    return FAIL;
  }
  cad_tx_timeout_flag = MAC_EVT_TX_CAD_NONE;
  if(rf_enter_continous_rx() != OK)
  {
    return FAIL;
  }
  SET_TIMER_MS(one_chirp_time*7/1000 + 1);
  //对于毫秒延时函数,需避免出现0ms,可以在整除的基础上增加1ms
  return OK;
}

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

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

uint32_t check_cad_rx_inactive(void)
{
  uint8_t i = 0;
  rf_delay_us(one_chirp_time*7);
  //首次检测需要额外延时360us,这是RF启动RX所需要的耗时
  rf_delay_us(360);
  if(CHECK_CAD()!= 1)
  {
  //可以选择关闭RX,以降低功耗。这里是测量(程序切换耗时)的起点
    rf_set_mode(PAN3029_MODE_STB3);
    return LEVEL_INACTIVE;
  }		
  return LEVEL_ACTIVE;
}

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

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

while (1)
{ 
  if(check_cad_rx_inactive(one_chirp_time) == LEVEL_ACTIVE)
  {
    //接收处理
  }else
  {
    rf_set_mode(PAN3029_MODE_STB3);
    rf_set_para(RF_PARA_TYPE_FREQ, freq);
    rf_enter_continous_rx();//这里是测量(程序切换耗时)的终点		
  }
}

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