OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8465|回复: 17

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

[复制链接]

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
发表于 2018-11-22 09:59:01 | 显示全部楼层 |阅读模式
20金钱
本人在做CC1101的项目,由于接收端要做低功耗处理。看到CC1101有WOR功能,所以就想用这个功能达到低功耗的目的。但是进入WOR模式后,很难接收,或者过很长一段时间才能接收,如果缩短睡眠时间,功耗增大很多。
本人也试过隔一段时间恢复CC1101,但是功耗并不理想,因为接收模式耗电太大了。

最佳答案

查看完整内容[请看2#楼]

好了,前文挖了不少坑,现在要填一下了。 1、说到WOR配置时,详细说明了开发步骤。 其实,这个开发步骤并不是必要的,或者不是一定要遵循的。我们开发产品的,第一个考虑的时低功耗问题,如果你的产品做得再牛,体验感再好, 只要功耗没有将下来,都没用,除非你的产品能毁灭地球。 所以我们先确定的是占空比,为了达到最低功耗,占空比选择0.195%。发送周期并不关心,目前发送周期最短5ms。 显然,根据上文给出的链接介 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
 楼主| 发表于 2018-11-22 09:59:02 | 显示全部楼层
好了,前文挖了不少坑,现在要填一下了。
1、说到WOR配置时,详细说明了开发步骤。
其实,这个开发步骤并不是必要的,或者不是一定要遵循的。我们开发产品的,第一个考虑的时低功耗问题,如果你的产品做得再牛,体验感再好,
只要功耗没有将下来,都没用,除非你的产品能毁灭地球。
所以我们先确定的是占空比,为了达到最低功耗,占空比选择0.195%。发送周期并不关心,目前发送周期最短5ms。
显然,根据上文给出的链接介绍,接收周期要比发送周期小很多。

2、现在说一下WriteReg(CC1101_MCSM2, 0x13);的伏笔
如果这里填0x06的话,功耗还是会在40uA左右。和链接的文章计算的差不多。
我觉得仍然很大,于是又寻找了各种文章,各种人,供应商,或者淘宝卖家。这里重点批评淘宝卖家,我把程序发给他,让他看一下配置,结果我怀疑他根本
没看,来来回回一直和我说是不是哪里漏电。拜托,我的单片机连接模块的引脚都模拟输入了(除了CS,和GDO0),只接了CC1101,其它什么都没接,哪来的漏电。
问我哪里买的模块,我说另一家的,然后就不停攻击那家公司。把自己的产品说得很NB。其实都一样。

好了,对不起,不废话了。
我在数据手册找到了CC1101电气特性。
微信截图_20181204205106.png
画红框的那里,8.8uA。
微信图片_20181204204926.png

具体我不翻译了,根据提示,我将MCSM2.RX_TIME_RSSI 置1。这里简单解释一下,当8个电磁波周期内没有接收到数据,那么判断为接收超时(翻译不准确),这个位是在WOR功能下,
变相地,极限地 缩短接收时间,所以功耗才能降到8uA。选择配置为0x13,纯属是应为体验了一下接收效果,0x13是最佳的。(后面这一句话不是很精确)

这里再次批评淘宝卖家,还说什么,正品的芯片功耗能到达5uA,我休眠模式下还1uA不到呢?数据手册写明是8uA,蒙谁呢?话说,我还真被他蒙了,让我私下给他转30,两个CC1101,包邮。
结果我到他店里看的时候,是另一个版本的模块,两个模块加起来,把运费也加起来,也不过20块。哼,坑货。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-11-23 02:17:33 | 显示全部楼层
帮顶
回复

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
 楼主| 发表于 2018-11-23 09:58:52 | 显示全部楼层

原子哥,为什么你帮顶后又把我的贴子删掉?
回复

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
 楼主| 发表于 2018-11-23 10:00:36 | 显示全部楼层

不好意思没看到。。。
回复

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
 楼主| 发表于 2018-12-4 19:46:09 | 显示全部楼层
CC1101这个模块搞了几个礼拜了,付出了很多汗水,想出不少思路,也想过放弃并且换另一种模块,但是坚持到了最后,上帝最后还是看到了我的辛勤劳动,
终于让我完美地解决了WOR功能的某些问题了,包括我这个贴子提到的问题。这里不傲娇一下真对不起填了这么多坑的自己。

我先来把我现在的成果展示以下:
1、最重要的:WOR功能下,平均功耗达到8uA左右,注意这里说的是平均功耗。下文会详细解释“功耗”相关内容。

2、体验感,又或者说响应时间。最多5秒,快的话1秒以内(这里没有计时,估计最快200毫秒吧)

这里值得指出这么个问题,作为10年前的产物,居然没有多少文章是详细说明CC1101低功耗是怎么做的(当然也有,只是很少,下文会直接给出CC1101低功耗文章的链接)。
大多数的文章都只是简单的给出相关寄存器的值,而没有指出这些寄存器是干什么用的,而且还不全面。

所以,参考网上的文章的话,没有办法很好地达到我的需求。

本人作为小白,真的不是很能理解数据手册上面的理论知识。我对无线射频方面的知识量很少,如果有哪位大神愿意指导,又或者指教一下小弟,小弟还是很乐意接受的。
好了,废话不多说了,我马上把研究成果共享出来。 现在19点45分,20点之前完成。
回复

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
 楼主| 发表于 2018-12-4 20:06:13 | 显示全部楼层
本帖最后由 ryanwong 于 2018-12-4 20:38 编辑

对不起,晚了点。
首先:由于篇幅的原因,我只把CC1101的某些配置发出来
把基本配置上传上来先
寄存器配置:
static const unsigned char CC1101InitData[30][2]=
{
  {CC1101_IOCFG0,      0x06},                            //这里是GDO0的收到数据就产生中断的配置
  {CC1101_FIFOTHR,     0x47},
  {CC1101_PKTCTRL0,    0x05},
  {CC1101_CHANNR,      0x01},
  {CC1101_FSCTRL1,     0x0B},
  {CC1101_FSCTRL0,     0x00},   //    Frequency synthesizer control.
  {CC1101_FREQ2,       0x10},
  {CC1101_FREQ1,       0xA7},
  {CC1101_FREQ0,       0x62},
  {CC1101_MDMCFG4,     0x7B},                             //这里比较重要的是 MDMCFG4 - 0,这几个寄存器,其实我不知道这是什么意思,但是这样配置的话,发送端发送周期会下降至5ms
  {CC1101_MDMCFG3,     0x83},                             //按照其他文章配置的话,发送周期将会到达100ms,发送周期太长的话,接收端不好接收数据
  {CC1101_MDMCFG2,     0x93},                             //这里的“发送周期”不是指连续发送,而是每次只发几个字节,用来唤醒CC1101。(这里表述不清楚,真是不好意思)
  {CC1101_MDMCFG1,     0x23},   //    Modem configuration.                                        //其余的和网上的配置差不多
  {CC1101_MDMCFG0,     0xA4},   //    Modem configuration.
  {CC1101_DEVIATN,     0x15},
  {CC1101_FREND1,      0x56},   //     Front end RX configuration.
  {CC1101_FREND0,      0x10},   //     Front end RX configuration.
  {CC1101_MCSM0,       0x18},
  {CC1101_FOCCFG,      0x16},
  {CC1101_BSCFG,       0x6C},   //      Bit synchronization Configuration.
  {CC1101_AGCCTRL2,    0x43},   //   AGC control.
  {CC1101_AGCCTRL1,    0x40},   //   AGC control.
  {CC1101_AGCCTRL0,    0x91},   //   AGC control.
  {CC1101_FSCAL3,      0xA9},
  {CC1101_FSCAL2,      0x0A},
  {CC1101_FSCAL1,      0x00},
  {CC1101_FSCAL0,      0x11},
  {CC1101_TEST2,       0x81},
  {CC1101_TEST1,       0x35},
  {CC1101_MCSM1,       0x3B},
初始化函数:  //以下是初始化函数的操作,值得注意的是这里配置了地址。一般CC1101选择信道就可以了。我也是跟着别人配置的
void cc1101Init(void)
{
    unsigned char i;
        SPI_GPIO_Init();
    Reset();   
    for(i=0;i<0xff;i++);
    for(i=0;i<0xff;i++);

    for( i = 0; i < 30; i++ )                //28
    {
        WriteReg(CC1101InitData[0],CC1101InitData[1]);
    }
    //cc1101_mode(RX_MODE);
        CC1101SetAddress( 0x05, BROAD_0AND255 );
        CC1101SetSYNC( 0x8799 );
        WriteReg(CC1101_MDMCFG1,   0x72); //Modem Configuration
        
        WriteMultiReg(CC1101_PATABLE, PaTabel, 8 );
        
        i = ReadStatus( CC1101_PARTNUM );//for test, must be 0x80
    i = ReadStatus( CC1101_VERSION );//for test, refer to the datasheet
        
        CC1101SetTRMode(RX_MODE);
}


unsigned char PaTabel[8] = { 0xc0, 0xC8, 0x84, 0x60, 0x68, 0x34, 0x1D, 0x0E};

回复

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
 楼主| 发表于 2018-12-4 20:30:11 | 显示全部楼层
不好意思,我太高估我自己的打字速度了。
重点来了:
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功能
       
}



回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13100
金钱
13100
注册时间
2012-11-26
在线时间
3811 小时
发表于 2018-12-4 21:00:09 | 显示全部楼层
顶         
学无止境
回复

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-3
在线时间
42 小时
 楼主| 发表于 2018-12-4 21:10:16 | 显示全部楼层
本帖最后由 ryanwong 于 2018-12-4 21:12 编辑

可能有人看到最后 把MCSM2.RX_TIME_RSSI 置1就能把功耗降到这么低,会想:那前面是不是都是废话?
这里,我很负责地告诉你:是的!除了最后的说明,前面的都是废话!!!
为什么,我要绕这么一大圈呢?
因为这些都是我经历过的事情,我跳进去的坑,你们也要跳一边。哈哈哈,我就是这么皮!最后再说一句:我是加了很多天的班,才把功耗降到这么低。所以,胜利属于加班狗协会!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-12-7 02:15:10 | 显示全部楼层
ryanwong 发表于 2018-12-4 21:10
可能有人看到最后 把MCSM2.RX_TIME_RSSI 置1就能把功耗降到这么低,会想:那前面是不是都是废话?
这里, ...

不错,谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2018-8-21
在线时间
85 小时
发表于 2018-12-7 10:19:30 | 显示全部楼层
顶!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-5-14
在线时间
3 小时
发表于 2019-5-29 10:53:39 | 显示全部楼层
大哥你好,我最近也在学习cc1101。目前基本通信已经调通,但WOR功能完全没有思绪。大哥能否给点例程让我参考一下,真的感激不尽!我的邮箱952169146@qq.com
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2019-5-22
在线时间
16 小时
发表于 2019-12-2 17:51:57 | 显示全部楼层
大哥,最近要做这个CC1101的低功耗,历程方便发一下吗?感激不尽!邮箱1225744027@qq.com
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-5-22
在线时间
24 小时
发表于 2020-3-1 16:19:31 | 显示全部楼层
楼主能说一下这个CC1101怎么更改信道吗
回复

使用道具 举报

12

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
567
金钱
567
注册时间
2014-12-19
在线时间
139 小时
发表于 2020-4-30 15:37:15 | 显示全部楼层
回复

使用道具 举报

12

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
567
金钱
567
注册时间
2014-12-19
在线时间
139 小时
发表于 2020-4-30 15:38:18 | 显示全部楼层
天行健liu 发表于 2020-3-1 16:19
楼主能说一下这个CC1101怎么更改信道吗

{CC1101_CHANNR,      0x01},这个代表信道,
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2021-5-27
在线时间
1 小时
发表于 2021-5-27 18:22:36 | 显示全部楼层
本帖最后由 15601138308 于 2021-5-27 18:23 编辑

兄弟,还在吗,可否给我发个CC1101的工程源码参考一下    842051663@qq.com  谢谢啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 04:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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