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丟包問題和接收數據一段時間後,接收不到數據的問題都解決了!

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