This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2500:CC2500接收器间歇性挂起

Guru**** 2392665 points
Other Parts Discussed in Thread: CC2500

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/614553/cc2500-cc2500-receiver-hangs-intermittently

器件型号:CC2500

您好!  

  我有一个包含一个发送器和两个接收器的设计。 我有一个奇怪的问题、如果发送器在远离接收器的情况下运行、在一定的距离内接收器都挂起、只有重启接收器才能使其再次工作。 如果我在 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输出引脚配置。 有关详细的伪寄存器说明,请参阅 SmartRFRegisteredStudio 用户手册。
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);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我同意您的意见、它与错误处理功能有关。 在下面的代码示例中、执行我最常使用的读取数据、它会检查"无数据"和"太多"数据、并且在这两种情况下都会清空 FIFO。  

    此致
    /TA

    /*********
    *@fn RADIO_READ
    *
    *@简介 将接收到的数据包读入缓冲
    区*
    
    **输入参数
    *
    *@param unsigned char * buf
    * unsigned short buf_len
    *
    输出参数
    *
    *@return void
    *
    
    **/
    
    int radio_read (unsigned char * buf、unsigned short * buf_len){
    unsigned char status;
    unsigned char pktLen;
    
    //读取 RX FIFO 中的字节数*/
    trx8BitRegAccess (radio_read_access|radio_burst_access、RXTES、&pktLen、1);
    pwktlen = pnytrnyten 和 pnytrnyten;pnytrn = pnytrnyten
    
    /*确保数据包大小合适,即1 -> buffer_size */
    if ((pktLen >0)&&(pktLen <=*buf_len){/*
    
    检索 FIFO 内容*/
    trx8RegAccess (nodio_read_access|radio_burst_access,RXFIFO,buf,pktlen*
    
    实际长度/pktlen*;
    
    
    /*检索 CRC 状态信息*/
    trx8BitRegAccess (radio_read_access+radio_burst_access、PKTSTATUS、&STATUS、1);
    
    }否则{
    
    //如果收发器返回的长度没有意义,请将其清空*/
    *buf_len = 0; // 0
    状态= 0;
    trxSpiCmdStrobe (RF_SFRX);//刷新 RXFIFO
    }
    
    //返回状态信息,CRC 确定或不确定*/
    返回(状态和 CRC_OK);
    } 

    int radio_read (unsigned char * buf、unsigned short * buf_len){unsigned char status;unsigned char pktLen;
    /*读取 RX FIFO 中的字节数*/ trx8BitRegAccess (radio_read_access|radio_burst_access、RXBYTES、&pktLen、1);pktLen = pktLen & NUM_RXBYTES;
    /*确保数据包大小合适,即1->buffer_size */ if (pktLen >0)&&(pktLen <=*buf_len){
    /*检索 FIFO 内容*/ trx8BitRegAccess (radio_read_access|radio_burst_access、RXFIFO、buf、pktLen);
    /*返回 FIFO 的实际长度*/*buf_len = pktLen;
    /*检索 CRC 状态信息*/ trx8BitRegAccess (radio_read_access+radio_burst_access、PKTSTATUS、&status、1);
    }否则{
    /*如果收发器返回的长度没有意义,请将其清除*/*buf_len = 0;                 // 0状态= 0;trxSpiCmdStrobe (RF_SFRX);         //刷新 RXFIFO }
    /*返回状态信息、CRC 确定或不确定*/返回(状态和 CRC_OK);}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的建议、并在我的编码中实现了同样的功能。

    我可以在调试时弄清楚、GDO0引脚在接收到数据包后不会失效、并且在程序挂起时一直保持高电平。 由于它此时挂起、我无法超越来检查数据包完整性。

    只有在接收信号很差的情况下,才会出现这种挂起问题,但如果我保持靠近(大约5-6米),它就不会挂起。

    空 RF_RxData (空)  

    {  

      unsigned char loop_f;  

    RF_WriteCommand (RF_SRX);//接收模式  

                                while (bit_in_clear (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

    如果((r_length > 0)&&(r_length <=3))

    {      

          for <r_length;loop_f++) (loop_f=0;loop  

          {  

    RF_ReadByte ();  

            RF_Data[LOOP_f]= SPI0缓冲器;

          }  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉、由于健康问题长时间沉默。

    回到问题,我已根据(勘误版本 E)将数据包长度寄存器修改为0x3D,现在程序在等待 GDO0活动时不会挂起,这是最初的问题。

    现在、接收不良时、程序挂起、等待 MISO 变低。  只要发送器的距离超过10米、就会始终出现问题。  

    是否需要为 MISO 和 GDO0引脚启用上拉电阻?