CC1101的WOR電磁波喚醒方式用法


         WOR很多人只見其音不見其容,最近經過一翻折騰終於在CC1101上把WOR解決了。

這個配置方式其實對於 CC1100/CC1100E/CC2500等芯片都是通用的,對於SOC 芯片,CC1110和CC2510等芯片可以借鑒下,原理上沒區別。     

 

         首先,先來簡單說明下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口,上面的代碼中有設置GPIO,GPIO可以作為一個接收指示器。

3.       如果發現經常收到一些亂碼,那么你環境的干擾強度太高,建議增加引導碼長度,或者使用CCA空閑信道評估。

4.       WOR的使用會導致CC1101進入休眠狀態,這種狀態可以在給予GPIO口信號來激活,回到空閑狀態。

5.       要打開接收中斷。

 

 

 

下面我們來看看WOR的一些原理。

 

 

上面是一個WOR使用時間的示意圖,看得到事件0所占用的時間最長,而WOR就是一個接一個的事件0。

 

         時間的時間長度,在這里面可以參照源代碼,要注意WOR_RES值的時間定義有個區間,每個區間都不是和下一個區間剛好相連的。

 

         睡眠的最短時長是依照晶振的頻率設定的。26M的時候最短時間為11.08ms。

        

         事件0的時間長度為事件1+空閑模式+接收溢出+休眠時間。下面我們可以看一個電平圖:

        

圖上標注的時間就是一個周期的電平變化,事件1激活芯片,然后進入空閑模式,接收掃描,時間溢出,如果有收到數據,那么會延長事件0的時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM