您好!
我有一个包含一个发送器和两个接收器的设计。 我有一个奇怪的问题、如果发送器在远离接收器的情况下运行、在一定的距离内接收器都挂起、只有重启接收器才能使其再次工作。 如果我在 3或4 mts 范围内工作、则不会出现任何问题、如果发送器超出特定范围、则会出现问题。 它是否与从 FIFO 中清除垃圾数据有关?
测试环境为40 x 50英尺的开放式大厅。 发送器是用3.7V 电压操作的手持式电池器件、接收器用干净的 UPS 电源连接、并且没有其他电气/射频干扰。
我发送 的数据包大小为3字节、发送给两个接收器。
以下是我的射频设置。
我发送 的数据包大小为3字节、发送给两个接收器。
/* Chipcon */
/*产品= CC2500 */
/*芯片版本= E */
/*晶体精度= 10ppm */
/* X 射线频率= 26MHz */
/*射频输出功率= 0dBm */
/* RX 滤波器带宽= 541.666667 kHz */
/*相位= 1 */
/*数据速率= 249.938965 kbps */
/*调制=(7) MSK */
/*曼彻斯特启用=(0)曼彻斯特禁用*/
/*射频频率= 2432.999908MHz */
/*通道间隔= 199.951172kHz */
/*通道编号= 0 */
/*优化=灵敏度*/
/*同步模式=(3)检测到30/32同步字位*/
/* RX/TX 数据格式=(0)正常模式、使用 FIFO 进行 RX 和 TX *
/* CRC 运算=(1)启用 TX 中的 CRC 计算和 RX 中的 CRC 校验*
/*正向纠错=(0)禁用 FEC */
/*长度配置=(1)可变长度数据包、由同步字后第一个接收到的字节配置的数据包长度。 *
/* Packetlength = 255 */
/*前导码计数=(2) 4个字节*/
/*附加状态= 1 */
/*地址检查=是*/
/* FIFO 自动刷新= 0 */
/*器件地址= 2 */
/* GDO0信号选择=(6)在发送/接收同步字后生效、并在数据包结束时失效*/
/* GDO2信号选择=(11)串行时钟*/
const unsigned char rf_rfSettings[42]=
{
// CC2500寄存器数据
0x07、// FIFOTHR
0x07、// MCSM2
0x30、// MCSM1
0x87、// WOREVT1
0x6B、// WOREVT0
0xf8、// WORCTRL
0x7f、// ptest
0x3F、// AGCTEST
0x09、// FSCTRL1频率合成器控制。
0x00、// FSCTRL0频率合成器控制。
0x5D、// FREQ2频率控制字、高字节。
0x93、// FREQ1频率控制字、中间字节。
0xB1、// FREQ0频率控制字、低字节。
0x2D、// MDMCFG4调制解调器配置。
0x3B、// MDMCFG3调制解调器配置。
0x73、// MDMCFG2调制解调器配置。
0x22、// MDMCFG1调制解调器配置。
0xf8、// MDMCFG0调制解调器配置。
0x00、// CHANNR 通道编号。
0x01、// DEVIATN 调制解调器偏差设置(启用 FSK 调制时)。
0xB6、// FREND1前端 RX 配置。
0x10、// FREND0前端 RX 配置。
0x18、// MCSM0主无线电控制状态机配置。
0x1D、// FOCCFG 频率偏移补偿配置。
0x1C、// BSCFG 位同步配置。
0xC7、// AGCCTRL2 AGC 控制。
0x00、// AGCCTRL1 AGC 控制。
0xB2、// AGCCTRL0 AGC 控制。
0xEA、// FSCAL3频率合成器校准。
0x0A、// FSCAL2频率合成器校准。
0x00、// FSCAL1频率合成器校准。
0x11、// FSCAL0频率合成器校准。
0x59、// FSTEST 频率合成器校准。
0x88、// TEST2各种测试设置。
0x31、// TEST1各种测试设置。
0x0B、// TEST0各种测试设置。
0x0B、// IOCFG2 GDO2输出引脚配置。
0x06、// IOCFG0D GDO0输出引脚配置。 有关详细的伪寄存器说明,请参阅 SmartRFStudio 用户手册。
0x05、// PKTCTRL1数据包自动化控制。
0x05、// PKTCTRL0数据包自动化控制。
0x70、// ADDR 设备地址。
0xFF // PKTLEN 数据包长度。
};
void RF_TxData (unsigned char fifo_length、unsigned char device_address)
{
unsigned char loop_e;
unsigned char TX_LENGTH、TX_ADDRESS;
rf_WriteCommand (rf_sidle);
TX_LENGTH = fifo_length;
TX_ADDRES= DEVICE_ADDRESS;
CLR (PORTC、RF_CSn);
SPI0Buffer = RF_TXFIFO+0x40;
while (bit_in_set (PINB、RF_SO));
RF_WriteByte ();
SPI0Buffer = TX_LENGTH;
RF_WriteByte ();
SPI0Buffer = TX_ADDRESS;
RF_WriteByte ();
TX_LENGTH--;
对于(loop_e=0;loop_e <fifo_length;loop_e++)
{
SPI0Buffer = Tx_Data[LOOP_e];
RF_WriteByte ();
}
SETB (PORTC、RF_CSn);
RF_ReadStatus (RF_TXBYTES);
RF_WriteCommand (RF_STX);
while (bit_in_clear (PINC、RF_GDO0));
while (bit_in_set (PINC、RF_GDO0));
rf_WriteCommand (rf_sidle);
RF_WriteCommand (RF_SFTX);
}
接收人代码:
空 RF_RxData (空)
{
unsigned char loop_f;
RF_WriteCommand (RF_SRX);//接收模式
while (bit_in_clear (PINC、RF_GDO0));//等待数据
if (bit_in_set (PINC、RF_GDO0))//检查是否有数据
{
while (bit_in_set (PINC、RF_GDO0));//等待接收完成
RF_ReadStatus (RF_RXBYTES);
if (s_data!=0)
{
CLR (PORTC、RF_CSn);
SPI0Buffer = RF_RXFIFO+0xC0;
while (bit_in_set (PINB、RF_SO));
RF_WriteByte ();
RF_ReadByte ();
R_length = SPI0Buffer;//读取的第一个字节为 FIFO 长度
RF_ReadByte ();
R_address = SPI0Buffer;//读取第二个字节为地址
r_length--;//数据长度= FIFO 长度-1
for <r_length;loop_f++) (loop_f=0;loop
{
RF_ReadByte ();
RF_Data[LOOP_f]= SPI0缓冲器;
}
RF_ReadByte ();//读取 RSSI 数据
RSSI = SPI0缓冲器;
RF_ReadByte ();
CRC = SPI0缓冲器;
SETB (PORTC、RF_CSn);
IF (CRC 和0x80)
{
IF (((RF_Data[0]= 0xCC)&&(RF_Data[2]= 0x55))
{
如果(RF_Data[1]= 0x10)
{
TCCR1B = 0x00;
TMR_CNT = 0x00;
BAD_UP ();
MOT_FLAG = 0x01;
}
否则、如果(RF_Data[1]= 0x11)
{
TCCR1B = 0x00;
TMR_CNT = 0x00;
BAD_DOWN ();
MOT_FLAG = 0x01;
}
否则、如果((RF_Data[1]= 0xFF)&&(MOT_FLAG = 0x01))
{
BAD_STOP ();
MOT_FLAG = 0x00;
}
}
}
}
}
rf_WriteCommand (rf_sidle);
RF_WriteCommand (RF_SFRX);
}