CC1101丢包和工作一段时间,接收不到数据的问题

目录

ReadMe:

问题:

背景描述:

发送端程序:

接收端程序:

问题研究过程:

最终程序:

发送端程序:

接收端程序:


ReadMe:

"问题研究过程"为我调程序中遇到问题,调试程序,又出现新的问题的过程,比较啰嗦,想快点看能不能解决自己问题的,可以只看"问题"、以及最后的"最终程序"即可。

问题:

在使用CC1101中,遇到两个问题:

1.接收数据时,接收一帧数据,丢一帧数据,特别规律

2.开始接收正常,过一段时间,就接收不到数据了,发送端程序是正常运行的,接收端程序也没死机,就是接收不到数据,重新上电又可以接收

背景描述:

硬件:STM32F429、CC1101(发送端和接收端均是这俩,一模一样,只是程序不一样)

发送端程序:

int main(void)
{
	u8 value[8] = {0};
	
	u8 rxBuffer[8] = {0x00, 0x00, 0x12, 0x34, 0x55, 0xAA, 0x5A, 0xA5};
	u8 leng = 0;
	
    HAL_Init();                     //初始化HAL库
    Stm32_Clock_Init(360,25,2,8);   //时钟初始化为180MHz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART

    LED_Init();                     //初始化LED 

	CC1101_PowerUp();
	CC1101_SettingsReg();
	
	/* 发送端程序 */
	
    while(1)
    {
		LED0 = !LED0;
		delay_ms(500);
		
		rxBuffer[1] += 1;    //起计数作用,用来查看接收端是否有丢包
		
		printf("发送的数据:0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\r\n", 
		rxBuffer[0], rxBuffer[1], rxBuffer[2], rxBuffer[3], rxBuffer[4], rxBuffer[5],     
        rxBuffer[6], rxBuffer[7]);
		
		CC1101_SendPacket(rxBuffer, 8);        //CC1101发送
		delay_ms(500);

    } 
}	

接收端程序:

int main(void)
{
	u8 value[8] = {0};
	
	u8 rxBuffer[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0xAA, 0x5A, 0xA5};
	u8 leng = 0;
	
    HAL_Init();                     //初始化HAL库 
    Stm32_Clock_Init(360,25,2,8);   //时钟初始化为180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART

    LED_Init();                     //初始化LED 

	CC1101_PowerUp();
	CC1101_SettingsReg();
	
	delay_ms(5000);
	printf("Init OK\r\n");
	
	/* 接收端程序 */
	
    while(1)
    {
		LED0 = !LED0;
		delay_ms(100);

		if(CC1101_ReceivePacket(rxBuffer, &leng))
		{
			printf("接收数据:0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\r\n", 
				rxBuffer[0], rxBuffer[1], rxBuffer[2], rxBuffer[3], rxBuffer[4], 
                rxBuffer[5], rxBuffer[6], rxBuffer[7]);

			delay_ms(100);
			
			memset(rxBuffer, 0, leng);

		}

    } 
}

问题研究过程:

1.上述的程序,在运行中出现了问题:数据接收一帧丢一帧,如下图所示

2.查找网上的资料,虽然有好多在说CC1101丢包的问题,但是好像没找到和我这种情况类似的问题的解决方法。之后考虑是不是发送太频繁了,导致接收端没能处理完上一帧数据,于是将1秒发一帧数据,改为3秒发一帧数据,结果仍然是收一帧,丢一帧!

于是考虑将CC1101重新初始化,看能不能有点效果,所以先采用了,收到一帧数据我就重新将CC1101初始化一次。将接收端程序中while死循环部分改为下图所示:

while(1)
    {
		LED0 = !LED0;
		delay_ms(100);

		if(CC1101_ReceivePacket(rxBuffer, &leng))
		{
		
			//HAL_UART_Transmit(&UART1_Handler,(uint8_t*)rxBuffer, leng ,100);
			printf("接收数据:0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\r\n", 
				rxBuffer[0], rxBuffer[1], rxBuffer[2], rxBuffer[3], rxBuffer[4], 
                rxBuffer[5], rxBuffer[6], rxBuffer[7]);

			delay_ms(100);
			
			memset(rxBuffer, 0, leng);
			
			CC1101_PowerUp();
			CC1101_SettingsReg();
		}
	
    } 

