CC1101配置WOR模式 結(jié)果電流是16.05毫安 我讀取CCxxx0_MARCSTATE一直是0X0D
關(guān)于CC1101的WOR模式,我是參考了TI的例程的,我發(fā)現(xiàn)一個現(xiàn)象就是RX_TIME_QUAL 這一位配置為1,我讀取 look111= halSpiReadStatus(CCxxx0_MARCSTATE)這個結(jié)果就是0X0D,關(guān)于WOR模式的配置我是這樣配置的:
halSpiWriteReg(CCxxx0_MCSM2,0x09);
halSpiWriteReg(CCxxx0_MCSM0, 0x18);
然后Tevent0=50ms,來設(shè)置的
halSpiWriteReg(CCxxx0_WORCTRL, 0x38);
我的電流一直降不下來,我執(zhí)行完這些寄存器的操作后,我都讀取過的,都是沒有問題的,我都寫進去了,但是我讀CCxxx0_MARCSTATE狀態(tài)的時候始終是0X0D,也就是表明在接收狀態(tài)。
當然WOR模式是有接收狀態(tài)的,但是那個時間應(yīng)該很短,我讀取的時候應(yīng)該都是空閑狀態(tài)。
還有一個問題我想請教下,4preamble+4SYS+1len+1address+7data+2CRC 這個就是我的發(fā)送數(shù)據(jù)格式,數(shù)據(jù)加上了白話,載波監(jiān)聽,調(diào)制2FSK,
波特率100K 我計算了下,Trx=15*8/100K=12MS, (前導(dǎo)字節(jié)要加在里面算么?如果加了就是19)如果 DUTY=12.5% ,那Tevent0 =96 ms,這樣的計算沒有錯誤吧?希望得到您的解答?
最后附上整個WOR的初始化,希望做過的人能給個解答,謝謝~~~
/******************************************************************************
<函數(shù)說明>
函數(shù)名稱:CC1101_IntWOR
函數(shù)入?yún)?Time 時間 分 秒級和毫秒級 使用TimeLive來選擇
函數(shù)說明:電磁波WOR喚醒功能初始化
函數(shù)備注:進入電磁波喚醒,也會同時進去到掉電模式,即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的時間設(shè)定為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模式
//當輸入數(shù)據(jù) 不符合規(guī)則的時候返回錯誤
if(Time<15 | Time>61946643) return 0;
/* WOR WOR_RES設(shè)定
以WOR_RES所能區(qū)分的最大時限 區(qū)分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;
// 設(shè)置 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);
//由于計算的值普遍偏大,如果照常計算會出現(xiàn)溢出, 所以分段處理
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); //空閑模式
// 設(shè)置接收超時 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轉(zhuǎn)到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受環(huán)境和溫度影響較大,所以必須一段時間或者WOR喚醒后重新校準一次時鐘.
// 在WOR沒啟動之前 RC須得先行啟動
// tEvent1 時間設(shè)置為最大,設(shè)置 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口 設(shè)置成通知口 當有數(shù)據(jù)過來時 置低
//CC1101_WriteReg(CCxxx0_IOCFG2, 0x06); //0x24);
halSpiStrobe(CCxxx0_SFRX,2);
halSpiStrobe(CCxxx0_SWORRST,2); //復(fù)位到 事件1
halSpiStrobe(CCxxx0_SWOR,2); //啟動WOR
// CC1101_WriteCode(CCxxx0_SPWD); //進入斷電模式
look111= halSpiReadStatus(CCxxx0_MARCSTATE,2);
return 1;
}
謝謝~~~
hoho。有空的時候幫你好好看看。
但是你有一個問題就是在WOR的情況下,如果是默認的配置,大部分時候是在sleep模式。但是你去讀MARSTATE會啟動SPI,CS拉低了以后就會推出SLEEP。
你好,很高興您看到這個帖子,我注意到您說的問題,我已經(jīng)把讀取狀態(tài)的地方全部都去掉了,然后把GDO0 角配置成0X24,然后我用示波器,看那個引腳的波形,我也能看見大約40us的高電平,然后波形往前走,我覺得我已經(jīng)進入了SLEEP狀態(tài),然后我用電流表,串進了整個CC1101模塊,但是電流表還是顯示16.5毫安,我相當?shù)钠婀?,我跟幾個工程師討論過,覺得這個電流應(yīng)該是工作狀態(tài)情況的電流,但是也不是很確定,當然電流表是那種幾十塊錢的電流表,但是就算電流表不好,電流也應(yīng)該是跳變的。所以有些猶豫,還有就是那個MSCS2的配置,我也是很奇怪,現(xiàn)在我也不確定我有沒有進入WOR模式?看示波器,GDO0有波形?所以想請您指點下?謝謝~~~