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