e08610318 发表于 2014-6-26 10:50 
还是用软件WOR吧,硬件WOR太麻烦。
这是参考别人的- u8 CC1101_InitWOR(u32 Time)
- {
- //uint16 T_Event0=60; //把 EVENT0的时间设定为1S
- u32 EVENT0=0;
- u16 WOR_RES=1;
- u16 WOR_rest=1; //2^(5*WOR_RES)的值
- u8 t;
- 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;
- if(!WOR_RES)
- WOR_rest=1;
- else
- {
- for(t=0;t<(5*WOR_RES);t++)
- WOR_rest *= 2;
- }
- EVENT0 = F_xosc/1000;
- if(EVENT0>Time)
- {
- EVENT0 = EVENT0*Time;
- EVENT0 = EVENT0/(750*WOR_rest);
- }
- else
- {
- EVENT0 = (Time/(750*WOR_rest))*EVENT0;
- }
-
- halSpiStrobe(CCxxx0_SIDLE); //空闲模式
- halSpiWriteReg(CCxxx0_MCSM2, 0x10); //RX_TIME 0 占空比最大
- //在TX,RX后 自动校准XSOC时限 (10) 149-155uS
- halSpiWriteReg(CCxxx0_MCSM0, 0x18); //校准 FS_AUTOCAL[1:0] 01 重IDLE转到TX OR RX模式时
- //写入 事件0时间
- halSpiWriteReg(CCxxx0_WOREVT1, (u8)(EVENT0>>8)); // High byte Event0 timeout
- halSpiWriteReg(CCxxx0_WOREVT0, (u8)EVENT0); // Low byte Event0 timeout.
- //启动 WOR RCosc校准
- //因为进入休眠后只使用RC频率周期,RC受环境和温度影响较大,所以必须一段时间或者WOR唤醒后重新校准一次时钟.
- //在WOR没启动之前 RC须得先行启动
- // tEvent1时间设置为最大,设置 T_event1 ~ 1.4 ms
- halSpiWriteReg(CCxxx0_WORCTRL, 0x78| WOR_RES); //tEvent1 =0111
- // 把SO口 设置成通知口 当有数据过来时 置低
- halSpiWriteReg(CCxxx0_IOCFG2, 0x06); //0x24);
-
- halSpiStrobe(CCxxx0_SFRX);
-
- halSpiStrobe(CCxxx0_SWORRST); //复位到 事件1
- halSpiStrobe(CCxxx0_SWOR); //启动WOR
-
- // CC1101_WriteCode(CCxxx0_SPWD); //进入断电模式
- return 1;
- }
电流能看出有突变来,应该是进入wor模式了,但是接收不到数据,GDO2没有电平变化;如果按照你说的软件怎么做?用430定期唤醒无线吗??
|