robot77 发表于 2012-4-12 15:43:59

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);
        }
}

robot77 发表于 2012-4-12 15:45:27

自己先顶一个!

robot77 发表于 2012-4-15 18:08:26

没人解答么?
找芯片的代理问,芯片本来就是这样的,建议每隔一段时间软件复位一次,虽然不满意这个答案但是也还算能够解决卡死的问题。
自己留下这个回复,希望给后面掉坑里面的人一点帮助!

Niandet 发表于 2012-4-15 18:15:09

代理商说的是正确的,你仔细看PDF里面关于AGC的部分就知道了。。。

wuguoyan 发表于 2012-4-15 18:22:44

对这个问题表示关注,我同事也遇到这个问题~

movenight 发表于 2012-6-27 09:08:56

mark一下。 这个问题是要注意

hxg791206 发表于 2012-6-27 12:15:06

不是死机了,是你的自动退出接收状态了,

hxg791206 发表于 2012-6-27 12:16:44

我也碰到过这个问题!可能在你接收完成了,还没有来的急判断下一个接受,下一个接接收已经完成了,所以退出接收状态了,定时的将CC1101转入接收状态就不会出现所谓的死机了!

carsio 发表于 2012-7-28 08:48:23

mark{:smile:}

sunzhuojun 发表于 2012-8-28 15:55:14

解决问题了,谢谢大家

johnny_dxj 发表于 2012-9-6 10:17:19

sunzhuojun 发表于 2012-8-28 15:55 static/image/common/back.gif
解决问题了,谢谢大家

你好,最终你是如何解决这个问题的?我现在也遇到一样的现象,要软件再发进入SLIDE,然后再进入接收才行

HZKJ 发表于 2012-9-22 19:59:31

顶楼主,很高尚的技术人。。。

Contiki 发表于 2012-11-19 11:02:37

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;
}

a111204508_c 发表于 2013-5-21 17:53:12

楼主 我现在在用cc1101调试了好几天 就是收不到数据能不能把你的程序发给我看一下谢谢啦!!!403115153@qq.com

丢丢时光机 发表于 2014-6-8 22:53:19

sunzhuojun 发表于 2012-8-28 15:55
解决问题了,谢谢大家

请问你的问题是怎么解决的?

sunzhuojun 发表于 2014-6-9 10:05:07

cc1101 晶振要定时的校准,特别是长时间的接收。

yht0312 发表于 2014-6-9 16:02:19

楼上说的对,CC1101的时钟部分要定时校准,否则会发生偏移而收不到数据。
你也可以读一下芯片状态看看芯片是否确实在接收状态。

yht0312 发表于 2014-6-9 16:02:48

仔细看CC1101的手册就都解决了!要有耐心
页: [1]
查看完整版本: CC1101长时间处于接收状态会死机?