CAD应用参考¶
1.功能介绍¶
PAN3029/3060芯片支持CAD-IRQ中断,开启CAD功能并进入Rx模式后,芯片会检测信道中是否存在ChirpIOT™信号,如果存在则将CAD-IRQ置高,外部MCU可以通过在一定时间内检测CAD-IRQ信号是否拉高来判断信道中是否存在ChirpIOT™信号。
用户可以通过GPIO口读取CAD-IRQ信号,信道活跃检测流程如图1-1所示:
2.软件设计参考¶
2.1 软件设计流程¶
芯片初始化;
配置CAD初始化;
芯片进入接收模式;
观察CAD-IRQ信号。
2.2 软件设计验证¶
2.2.1 验证步骤¶
发送模组周期性发送数据包;
接收模组配置为接收模式;
使用示波器抓取接收端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所示:
根据结果显示,当发送模组发送数据包时,接收模组发生了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结果。
当不完整的preamble+payload信号到来时(发射端先进行数据发射,随后接收端在preamble时间段内打开了CAD检测),此时,用户可以在接收端通过GPIO口读取到CAD-IRQ信号,CAD检测引脚GPIO11的变化有两种情况:
1、如果preamble比较完整,内部含preamble数量大于配置的chirp_num时,GPIO11会被拉高preamble+payload的持续时间(preamble不完整,因此GPIO11整体拉高时间短于图3-1的情况)。此时,接收端可以产生正确的rxdone结果。
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。