实现一收多发的功能,由一个AP节点和多个ED节点组成(期望能承受50个左右的ED节点),AP只接收,ED只发送,未进行组网,为了避免多个ED节点同时发送的相互冲突问题,采用了TX-IF-CCA的机制,通过检测GDO2的电平状态判断当前信道是否空闲。相关的寄存器如下:
{ CC1101_IOCFG0, 0x06 },
{ CC1101_FIFOTHR, 0x47 },
{ CC1101_PKTCTRL0, 0x05 },
{ CC1101_CHANNR, 0x96 },
{ CC1101_FSCTRL1, 0x06 },
{ CC1101_FREQ2, 0x0F },
{ CC1101_FREQ1, 0x62 },
{ CC1101_FREQ0, 0x76 },
{ CC1101_MDMCFG4, 0xF6 },
{ CC1101_MDMCFG3, 0x43 },
{ 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, 0x10 },//开启CCA,发送或接收完成切换为IDLE模式
{ CC1101_IOCFG2, 0x0E },//配置gpo2,用于检测CCA
{ CC1101_AGCCTRL1, 0x40 },
{ CC1101_AGCCTRL2, 0x07 },//42dB
检测GDO2的代码
CC1101_Set_Mode( RX_MODE );//进入接收模式,CCA检测
while(CC1101_GET_GDO2_STATUS( ))
{
i++;
drv_delay_ms( 5 );//超时
if(i == 200)
{
i=0;
break;
} }
CC1101_Tx_Packet( message, MSG_LENTH );
AP和ED距离十米,ED发送的数据只有16个字节,1s发送一次,正常的一对一的发送和接收都是没问题的,发送频率调高到100ms发送一次丢包率都在可接受的范围内。
但是有三个发送设备的时候就会出现大概有10%以上的丢包,通过示波器看GDO2电平,每一次CCA检测GDO2都会有将近300ms的高电平时间。
这么长的高电平时间正常吗,逻辑分析仪抓到的发送和接收都是几个ms的特别短的时间,GDO2电平时间可设置吗?还是是我寄存器配置的有问题吗?
Felix ZF:
关于CCA的功能描述,可以阅读datasheet的17.5 Clear Channel Assessment (CCA) 章节详细了解。
与CCA相关的寄存器包含GDOx_CFG, MCSM1中的CCA_MODE,和AGCCTRL1中的CARRIER_SENSE_REL_THR、CARRIER_SENSE_ABS_THR
lingfei wang:
感谢 Felix ZF的回复,
{ CC1101_IOCFG2, 0x0E },//配置gpo2,用于检测CCA
{ CC1101_MCSM1, 0x30 },//开启CCA,发送或接收完成切换为IDLE模式
{ CC1101_AGCCTRL2, 0xC7 },//42dB
{ CC1101_AGCCTRL1, 0x00 },//由SmartRF计算得出
{ CC1101_AGCCTRL0, 0xB2 },//由SmartRF计算得出
根据我的寄存器设置,GDO2在检测到信号强度高于42dB时会出现高电平。通过示波器看到GDO2高电平时间过长的问题已经解决了,把速率调高到100kBaud之后即可。
但是再测试丢包率的时候还是很高,不知道为什么?
观察到发送一个数据时,看到示波器上的GDO2电平不是一个持续的电平,而是由前后两个高电平组成的(这种情况应该不正常吧?不知道丢包率过高是不是由于这个原因。还望指导)。
把前导码长度由原来的4字节改为24字节,前面的高电平时间跟着也变长,把发送的数据变长,后一个高电平时间同样跟着变长。经过这样的检测,推测前面的高电平是前导码的发送信号,后一个高电平是数据的发送信号。
为什么发送前导码跟数据之间会有一个间隔,是这两个发送信号之间的强度变小了,还是根本就是变成了0 ,这个间隔时间能不能消除?
lingfei wang:
回复 Felix ZF:
感谢 Felix ZF的回复,
{ CC1101_IOCFG2, 0x0E },//配置gpo2,用于检测CCA
{ CC1101_MCSM1, 0x30 },//开启CCA,发送或接收完成切换为IDLE模式
{ CC1101_AGCCTRL2, 0xC7 },//42dB
{ CC1101_AGCCTRL1, 0x00 },//由SmartRF计算得出
{ CC1101_AGCCTRL0, 0xB2 },//由SmartRF计算得出
根据我的寄存器设置,GDO2在检测到信号强度高于42dB时会出现高电平。通过示波器看到GDO2高电平时间过长的问题已经解决了,把速率调高到100kBaud之后即可。
但是再测试丢包率的时候还是很高,不知道为什么?
观察到发送一个数据时,看到示波器上的GDO2电平不是一个持续的电平,而是由前后两个高电平组成的(这种情况应该不正常吧?不知道丢包率过高是不是由于这个原因。还望指导)。
把前导码长度由原来的4字节改为24字节,前面的高电平时间跟着也变长,把发送的数据变长,后一个高电平时间同样跟着变长。经过这样的检测,推测前面的高电平是前导码的发送信号,后一个高电平是数据的发送信号。
为什么发送前导码跟数据之间会有一个间隔,是这两个发送信号之间的强度变小了,还是根本就是变成了0 ,这个间隔时间能不能消除?