cc1101电磁波唤醒模式问题

[复制链接]
 楼主| e08610318 发表于 2012-10-28 09:36 | 显示全部楼层 |阅读模式
我测试过,MRFI进入WOR模式后,短时间内可以通过其他设备唤醒,但是时间长了,就唤不醒了,打断点发现MRFI无法接受到数据。已经排除诸如中断没开等问题。
    调试的时候,当我发现MRFI无法唤醒后,我在定时中断里面通过仿真器修改变量值使程序执行wor模式初始化语句后,发现MRFI又可以被唤醒了。
     RCOSC校准开了的,WOR模式中,如果RSSI低于阈值MRFI会自动进入SLEEP状态。
chinarfstar 发表于 2012-10-29 17:30 | 显示全部楼层
可以把相关问题邮箱到jordum@szrfstar.com
 楼主| e08610318 发表于 2012-11-1 08:53 | 显示全部楼层
2# chinarfstar
这是谁的邮箱呢?   问题已经解决掉了,所以结贴了
涵潇舒雅 发表于 2014-6-26 09:48 | 显示全部楼层
e08610318 发表于 2012-11-1 08:53
2# chinarfstar  
这是谁的邮箱呢?   问题已经解决掉了,所以结贴了

楼主 能否参考一下您的WOR模式初始化?
 楼主| e08610318 发表于 2014-6-26 10:50 | 显示全部楼层
涵潇舒雅 发表于 2014-6-26 09:48
楼主 能否参考一下您的WOR模式初始化?

还是用软件WOR吧,硬件WOR太麻烦。
涵潇舒雅 发表于 2014-6-26 10:54 | 显示全部楼层
e08610318 发表于 2014-6-26 10:50
还是用软件WOR吧,硬件WOR太麻烦。

这是参考别人的
  1. u8 CC1101_InitWOR(u32 Time)
  2. {
  3.         //uint16 T_Event0=60; //把 EVENT0的时间设定为1S
  4.         u32 EVENT0=0;
  5.         u16 WOR_RES=1;
  6.         u16 WOR_rest=1; //2^(5*WOR_RES)的值
  7.         u8 t;

  8.         WORmode =1; //开启WORMOD模式
  9.         //当输入数据 不符合规则的时候返回错误
  10.         if(Time<15 | Time>61946643)
  11.                 return 0;
  12.         /* WOR WOR_RES设定
  13.   以WOR_RES所能区分的最大时限 区分WOR_RES大小
  14.   
  15.   WOR_RES值时间(极限最大值)(ms)
  16.   0 1890.4615 *14.34 (最小值)
  17.   1 60494.7692
  18.   2 1935832.6153
  19.   3 61946643.6923
  20.   */
  21.         if(Time<1890) WOR_RES=0;
  22.         else if(Time<60494) WOR_RES=1;
  23.         else if(Time<1935832) WOR_RES=2;
  24.         else if(Time<61946643) WOR_RES=3;
  25.         if(!WOR_RES)
  26.             WOR_rest=1;
  27.         else
  28.         {
  29.             for(t=0;t<(5*WOR_RES);t++)
  30.                 WOR_rest *= 2;
  31.         }
  32.         EVENT0 = F_xosc/1000;
  33.         if(EVENT0>Time)
  34.         {
  35.                 EVENT0 = EVENT0*Time;
  36.                 EVENT0 = EVENT0/(750*WOR_rest);
  37.         }
  38.         else
  39.         {
  40.                 EVENT0 = (Time/(750*WOR_rest))*EVENT0;
  41.         }
  42.        
  43.         halSpiStrobe(CCxxx0_SIDLE); //空闲模式

  44.         halSpiWriteReg(CCxxx0_MCSM2, 0x10); //RX_TIME 0 占空比最大
  45.         //在TX,RX后 自动校准XSOC时限 (10) 149-155uS
  46.         halSpiWriteReg(CCxxx0_MCSM0, 0x18); //校准 FS_AUTOCAL[1:0] 01 重IDLE转到TX OR RX模式时
  47.         //写入 事件0时间
  48.         halSpiWriteReg(CCxxx0_WOREVT1, (u8)(EVENT0>>8)); // High byte Event0 timeout
  49.         halSpiWriteReg(CCxxx0_WOREVT0, (u8)EVENT0); // Low byte Event0 timeout.
  50.         //启动 WOR RCosc校准
  51.         //因为进入休眠后只使用RC频率周期,RC受环境和温度影响较大,所以必须一段时间或者WOR唤醒后重新校准一次时钟.
  52.         //在WOR没启动之前 RC须得先行启动
  53.         // tEvent1时间设置为最大,设置 T_event1 ~ 1.4 ms
  54.         halSpiWriteReg(CCxxx0_WORCTRL, 0x78| WOR_RES); //tEvent1 =0111
  55. //          把SO口 设置成通知口 当有数据过来时 置低
  56.         halSpiWriteReg(CCxxx0_IOCFG2, 0x06); //0x24);
  57.        
  58.         halSpiStrobe(CCxxx0_SFRX);
  59.        
  60.         halSpiStrobe(CCxxx0_SWORRST); //复位到 事件1
  61.         halSpiStrobe(CCxxx0_SWOR); //启动WOR
  62.        
  63.         // CC1101_WriteCode(CCxxx0_SPWD); //进入断电模式
  64.         return 1;

  65. }
电流能看出有突变来,应该是进入wor模式了,但是接收不到数据,GDO2没有电平变化;如果按照你说的软件怎么做?用430定期唤醒无线吗??
 楼主| e08610318 发表于 2014-6-27 16:51 | 显示全部楼层
涵潇舒雅 发表于 2014-6-26 10:54
这是参考别人的电流能看出有突变来,应该是进入wor模式了,但是接收不到数据,GDO2没有电平变化;如果按 ...

看情况,你的GDO引脚应该配置的没问题的。
那么你就要考虑:
你的设备的硬件WOR占空比是多少,实际RX的时间是多少,其次你唤醒的设备发送的数据一帧的持续时间是多少,是否满足接收要求

硬WOR是我开始就使用的,后来和别的公司技术牛人交流以后,人家都笑了,他们都不用硬件WOR,都用软件WOR。后来我也决定用软WOR了。软WOR不用考虑那么多配置,自由设定占空比,而且430的定时器CCRx能够实现灵活控制,比较方便。唯一缺点就是硬件WOR的一些功能需要你用软件来实现,比如RSSI达不到要求时自动进入SLEEP,这个就需要软件来实现了。
涵潇舒雅 发表于 2014-7-1 16:25 | 显示全部楼层
e08610318 发表于 2014-6-27 16:51
看情况,你的GDO引脚应该配置的没问题的。
那么你就要考虑:
你的设备的硬件WOR占空比是多少,实际RX的时 ...

找到问题了,因为我参考别人的程序,不小心把寄存器的值改了,所以通信不上,现在没有问题了
hugo0chen 发表于 2016-1-15 12:14 | 显示全部楼层
设备占空比搞错了,即RXTime设置问题,导致不能够唤醒。
donsbin 发表于 2016-6-29 10:56 | 显示全部楼层
e08610318 发表于 2014-6-27 16:51
看情况,你的GDO引脚应该配置的没问题的。
那么你就要考虑:
你的设备的硬件WOR占空比是多少,实际RX的时 ...

软件WOR?这样不就额外增加了功耗吗?我倒是希望通过1101唤醒MCU
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

310

帖子

12

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