我想实现在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效验该怎么设置,谢谢!
Nutcracker:
你的包长是固定(Fixed Length Mode)的吗?
为啥一定要用 FEC?