3.中间隔一帧数据就丢一帧数据的问题解决了!但是,好景不长,一会之后,接收不到数据了,死机了。

4.继续百度查找问题,发现好像这种死机问题还挺正常,大家都有遇到!

上述详情请点击蓝字跳转

5.上图提到要看PDF里的AGC部分,但是看了半天CC1101手册里的AGC部分也没看出个所以然。但是上图也说了,建议隔一段时间软件复位一次,对比自己程序,我自己刚才也重新初始化了呀!难道复位才行?于是重新将程序修改为下图:

while(1)
    {
		LED0 = !LED0;
		delay_ms(100);

		if(CC1101_ReceivePacket(rxBuffer, &leng))
		{
		
			//HAL_UART_Transmit(&UART1_Handler,(uint8_t*)rxBuffer, leng ,100);
			printf("接收数据:0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\r\n", 
				rxBuffer[0], rxBuffer[1], rxBuffer[2], rxBuffer[3], rxBuffer[4], 
                rxBuffer[5], rxBuffer[6], rxBuffer[7]);

			delay_ms(100);
			
			memset(rxBuffer, 0, leng);
			
            /* 新添加的程序 */
			CC1101_Reset();
			CC1101_SettingsReg();
		}
	
    } 

然后神奇的事情发生了,不仅没有丢包,而且发送端一秒发送一帧,接收端长时间的接收,都没有死机!

但是还存在一个问题,当长时间发送端没有发送数据时,有时候突然发送端发送数据,接收端收不到数据,所以,程序继续修改为下面的最终版,即每隔一段时间,没有收到数据的话,就重新复位一下CC1101。

最终程序:

发送端程序:

int main(void)
{
	u8 value[8] = {0};
	
	u8 rxBuffer[8] = {0x00, 0x00, 0x12, 0x34, 0x55, 0xAA, 0x5A, 0xA5};
	u8 leng = 0;
	
    HAL_Init();                     //初始化HAL库
    Stm32_Clock_Init(360,25,2,8);   //时钟初始化为180MHz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART

    LED_Init();                     //初始化LED 

	CC1101_PowerUp();
	CC1101_SettingsReg();
	
	/* 发送端程序 */
	
    while(1)
    {
		LED0 = !LED0;
		delay_ms(500);
		
		rxBuffer[1] += 1;    //起计数作用,用来查看接收端是否有丢包
		
		printf("发送的数据:0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\r\n", 
		rxBuffer[0], rxBuffer[1], rxBuffer[2], rxBuffer[3], rxBuffer[4], rxBuffer[5],     
        rxBuffer[6], rxBuffer[7]);
		
		CC1101_SendPacket(rxBuffer, 8);        //CC1101发送
		delay_ms(500);

    } 
}	

接收端程序:

在while死循环中,接收到数据之后,增加了CC1101的复位过程。

int main(void)
{
	u8 value[8] = {0};
	
	u8 rxBuffer[8] = {0x00, 0x00, 0x12, 0x34, 0x55, 0xAA, 0x5A, 0xA5};
	u8 leng = 0;
    u8 num = 0;
	
    HAL_Init();                     //初始化HAL库
    Stm32_Clock_Init(360,25,2,8);   //时钟初始化为180MHz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART

    LED_Init();                     //初始化LED 

	CC1101_PowerUp();
	CC1101_SettingsReg();
	
	/* 接收端程序 */
	
    while(1)
    {
		LED0 = !LED0;
		delay_ms(100);
        num++;

		if(CC1101_ReceivePacket(rxBuffer, &leng))
		{
		
			//HAL_UART_Transmit(&UART1_Handler,(uint8_t*)rxBuffer, leng ,100);
			printf("接收数据:0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\r\n", 
				rxBuffer[0], rxBuffer[1], rxBuffer[2], rxBuffer[3], rxBuffer[4], 
                rxBuffer[5], rxBuffer[6], rxBuffer[7]);

			delay_ms(100);
			
			memset(rxBuffer, 0, leng);
			
			CC1101_Reset();
			CC1101_SettingsReg();
            num = 0;
		}

        if(num == 10)
        {
            CC1101_Reset();
            CC1101_SettingsReg();
            num = 0;
        }
	
    }
}	

 

CC1101丢包问题和接收数据一段时间后,接收不到数据的问题都解决了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章