原创 CC1101的WOR电磁波唤醒的使用方法

2011-10-11 17:54 12816 9 17 分类: 通信

CC1101WOR电磁波唤醒方式用法

         博客很久没更新,总没抽出时间来做更多的博文,最近把CC1101玩了一遍,现在把CC1101的一些用法和比较深入的东西拿出来分享下。

        

 我的辛苦愿为你分享,转帖请保留http://blog.ednchina.com/jikeppq163/

 

         WOR很多人只见其音不见其容,最近经过一翻折腾终于在CC1101上把WOR解决了。

这个配置方式其实对于 CC1100/CC1100E/CC2500等芯片都是通用的,对于SOC 芯片,CC1110CC2510等芯片可以借鉴下,原理上没区别。     

 

         首先,先来简单说明下WOR到底是个什么功能。WOR就是使芯片处于SLEEP状态下,定时唤醒扫描空中信号的功能。米错,虽然说的是电磁波唤醒,但并不是无消耗的无线功能,需要设定一个定时扫描的周期.然后,每个周期醒过来一次扫描空间信号。

        

需要注意的是,如果引导码正确,即使不是发给它的数据,它也会接收,然后醒过来。

 

下面来看一下源代码:

 

/******************************************************************************

<函数说明>

函数名称:CC1101_IntWOR

函数入参:Time 时间 秒级和毫秒级  使用TimeLive来选择

函数说明:电磁波WOR唤醒功能初始化

函数备注:进入电磁波唤醒,也会同时进去到掉电模式,SLEEP. 再次进入SLDE将会退出掉电模式

         

          TimeLive = WOR_MS , 不可大于60000ms 可用60000

          TIMELIVE = WOR_S  ,不可大于 61947S  

 

          #define WOR_S 0x11

          #define WOR_MS 0x22

 

返回值:

******************************************************************************/

uint8 CC1101_InitWOR(uint32 Time)

{

  //uint16 T_Event0=60;   // EVENT0的时间设定为1S

  uint32 EVENT0=0;

  uint16 WOR_RES=1;

  uint16 WOR_rest=1;      //2^(5*WOR_RES) 的值

 

  WORmode =1; //开启WORMOD模式

 

  //当输入数据 不符合规则的时候返回错误

  if(Time<15 | Time>61946643) return 0;

 

  /* WOR WOR_RES设定

  WOR_RES所能区分的最大时限 区分WOR_RES大小

 

  WOR_RES       时间(极限最大值)(ms)

  0                1890.4615         *14.34 (最小值)

  1                60494.7692

  2                1935832.6153

  3                61946643.6923

  */

  if(Time<1890) WOR_RES=0;

  else if(Time<60494)       WOR_RES=1;

  else if(Time<1935832)     WOR_RES=2;

  else if(Time<61946643)    WOR_RES=3;

 

  // WOR_rest 默认等于1

  // WOR_rest=2^5WOR_RES

  /*

  if(!WOR_RES) WOR_rest=1;

  else{

  for(uint8 t=0;t<(5*WOR_RES);t++)WOR_rest *= 2;

}

  */

  WOR_rest <<= 5*WOR_RES;

 

  // 设置 Event0 timeout  (RX 轮询间隔时间);

  // 事件0 EVENT0时间长度公式 T_event0 = 750 / f_xosc * EVENT0 * 2^(5*WOR_RES) = 1 s,   f_xosc 使用的是 26 MHz

  // EVENT0 = (F_xosc*Time)/((750*WOR_rest)*Tms);

 

  //由于计算的值普遍偏大,如果照常计算会出现溢出, 所以分段处理

  EVENT0 = F_xosc/1000;

  if(EVENT0>Time)

  {

    EVENT0 = EVENT0*Time;

    EVENT0 = EVENT0/(750*WOR_rest); 

  }

  else

  {

    EVENT0 = (Time/(750*WOR_rest))*EVENT0;

  }

 

  CC1101_WriteCode(CCxxx0_SIDLE); //空闲模式

  // 设置接收超时 Rx_timeout =2.596 ms.

  // MCSM2.RX_TIME = 001b

  // => Rx_timeout = EVENT0*C(RX_TIME, WOR_RES)

  CC1101_WriteReg(CCxxx0_MCSM2, 0x10);  //RX_TIME 0   占空比最大

  // Enable automatic FS calibration when going from IDLE to RX/TX/FSTXON (in between EVENT0 and EVENT1)

  //TX,RX 自动校准   XSOC时限 (10) 149-155uS

  CC1101_WriteReg(CCxxx0_MCSM0, 0x18);                  //校准 FS_AUTOCAL[1:0]  01    IDLE转到TX OR RX模式时

  //

  //写入 事件0 时间

  CC1101_WriteReg(CCxxx0_WOREVT1, (uint8)(EVENT0>>8));        // High byte Event0 timeout

  CC1101_WriteReg(CCxxx0_WOREVT0, (uint8)EVENT0);             // Low byte Event0 timeout.

 

  // 启动 WOR RCosc 校准

  // 因为进入休眠后只使用RC频率周期,RC受环境和温度影响较大,所以必须一段时间或者WOR唤醒后重新校准一次时钟.

  // WOR没启动之前 RC须得先行启动

  // tEvent1 时间设置为最大,设置 T_event1 ~ 1.4 ms

  CC1101_WriteReg(CCxxx0_WORCTRL, 0x78| WOR_RES);             //tEvent1 =0111

  //--RC_CAL =1 自动校准

  //halWait(30);                                                //等待校准完成

  //CC1101_WriteReg(CCxxx0_WORCTRL, 0x70 | WOR_RES);           // tEvent1 =0111 48 (1.333-1.385 ms)

  // RC_CAL =0

 

  //CC1101_WriteReg(CCxxx0_RCCTRL1, RCC1);

  //CC1101_WriteReg(CCxxx0_RCCTRL0, RCC0);

 

  //SO 设置成通知口 当有数据过来时 置低

  CC1101_WriteReg(CCxxx0_IOCFG2, 0x06);  //0x24);

 

  CC1101_WriteCode(CCxxx0_SFRX); 

 

  CC1101_WriteCode(CCxxx0_SWORRST);      //复位到 事件1

  CC1101_WriteCode(CCxxx0_SWOR);         //启动WOR

 

  //  CC1101_WriteCode(CCxxx0_SPWD); //进入断电模式

  return 1;

}

 

