专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
有哪位大神做过CC1101的WOR功能?
2019-07-21 00:46
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
9158
12
1540
本人在做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功能
}
加载中...
查看其它12个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
重点来了:
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功能
}
一周热门 更多>