搜索
bottom↓
回复: 17

CC1101长时间处于接收状态会死机?

[复制链接]

出0入0汤圆

发表于 2012-4-12 15:43:59 | 显示全部楼层 |阅读模式
有朋友遇到过这样的问题么!
接收端的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[temp2+1])&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);
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-4-12 15:45:27 | 显示全部楼层
自己先顶一个!

出0入0汤圆

 楼主| 发表于 2012-4-15 18:08:26 | 显示全部楼层
没人解答么?
找芯片的代理问,芯片本来就是这样的,建议每隔一段时间软件复位一次,虽然不满意这个答案但是也还算能够解决卡死的问题。
自己留下这个回复,希望给后面掉坑里面的人一点帮助!

出0入0汤圆

发表于 2012-4-15 18:15:09 | 显示全部楼层
代理商说的是正确的,你仔细看PDF里面关于AGC的部分就知道了。。。

出0入0汤圆

发表于 2012-4-15 18:22:44 | 显示全部楼层
对这个问题表示关注,我同事也遇到这个问题~

出0入0汤圆

发表于 2012-6-27 09:08:56 | 显示全部楼层
mark一下。 这个问题是要注意

出0入0汤圆

发表于 2012-6-27 12:15:06 | 显示全部楼层
不是死机了,是你的自动退出接收状态了,

出0入0汤圆

发表于 2012-6-27 12:16:44 | 显示全部楼层
我也碰到过这个问题!可能在你接收完成了,还没有来的急判断下一个接受,下一个接接收已经完成了,所以退出接收状态了,定时的将CC1101转入接收状态就不会出现所谓的死机了!

出0入0汤圆

发表于 2012-7-28 08:48:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-28 15:55:14 | 显示全部楼层
解决问题了,谢谢大家

出0入0汤圆

发表于 2012-9-6 10:17:19 | 显示全部楼层
sunzhuojun 发表于 2012-8-28 15:55
解决问题了,谢谢大家

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

出0入17汤圆

发表于 2012-9-22 19:59:31 | 显示全部楼层
顶楼主,很高尚的技术人。。。

出0入0汤圆

发表于 2012-11-19 11:02:37 | 显示全部楼层
hxg791206 发表于 2012-6-27 12:16
我也碰到过这个问题!可能在你接收完成了,还没有来的急判断下一个接受,下一个接接收已经完成了,所以退出 ...

你好,我的接收函数里就有进入接收状态的命令,可为什么有时候接收数据一会就接收不到了,重启才能接收呢?
我在main函数里,while循环里调用halRfReceivePacket接收数据

INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
{
    INT8U status[2];
    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[0] = RSSI, status[1] = LQI)
            halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);         //读出CRC校验位
                        halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区       
            return (status[1] & CRC_OK);                        //如果校验成功返回接收成功
        }
                 else
                {
            *length = packetLength;
            halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
            return 0;
        }
    }
        else
        return 0;
}

出0入0汤圆

发表于 2013-5-21 17:53:12 | 显示全部楼层
楼主 我现在在用cc1101  调试了好几天 就是收不到数据  能不能把你的程序发给我看一下  谢谢啦!!!403115153@qq.com

出0入0汤圆

发表于 2014-6-8 22:53:19 | 显示全部楼层
sunzhuojun 发表于 2012-8-28 15:55
解决问题了,谢谢大家

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

出0入0汤圆

发表于 2014-6-9 10:05:07 | 显示全部楼层
cc1101 晶振要定时的校准,特别是长时间的接收。

出0入0汤圆

发表于 2014-6-9 16:02:19 | 显示全部楼层
楼上说的对,CC1101的时钟部分要定时校准,否则会发生偏移而收不到数据。
你也可以读一下芯片状态看看芯片是否确实在接收状态。

出0入0汤圆

发表于 2014-6-9 16:02:48 | 显示全部楼层
仔细看CC1101的手册就都解决了!要有耐心
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 00:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表