微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > CC1101开启FEC纠错接收数据出错求助

CC1101开启FEC纠错接收数据出错求助

时间:12-23 整理:3721RD 点击:

我想实现在CC1101内部实现FEC纠错现实是收发端一旦开启FEC_EN=1 数据就乱了。不知道是怎么回事,望有经验的朋友指点一下。谢谢了

寄存器配置:收发配置相同

/*******************************配置CC1101寄存器*****************************/
void CC1101_SYS1(void){

//CC1101_CMD(CC1101_SIDLE);          //强制进入IDLE状态避免发射频率出错
CC1101_TXREG(CC1101_IOCFG2,0x0B);        //GDO2 Output Pin Configuration
//CC1101_TXREG(CC1101_IOCFG1,0x2E);        //GDO1 Output Pin Configuration
CC1101_TXREG(CC1101_IOCFG0,0x06);        //*GDO0 Output Pin Configuration

CC1101_TXREG(CC1101_FSCTRL1,0x08);
CC1101_TXREG(CC1101_FSCTRL0,0x00);
CC1101_TXREG(CC1101_CHANNR,0x00);
CC1101_TXREG(CC1101_FSTEST,0x59);

CC1101_TXREG(CC1101_FIFOTHR,0x47);      //RX* FIFO and TX FIFO Thresholds
CC1101_TXREG(CC1101_FREQ2,0X10);        //*发射/接收频率设置
CC1101_TXREG(CC1101_FREQ1,0XA7);        //*发射/接收频率设置  450
CC1101_TXREG(CC1101_FREQ0,0X62);        //*发射/接收频率设置 ///433.699646

CC1101_TXREG(CC1101_MDMCFG2,0X09);     // *曼彻斯特编码开    接收灵敏度设置,调制格式设置,曼彻斯特编码/解码设置,复合同步字限定符模式设置。
CC1101_TXREG(CC1101_MDMCFG4,0X5B);      //数据速率
CC1101_TXREG(CC1101_MDMCFG3,0XF8);      //数据速率
CC1101_TXREG(CC1101_MDMCFG0,0XF8);     //信道间隔
CC1101_TXREG(CC1101_MDMCFG1,0XA2);     //数据包前向纠错设置,最低前导字节数设置,2位指数信道间隔

/*   此寄存器关闭FEC能正常接收数据/


CC1101_TXREG(CC1101_FREND1,0XB6);       //前端 RX 配置
CC1101_TXREG(CC1101_FREND0,0X17);       //前端 TX 配置 PA 功率设置
CC1101_TXREG(CC1101_FSCAL3, 0XEA);      //*频率合成器校准配置,充电泵校准设置,频率合成器校准结果寄存器
CC1101_TXREG(CC1101_FSCAL2, 0X2A);      //*频率合成器校准结果寄存器
CC1101_TXREG(CC1101_FSCAL1, 0X00);      //*频率合成器校准结果寄存器
CC1101_TXREG(CC1101_FSCAL0, 0X1F);      //*频率合成器校准控制
CC1101_TXREG(CC1101_TEST2,0x81);        //*Various Test Settings
CC1101_TXREG(CC1101_TEST1,0x35);        //*Various Test Settings
CC1101_TXREG(CC1101_TEST0,0x09);        //*Various Test Settings
CC1101_TXREG(CC1101_ADDR, 0X00);        //器件地址
CC1101_TXREG(CC1101_PKTLEN, 0X0F);      //数据包长度
//CC1101_TXREG(CC1101_SYNC1, 0X00);      //同步字设置高字节
//CC1101_TXREG(CC1101_SYNC0, 0X00);      //同步字设置低字节
CC1101_TXREG(CC1101_PKTCTRL1, 0X04);    //前导质量评估器阈值设置,自动RX FIFO 刷新设置,信号质量及强度 RSSI和LQI位设置,接收数据包的地址校验配置控制
//CC1101_TXREG(CC1101_PKTCTRL0, 0X05);    //可变数据包模式   *打开/关闭数据白化,RX和TX数据的格式,TX模式下的CRC校准和RX模式下的CRC校验,数据包长度配置
CC1101_TXREG(CC1101_PKTCTRL0, 0X44);    //固定数据包模式*打开/关闭数据白化,RX和TX数据的格式,TX模式下的CRC校准和RX模式下的CRC校验,数据包长度配置
CC1101_TXREG(CC1101_AGCCTRL0, 0XB2);    //设置振幅偏差的滞后等级,信道滤波器采样,控制何时锁定AGC增益设置,设置信道滤波器振幅的平均长度
CC1101_TXREG(CC1101_AGCCTRL1, 0X00);    //LNA增益先降低顺序设置,载波监听相对阈值设置,设置置位载波监听的绝对 RSSI 阈值
CC1101_TXREG(CC1101_AGCCTRL2, 0XC7);    //允许的DVGA设置,最大允许 LNA+LNA2 增益,信道滤波器平均振幅设置
CC1101_TXREG(CC1101_BSCFG,0X1C);        //同步字前的时钟恢复积分增益设置,同步字前和时钟恢复环路比例增益,同步字后的时钟恢复积分增益,同步字后的时钟恢复比例增益,数据速率偏移饱和(最大数据速率差异)设置
CC1101_TXREG(CC1101_FOCCFG,0X1D);       //频率补偿开关设置,同步字前的频率补偿,同步字以后的频率补偿,频率偏移补偿算法的饱和点设置

CC1101_TXREG(CC1101_DEVIATN, 0X47);     //调制解调器偏差设置

CC1101_TXREG(CC1101_MCSM1,0X30);        //,空闲信道指示,完成数据包接收后的下一状态,完成数据包发送后的下一状态
CC1101_TXREG(CC1101_MCSM0,0X18);        //无线校准设置,6位纹波计数器设置,引脚无线控制选项,强制 XOSC 在SLEEP状态保持开启设置


CC1101_TXBURSTREG(CC1101_PATABLE,PaTabel,8); //AP功率设置
}

/*******************************CC1101发送数据*****************************/
void CC1101_RF_TX(unsigned char*A1,unsigned char A2){   //发送的数据,数据个数
   CC1101_TXREG(CC1101_TXFIFO,A2);                        //写入发送字节数
   CC1101_TXBURSTREG(CC1101_TXFIFO,A1,A2);                //连续写配置寄存器
   CC1101_CMD(CC1101_STX);                                //开启发送模式开始传送数据
   while(!CC1101_GDO0);                                   //等待GDO0要设置 - >同步传输
   while(CC1101_GDO0);                                    //等待GDO0清零 - >包结束
   CC1101_CMD(CC1101_SFTX);                               //刷新TX开始传送数据
}

/*****************************CC1101接收程序*******************************/
unsigned char CC1101_RX(unsigned char A2){        //A2,数据有效位数
  unsigned char D1[2];
  unsigned char a1;
  unsigned char i=256;          //延时等待
  CC1101_CMD(CC1101_SRX);  //进入接收状态
  yanshi_us(10);
  while (CC1101_GDO0){          //查询接收数据标志
    yanshi_us(10);
    --i;
    if(i<1) return 0;           //超时退出循环
    }
  if ((CC1101_RX_Stutas(CC1101_RXBYTES)&BYTES_IN_RXFIFO)){    //如果接的字节数不为0   0x7F
    a1 = CC1101_RX_REG(CC1101_RXFIFO);                        //读出第一个字节,此字节为该帧数据长度
    if (a1 <= A2){                                         //如果接收到的数据等于设置的数据长度
      CC1101_RX_SRAM(a1);                                     //连续读出接收的数据到SRAM
      CC1101_RX_BURSTREG(CC1101_RXFIFO,D1,2);                 //读出CRC校验位
      CC1101_CMD(CC1101_SFRX);                            //清洗接收缓冲区
      return (D1[1]&CRC_OK);                         //如果校验成功返回接收成功
      }
      else{
        CC1101_CMD(CC1101_SFRX);  //清洗接收缓冲区
        return 0;
        }
    }
  else
  return 0;
}

望高手指点使用FEC效验该怎么设置,谢谢!

你的包长是固定(Fixed Length Mode)的吗?

为啥一定要用 FEC?

上一篇:端对端通信
下一篇:CC2511无法更新hex

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top