目录
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丢包问题和接收数据一段时间后,接收不到数据的问题都解决了!