最近在调433m cc1101无线模块,因为产品问题,规定了下数据包格式,采用了固定包长方式(3个字节的数据包)、取消crc校验、取消地址校验、接收方式采用中断方式、用GDO2管脚用作中断管脚,IOCFG2 寄存器写的 0x30,也就是IOCFG2.GDO2_CFG设置为0x00模式,接收缓存阈值设置0x00(4字节阈值),包长3字节+2字节状态寄存器=5字节>4字节阈值,肯定会触发中断,现在问题是发送端每隔0.5s发送一次数据,接收端触发中断就会接收数据,但是现在通过串口打印数据显示的接收数据中会不定期的接收到错误的字符,我在中断标志置位后,设定了判断条件,if((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)==5),也就是只有数据长度为5才可以执行接收,但是还是打印出错误字符,错误字符也是5个字节的数据,这是怎么回事呢?求TI技术员指导一些意见,谢谢!
函数寄存器配置:
const RF_SETTINGS rfSettings ={
0x00,
0x08, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x10, // FREQ2 Frequency control word, high byte.
0xA7, // FREQ1 Frequency control word, middle byte.
0x62, // FREQ0 Frequency control word, low byte.
0x5B, // MDMCFG4 Modem configuration.
0xF8, // MDMCFG3 Modem configuration.
0x03, // MDMCFG2 Modem configuration.4字节同步字
0x22, // MDMCFG1 Modem configuration.4字节前导
0xF8, // MDMCFG0 Modem configuration.
0x00, // CHANNR Channel number.
0x47, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0xB6, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end RX configuration.
0x18, // MCSM0 Main Radio Control State Machine configuration.
0x3c, //MCSM1 数据包接收后一直保持在接收模式
0x1D, // FOCCFG Frequency Offset Compensation Configuration.
0x1C, // BSCFG Bit synchronization Configuration.
0xC7, // AGCCTRL2 AGC control.
0x00, // AGCCTRL1 AGC control.
0xB2, // AGCCTRL0 AGC control.
0xEA, // FSCAL3 Frequency synthesizer calibration.
0x2A, // FSCAL2 Frequency synthesizer calibration.
0x00, // FSCAL1 Frequency synthesizer calibration.
0x11, // FSCAL0 Frequency synthesizer calibration.
0x59, // FSTEST Frequency synthesizer calibration.
0x81, // TEST2 Various test settings.
0x35, // TEST1 Various test settings.
0x09, // TEST0 Various test settings.
0x00, // IOCFG2 GDO2 output pin configuration.
0x06, // IOCFG0 GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.
0x04, // PKTCTRL1 Packet automation control.
0x00, // PKTCTRL0 Packet automation control.
0x40, //FIFOTHR 4字节阈值
0x00, // ADDR Device address.
0x03 // PKTLEN Packet length.
};
中断接收函数:
void EXTI4_15_IRQHandler(void)
{
//———————————GDO2———————————-
if(EXTI_GetITStatus(EXTI_Line11) != RESET) //GDO2
{ if(GPIO_ReadInputDataBit( GPIOB, GPIO_Pin_GDO2 )) {
RxFlag=1; 状态置位
} } EXTI_ClearITPendingBit(EXTI_Line11);//清中断
}
while循环里边接收:
if(RxFlag==1)
{
RxFlag=0;
value=halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO;
if(value==5)
{
halSpiReadBurstReg(CCxxx0_RXFIFO, RxBuf,3 );
// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);
LED1_Toggle();
USART_SendString(USART2,RxBuf,3);
USART_SendString(USART2,"\r\n",2);
} }
读取到的错误数据:
xiao feng:
昨天又测试,把发送端,设置成发送完一帧数据还是继续保持在发送模式,不是之前的发送完后进入空闲模式,经过一晚的测试,数据没有出现错误码问题,这又是怎么回事呢,请TI工作人员,给以技术指导。。。
xiao feng:
回复 xiao feng:
没有人来回答吗。。。
Barbara Wu:
回复 xiao feng:
可以用第三个CC1101板子连接Smartrf Studio放在接收状态,看在接收端收到错误数据的时候,第三个CC1101是否也有接收到同样的错误的数据。
如果是,多半是发送端问题。如果不是则多半是接收端问题。
xiao feng:
回复 Barbara Wu:
你好,我测试了,两个板子同时输出串口显示,乱码不是同一时间出现,应该不是发送端问题,另外,我在测试过程中发现一个问题,我发送端断电没有发送,但是接收端会过一段时间(不固定),串口就输出一条乱码,这说明GDO2确实触发中断了,这是什么问题造成的呢?
Barbara Wu:
回复 xiao feng:
有可能是干扰信号进来的。
可以用第三块CC1101接smartrf studio放在Continuous RX状态看周围的环境噪声
如果有TI CC1101的EVM板,可以做对比测试。如果效果比EVM差很多,很有可能是硬件设计引入的问题
建议在接收的时候使用CRC校验提高收包的准确性