CC1101配置WOR模式 结果电流是16.05毫安 我读取CCxxx0_MARCSTATE一直是0X0D
关于CC1101的WOR模式,我是参考了TI的例程的,我发现一个现象就是RX_TIME_QUAL 这一位配置为1,我读取 look111= halSpiReadStatus(CCxxx0_MARCSTATE)这个结果就是0X0D,关于WOR模式的配置我是这样配置的:
halSpiWriteReg(CCxxx0_MCSM2,0x09);
halSpiWriteReg(CCxxx0_MCSM0, 0x18);
然后Tevent0=50ms,来设置的
halSpiWriteReg(CCxxx0_WORCTRL, 0x38);
我的电流一直降不下来,我执行完这些寄存器的操作后,我都读取过的,都是没有问题的,我都写进去了,但是我读CCxxx0_MARCSTATE状态的时候始终是0X0D,也就是表明在接收状态。
当然WOR模式是有接收状态的,但是那个时间应该很短,我读取的时候应该都是空闲状态。
还有一个问题我想请教下,4preamble+4SYS+1len+1address+7data+2CRC 这个就是我的发送数据格式,数据加上了白话,载波监听,调制2FSK,
波特率100K 我计算了下,Trx=15*8/100K=12MS, (前导字节要加在里面算么?如果加了就是19)如果 DUTY=12.5% ,那Tevent0 =96 ms,这样的计算没有错误吧?希望得到您的解答?
最后附上整个WOR的初始化,希望做过的人能给个解答,谢谢~~~
/******************************************************************************
<函数说明>
函数名称:CC1101_IntWOR
函数入参:Time 时间 分 秒级和毫秒级 使用TimeLive来选择
函数说明:电磁波WOR唤醒功能初始化
函数备注:进入电磁波唤醒,也会同时进去到掉电模式,即SLEEP. 再次进入SLDE将会退出掉电模式
当 TimeLive = WOR_MS 时, 不可大于60000ms 可用60000
当 TIMELIVE = WOR_S 时,不可大于 61947S
#define WOR_S 0x11
#define WOR_MS 0x22
返回值:
******************************************************************************/
unsigned char CC1101_InitWOR(unsigned long Time)
{
//uint16 T_Event0=60; //把 EVENT0的时间设定为1S
unsigned long EVENT0=0;
unsigned char WOR_RES=1;
unsigned char WOR_rest=1; //2^(5*WOR_RES) 的值
volatile unsigned char WORmode;
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);
//由于计算的值普遍偏大,如果照常计算会出现溢出, 所以分段处理
unsigned long F_xosc=26000000;
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,2); //空闲模式
// 设置接收超时 Rx_timeout =2.596 ms.
// MCSM2.RX_TIME = 001b
// => Rx_timeout = EVENT0*C(RX_TIME, WOR_RES)
halSpiWriteReg(CCxxx0_MCSM2,0x09,2); //0x10RX_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
halSpiWriteReg(CCxxx0_MCSM0, 0x18,2); //校准 FS_AUTOCAL[1:0] 01 重IDLE转到TX OR RX模式时
//
//写入 事件0 时间
halSpiWriteReg(CCxxx0_WOREVT1, (unsigned char )(EVENT0>>8),2); // High byte Event0 timeout
halSpiWriteReg(CCxxx0_WOREVT0, (unsigned char)EVENT0,2); // Low byte Event0 timeout.
look111=halSpiReadReg(CCxxx0_WOREVT1,2);
look111=halSpiReadReg(CCxxx0_WOREVT0,2);
// 启动 WOR RCosc 校准
// 因为进入休眠后只使用RC频率周期,RC受环境和温度影响较大,所以必须一段时间或者WOR唤醒后重新校准一次时钟.
// 在WOR没启动之前 RC须得先行启动
// tEvent1 时间设置为最大,设置 T_event1 ~ 1.4 ms
halSpiWriteReg(CCxxx0_WORCTRL,0x78| WOR_RES ,2); //tEvent1 =0111 0x38
look111=halSpiReadReg(CCxxx0_WORCTRL,2);
//--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);
halSpiStrobe(CCxxx0_SFRX,2);
halSpiStrobe(CCxxx0_SWORRST,2); //复位到 事件1
halSpiStrobe(CCxxx0_SWOR,2); //启动WOR
// CC1101_WriteCode(CCxxx0_SPWD); //进入断电模式
look111= halSpiReadStatus(CCxxx0_MARCSTATE,2);
return 1;
}
谢谢~~~
hoho。有空的时候帮你好好看看。
但是你有一个问题就是在WOR的情况下,如果是默认的配置,大部分时候是在sleep模式。但是你去读MARSTATE会启动SPI,CS拉低了以后就会推出SLEEP。
你好,很高兴您看到这个帖子,我注意到您说的问题,我已经把读取状态的地方全部都去掉了,然后把GDO0 角配置成0X24,然后我用示波器,看那个引脚的波形,我也能看见大约40us的高电平,然后波形往前走,我觉得我已经进入了SLEEP状态,然后我用电流表,串进了整个CC1101模块,但是电流表还是显示16.5毫安,我相当的奇怪,我跟几个工程师讨论过,觉得这个电流应该是工作状态情况的电流,但是也不是很确定,当然电流表是那种几十块钱的电流表,但是就算电流表不好,电流也应该是跳变的。所以有些犹豫,还有就是那个MSCS2的配置,我也是很奇怪,现在我也不确定我有没有进入WOR模式?看示波器,GDO0有波形?所以想请您指点下?谢谢~~~