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定期唤醒无线吗?? |