实现一收多发的功能,由一个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电平时间可设置吗?还是是我寄存器配置的有问题吗?