CC1101长时间处于接收状态会死机?
有朋友遇到过这样的问题么!接收端的CC1101长时间处于接收状态会死机。刚刚上电的时候正常接收。等待接收数据(发射端没有发送数据)大概2~4个小时后再由发送端发送数据,接收端接收不到数据,如果软件复位一次,又能够正常工作,但是再长时间等待接收数据还是会死机。
有高手帮忙看看程序!
//-----------------------------------------------------------
//输入:无
//输出:无
//功能:配置CC1100的寄存器
//----------------------------------------------------------
void F_SetCC1100(void)
{
F_SpiWriteReg(CC1100_Addr_FSCTRL0, CC1100_Set_FSCTRL2);//额外加的
// Write register settings
F_SpiWriteReg(CC1100_Addr_FSCTRL1, CC1100_Set_FSCTRL1);
F_SpiWriteReg(CC1100_Addr_FSCTRL0, CC1100_Set_FSCTRL0);
F_SpiWriteReg(CC1100_Addr_FREQ2, CC1100_Set_FREQ2);
F_SpiWriteReg(CC1100_Addr_FREQ1, CC1100_Set_FREQ1);
F_SpiWriteReg(CC1100_Addr_FREQ0, CC1100_Set_FREQ0);
F_SpiWriteReg(CC1100_Addr_MDMCFG4, CC1100_Set_MDMCFG4);
F_SpiWriteReg(CC1100_Addr_MDMCFG3, CC1100_Set_MDMCFG3);
F_SpiWriteReg(CC1100_Addr_MDMCFG2, CC1100_Set_MDMCFG2);
F_SpiWriteReg(CC1100_Addr_MDMCFG1, CC1100_Set_MDMCFG1);
F_SpiWriteReg(CC1100_Addr_MDMCFG0, CC1100_Set_MDMCFG0);
F_SpiWriteReg(CC1100_Addr_CHANNR, CC1100_Set_CHANNR);
F_SpiWriteReg(CC1100_Addr_DEVIATN, CC1100_Set_DEVIATN);
F_SpiWriteReg(CC1100_Addr_FREND1, CC1100_Set_FREND1);
F_SpiWriteReg(CC1100_Addr_FREND0, CC1100_Set_FREND0);
F_SpiWriteReg(CC1100_Addr_MCSM0 , CC1100_Set_MCSM0 );
F_SpiWriteReg(CC1100_Addr_FOCCFG, CC1100_Set_FOCCFG);
F_SpiWriteReg(CC1100_Addr_BSCFG, CC1100_Set_BSCFG);
F_SpiWriteReg(CC1100_Addr_AGCCTRL2, CC1100_Set_AGCCTRL2);
F_SpiWriteReg(CC1100_Addr_AGCCTRL1, CC1100_Set_AGCCTRL1);
F_SpiWriteReg(CC1100_Addr_AGCCTRL0, CC1100_Set_AGCCTRL0);
F_SpiWriteReg(CC1100_Addr_FSCAL3, CC1100_Set_FSCAL3);
F_SpiWriteReg(CC1100_Addr_FSCAL2, CC1100_Set_FSCAL2);
F_SpiWriteReg(CC1100_Addr_FSCAL1, CC1100_Set_FSCAL1);
F_SpiWriteReg(CC1100_Addr_FSCAL0, CC1100_Set_FSCAL0);
F_SpiWriteReg(CC1100_Addr_FSTEST, CC1100_Set_FSTEST);
F_SpiWriteReg(CC1100_Addr_TEST2, CC1100_Set_TEST2);
F_SpiWriteReg(CC1100_Addr_TEST1, CC1100_Set_TEST1);
F_SpiWriteReg(CC1100_Addr_TEST0, CC1100_Set_TEST0);
F_SpiWriteReg(CC1100_Addr_IOCFG2, CC1100_Set_IOCFG2);
F_SpiWriteReg(CC1100_Addr_IOCFG0, CC1100_Set_IOCFG0);
F_SpiWriteReg(CC1100_Addr_PKTCTRL1, CC1100_Set_PKTCTRL1);
F_SpiWriteReg(CC1100_Addr_PKTCTRL0, CC1100_Set_PKTCTRL0);
F_SpiWriteReg(CC1100_Addr_ADDR, CC1100_Set_ADDR);
F_SpiWriteReg(CC1100_Addr_PKTLEN, CC1100_Set_PKTLEN);
F_Delay(2);
F_SpiStrobe(CC1100_CMD_SCAL);
F_Delay(2);
F_SpiStrobe(CC1100_CMD_SFTX);
F_Delay(2);
F_SpiStrobe(CC1100_CMD_SFRX);
F_Delay(2);
F_SpiStrobe(CC1100_CMD_SIDLE);
F_Delay(4);
F_SpiStrobe(CC1100_CMD_SRX);
F_Delay(4);
}
//----------------------------------------------------------
//输入:无
//输出:接收一组数据的个数
//功能: CC1100接收一组数据
//----------------------------------------------------------
uint8 F_ReceCC1100(void)
{
uint8 temp1,temp2;
R_CC1100Cnt=0;
while(P_CC1100GetDO0())
{
if(R_CC1100Cnt>10)
{
return(0);
}
}
temp1=F_SpiReadStatus(CC1100_CMD_RXBYTES);
if(temp1&CC1100_BYTES_RXFIFO)
{
temp2=F_SpiReadReg(CC1100_Addr_RXFIFO);
if(temp2<16)
//如果所要的有效数据长度小于等于接收到的数据包的长度
{
F_SpiReadBurstReg(CC1100_Addr_RXFIFO,0,temp2);
F_SpiReadBurstReg(CC1100_Addr_RXFIFO,temp2,2);
F_SpiStrobe(CC1100_CMD_SFRX);
F_Delay(4);
F_SpiStrobe(CC1100_CMD_SRX);
F_Delay(4);
return((R_SpiRWReg)&CC1100_CRC_OK);
}
else
{
F_SpiStrobe(CC1100_CMD_SFRX);
F_Delay(4);
F_SpiStrobe(CC1100_CMD_SRX);
F_Delay(4);
return(0);
}
}
else
{
return(0);
}
} 自己先顶一个! 没人解答么?
找芯片的代理问,芯片本来就是这样的,建议每隔一段时间软件复位一次,虽然不满意这个答案但是也还算能够解决卡死的问题。
自己留下这个回复,希望给后面掉坑里面的人一点帮助! 代理商说的是正确的,你仔细看PDF里面关于AGC的部分就知道了。。。 对这个问题表示关注,我同事也遇到这个问题~ mark一下。 这个问题是要注意 不是死机了,是你的自动退出接收状态了, 我也碰到过这个问题!可能在你接收完成了,还没有来的急判断下一个接受,下一个接接收已经完成了,所以退出接收状态了,定时的将CC1101转入接收状态就不会出现所谓的死机了! mark{:smile:} 解决问题了,谢谢大家 sunzhuojun 发表于 2012-8-28 15:55 static/image/common/back.gif
解决问题了,谢谢大家
你好,最终你是如何解决这个问题的?我现在也遇到一样的现象,要软件再发进入SLIDE,然后再进入接收才行 顶楼主,很高尚的技术人。。。 hxg791206 发表于 2012-6-27 12:16 static/image/common/back.gif
我也碰到过这个问题!可能在你接收完成了,还没有来的急判断下一个接受,下一个接接收已经完成了,所以退出 ...
你好,我的接收函数里就有进入接收状态的命令,可为什么有时候接收数据一会就接收不到了,重启才能接收呢?
我在main函数里,while循环里调用halRfReceivePacket接收数据
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
{
INT8U status;
INT8U packetLength;
INT8U address;
INT8U i=(*length)*4;// 具体多少要根据datarate和length来决定
halSpiStrobe(CCxxx0_SRX); //进入接收状态
//delay(5);
//while (!GDO1);
//while (GDO1);
Delay(5);
while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_GD0) )//while (GDO0)
{
Delay(2);
--i;
if(i<1)
return 0;
}
if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
{
packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
if(packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度
{
halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
*length = packetLength; //把接收数据长度的修改为当前数据的长度
// Read the 2 appended status bytes (status = RSSI, status = LQI)
halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2); //读出CRC校验位
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return (status & CRC_OK); //如果校验成功返回接收成功
}
else
{
*length = packetLength;
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return 0;
}
}
else
return 0;
} 楼主 我现在在用cc1101调试了好几天 就是收不到数据能不能把你的程序发给我看一下谢谢啦!!!403115153@qq.com sunzhuojun 发表于 2012-8-28 15:55
解决问题了,谢谢大家
请问你的问题是怎么解决的? cc1101 晶振要定时的校准,特别是长时间的接收。 楼上说的对,CC1101的时钟部分要定时校准,否则会发生偏移而收不到数据。
你也可以读一下芯片状态看看芯片是否确实在接收状态。 仔细看CC1101的手册就都解决了!要有耐心
页:
[1]