有哪位大神做过CC1101的WOR功能?

2019-07-21 00:46发布

本人在做CC1101的项目,由于接收端要做低功耗处理。看到CC1101有WOR功能,所以就想用这个功能达到低功耗的目的。但是进入WOR模式后,很难接收,或者过很长一段时间才能接收,如果缩短睡眠时间,功耗增大很多。
本人也试过隔一段时间恢复CC1101,但是功耗并不理想,因为接收模式耗电太大了。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
ryanwong
2019-07-21 20:05
不好意思,我太高估我自己的打字速度了。
重点来了:
WOR功能:

先来说明一下,功耗和WOR之间应该怎么配置。这里的配置参考了以下一篇文章:
https://max.book118.com/html/2017/0606/111886695.shtm
如果看不明白我接下来说的内容:请参考以上链接。内容相似。

开发步骤:
1、确定发送周期。上文提到,MDMCFG4-0,按照那样配置的话,发送间隔会在5ms。5ms的话更利于唤醒CC1101
2、接收时间必须是发送周期的两倍以上。其实这里不是必要的,往后的话会详细解释
3、确定  唤醒时间  和  休眠时间  的占空比,从而确定功耗。要想功耗达到最低,这里的占空比必须选择0.195%。.............其实这里也不是必要的,往后会详细解释
4、由接收时间和占空比确定两个寄存器的值:MCSM2.Rx_TIME 和 WORCTRL.WOR_RES。
5、确定Tevent0     Tevent0=接收时间/占空比
6、确定Tevent1     Tevent1是起振时间          是“起振“不是”晶振“。

综上所述:
void CC1101_WOR(void)
{
        CC1101ClrRXBuff();          //清空CC1101模块上的接收缓冲区

       
        //EVENT0寄存器的值=(WOREVT1<<8)|WOREVT1
        //公式(数据手册上有介绍):t_EVENT0 = 750/(晶振)*(EVENT0寄存器的值)*(2^(5*WOR_RES))
        //晶振:26M,即26000000.    WOR_RES是WOR可设置最大周期值,简单地说,你希望你的CC1101过多久才醒一次。为了不影响体验,这里选择1.8~1.9秒
        //通过以上公式:得到WOREVT的值。
        WriteReg(CC1101_WOREVT1, 0x87);               
        WriteReg(CC1101_WOREVT0, 0x6B);
        WriteReg(CC1101_WORCTRL, 0x38);
        WriteReg(CC1101_MCSM2, 0x13);                        //可能有人会问,这个寄存器不是选择占空比的吗?你填了0x13,不就选择了1.563%,功耗不就大了吗?没错是的,这里先埋下一个伏笔。
        WriteReg(CC1101_MCSM0, 0x38);                        //这个根据数据手册配置的,据说会降低不少功耗,不过好像没什么作用。
       
        WriteReg(CC1101_IOCFG0, 0x46);                       //细心的朋友会发现,这里填的是0x46,前文的配置为0x06。因为我发现配置成0x06的话,GDO0这个脚一直处于低电平,
        //WriteReg(CC1101_IOCFG2, 0x46);                     //为了得到下降沿,这里配置成0x46,目的是让它反一下相。
                                                                                //(这里有个疑问,配置成0x06的话是产生上升沿吗?讲道理它恢复成正常状态时应该有下降沿,但是好像没有引起中断)
        WriteCmd(CC1101_SCAL);         //校准频率合成器并关闭,这个命令我没搞懂。但是不输入这个命令也没影响
        WriteCmd(CC1101_SWOR);         //正式启动WOR功能
       
}



一周热门 更多>