在做基于CC1101的通信,8台发射对应8台接收,想使用CCA来做防碰撞设置,在网上找了相关的CCA代码。在测试CCA的时候出现以下情况:开启一台设备在循环发送载波,占用信道。另一台设备使用CCA功能用来检测,IOCFG2寄存器设置0x0E,能检测到信道被占用,GDO2变为高电平,但是当关闭发送载波的设备后,做CCA检测的这台设备GDO2不能变为低电平,这是为什么???
下面是相关寄存器配置,数据率2.4kBaud,使用的SmartRF配置好的数值
{ CC1101_IOCFG0,0x06 },{ CC1101_FIFOTHR,0x47 },{ CC1101_PKTCTRL0,0x05 },{ CC1101_CHANNR,0x00 }, //433M{ CC1101_FSCTRL1,0x06 },{ CC1101_FREQ2,0x10 },{ CC1101_FREQ1,0xB1 },{ CC1101_FREQ0,0x3B },{ CC1101_MDMCFG4,0xF6 },{ CC1101_MDMCFG3,0x83 },{ CC1101_MDMCFG2,0x13 },{ CC1101_DEVIATN,0x15 },{ CC1101_MCSM0,0x18 },{ CC1101_FOCCFG,0x16 },{ CC1101_WORCTRL,0xFB },{ CC1101_FSCAL3,0xE9 },{ CC1101_FSCAL2,0x2A },{ CC1101_FSCAL1,0x00 },{ CC1101_FSCAL0,0x1F },{ CC1101_TEST2,0x81 },{ CC1101_TEST1,0x35 },{ CC1101_MCSM1,0x3F },{ CC1101_IOCFG2, 0x0E },{ CC1101_AGCCTRL1, 0x40 },{ CC1101_AGCCTRL2, 0x17 },{ CC1101_FREND0, 0x10 }
下面是使用CCA检测的主函数:
int main(void) { drv_button_init(); //LED初始化 drv_led_init( ); //SPI初始化 drv_spi_init( ); //CC1101初始化 CC1101_Init( ); while( 1 ) { CC1101_Write_Cmd(CC1101_SIDLE);CC1101_Write_Cmd( CC1101_SRX ); drv_delay_ms(10); if( CC1101_GET_GDO2_STATUS( ) == 1 ) { led_red_on(); drv_delay_ms(50); } CC1101_Clear_RxBuffer(); CC1101_Write_Cmd(CC1101_SIDLE);CC1101_Write_Cmd( CC1101_SRX ); drv_delay_ms(10); if( CC1101_GET_GDO2_STATUS( ) == 0 ) { led_red_off(); } CC1101_Clear_RxBuffer();} }
Viki Shi:
IOCFG2设置为0x0E是载波模式,CCA是0x09
Carrier sense. High if RSSI level is above threshold. Cleared when entering IDLE mode
Clear channel assessment. High when RSSI level is below threshold (dependent on the current CCA_MODE setting)
Cunsheng Li:
回复 Viki Shi:
我改为了0x09,CCA还是不能用。现在我不论发不发送载波,GDO2都为高电平
Viki Shi:
回复 Cunsheng Li:
CCA_MODE设置为01试试,就是MCSM1寄存器
Cunsheng Li:
回复 Viki Shi:
还是不可以,还是存在上面的问题,信道不空闲时是高电平,信道切为空闲时它的GDO2引脚就不输出低电平了。