最后再来说几个注意事项:

1.       接收端使用的是WOR的时候,发送端一定要使用连续发送模式。

2.       设置好GPIO,上面的代码中有设置GPIOGPIO可以作为一个接收指示器。

3.       如果发现经常收到一些乱码,那么你环境的干扰强度太高,建议增加引导码长度,或者使用CCA空闲信道评估。

4.       WOR的使用会导致CC1101进入休眠状态,这种状态可以在给予GPIO口信号来激活,回到空闲状态。

5.       要打开接收中断。

 

 

 我的辛苦愿为你分享,转帖请保留http://blog.ednchina.com/jikeppq163/

 

下面我们来看看WOR的一些原理。

20111011175007001.jpg

 

上面是一个WOR使用时间的示意图,看得到事件0所占用的时间最长,而WOR就是一个接一个的事件0

20111011175007002.png

         时间的时间长度,在这里面可以参照源代码,要注意WOR_RES值的时间定义有个区间,每个区间都不是和下一个区间刚好相连的。

20111011175007003.png

         睡眠的最短时长是依照晶振的频率设定的。26M的时候最短时间为11.08ms

         20111011175007004.jpg

         事件0的时间长度为事件1+空闲模式+接收溢出+休眠时间。下面我们可以看一个电平图:

         20111011175007005.jpg

图上标注的时间就是一个周期的电平变化,事件1激活芯片,然后进入空闲模式,接收扫描,时间溢出,如果有收到数据,那么会延长事件0的时间。

 

 

 我的辛苦愿为你分享,转帖请保留http://blog.ednchina.com/jikeppq163/

        

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

用户377235 2015-6-16 15:51

EVENT0 = F_xosc/1000; 这里为什么要除1000,计算公式里没这一步啊

用户343036 2014-12-3 17:54

连续发送是说射频信号的发送方需要连续不断的重复发送该射频信号一段时间。因为WOR是周期性唤醒的,如果CC1101处于睡眠状态,是不会侦听的,只有正好发送信号时碰到接收端唤醒并处于RX模式,并成功侦测到同步字,才会接收到数据。

用户377235 2013-10-22 09:14

能指导下吗,发送方连续发送是什么概念

用户445390 2013-8-27 17:33

一直听说cc1101无法唤醒,读罢收益良多,TI没有骗人,只是知己水平的问题

用户377235 2013-2-23 11:56

"接收端使用的是WOR的时候,发送端一定要使用连续发送模式"什么意思,怎么是连续发送模式?

用户377235 2012-8-27 16:42

辛苦了,谢谢。

用户1603637 2012-8-19 15:32

不错,谢谢分享

用户377235 2012-4-23 17:54

比较详细,不错,试试看

相关推荐阅读
用户281442 2011-10-12 14:39
文件目录生成方法
最近要弄文件目录,折腾老半天,后来同事说可以自己生成目录,才发现还有这么简单的方法!!1.先在文件夹选项里面,查看-》隐藏已知文件后缀 把前面的勾去掉。2.然后 再建立一个文本文档,在里面输入 tre...
用户281442 2011-08-16 15:29
编程 写给初学者
  --------Euro  编写     对于初学者而言,最难的 =EN-US>.面对 密密麻麻的程序,很多人都会一筹莫展,我也是如此过来的.     我本身而言 也算半个 初学者. 能给...
用户281442 2011-06-24 14:21
概念文 物联网概念的叙述
物联网世界-世界网络进程 物联网是什么? 或许我国的大多数人依旧一无所知,他们会听说这个名字,却无法明白他其中的含义. 那他到底是什么意思呢?   物联网,英文名称叫“The Internet ...
用户281442 2011-06-24 13:57
TI公司 CC系列芯片的无线寄存器配置方式
TI公司 CC系列芯片的无线寄存器配置方式 SmartRF Studio7的一些简单说明 TI 公司的CC系列芯片全部都是无线芯片,对于初次 使用或较少接触的人来说,CC系列的芯片无限寄存器的配...
用户281442 2011-06-21 12:44
最近在玩CC430
好久没上博客了.最近在忙CC430.折腾了 近2个月,咋也熟悉的差不多了,大家如果有兴趣也能看看,偶后面慢慢发一些相关资料,顺手发点使用的文档咯.<?xml:namespace prefix =...
EE直播间
更多
我要评论
8
9
关闭 站长推荐上一条 /3 下一条