這幾天研究了市場上常見的無線遙控開關,它們的無線部分大都是用2262-2272編碼實現,在網上找了些2262-2272軟解碼的資料,發現少的可憐,即使有實用性也不高,于是乎就有了這篇博客。
22262頻率計算公式為F=32000/Ros(KΩ)KHz,其中Ros為震蕩電阻,發送一位占用32個時鐘周期,其中起始位占用128時鐘周期。2262編碼格式如下圖:
‘F’只有地址為才有,數據位只有‘0’‘1’。
cc1101與stc單片機連接如下:
SI-P1.5;
SO-P1.6;
CLK-P1.7;
CS-P3.4;
GDO0-P4.2(CCP0);
GDO2-P4.3(CCP1);
cc1101配置如下:
0x08,//0x0B, // FSCTRL1 Frequency synthesizer control. 0x00, // FSCTRL0 Frequency synthesizer control. 0x0c, // FREQ2 Frequency control word, high byte. 0x1d,//0xAA,//, // FREQ1 Frequency control word, middle byte. 0x89,//0x55,// // FREQ0 Frequency control word, low byte. 0xc6,//0x8A, //2d MDMCFG4 Modem configuration. 0x45,//0x01, //3B MDMCFG3 Modem configuration. 0xb2,//0x73, // MDMCFG2 Modem configuration. 0x02,//0xA2, // 22 MDMCFG1 Modem configuration. 0xF8, // MDMCFG0 Modem configuration. 0x00, // CHANNR Channel number. 0x40,//0x00, // DEVIATN Modem deviation setting (when FSK modulation is enabled). 0x56,//0xB6, // FREND1 Front end RX configuration. 0x11, //10 FREND0 Front end RX configuration. 0x18, // MCSM0 Main Radio Control State Machine configuration. 0x00, //0x0f, //MCSM1 //0x30, 0x16,//0x1D, // FOCCFG Frequency Offset Compensation Configuration. 0x6c,//0x1C, // BSCFG Bit synchronization Configuration. 0x43,//0xC7, // AGCCTRL2 AGC control. 0x40,//0x00, // AGCCTRL1 AGC control. 0x93,//0xB2, // AGCCTRL0 AGC control. 0xe9,//0xEA, // FSCAL3 Frequency synthesizer calibration. 0x2A,//0x0A, // FSCAL2 Frequency synthesizer calibration. 0x00, // FSCAL1 Frequency synthesizer calibration. 0x1f, // FSCAL0 Frequency synthesizer calibration. 0x59, // FSTEST Frequency synthesizer calibration. 0x81,//0x88, // TEST2 Various test settings. 0x35,//0x31, // TEST1 Various test settings. 0x09, // TEST0 Various test settings. 0x09, // IOCFG2 GDO2 output pin configuration. 0x4d, // IOCFG0D GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation. 0x00, // PKTCTRL1 Packet automation control. 0x30, // 05 PKTCTRL0 Packet automation control. 0x00, // ADDR Device address. 0x2e, // PKTLEN Packet length.
這里配置異步接收速度大約為2.1K,根據CC1101手冊說明,異步接收時,其發送頻率的誤差應在設定接收頻率的1/8內,經測試表明,此設置完全可以接受震蕩電阻為475的2262編碼。
這里要說明一個問題,我也沒有找出原因,cc1101在接收2262編碼時,第一個起始位和第一個數據電平接收不到,大概會丟失132-140個震蕩周期,這個可以用一個cc1101和一個超再生接收模塊接收相同的數據在示波器上看出,但并不影響數據接收,因為一般2262編碼至少會發送4次以上。
GDO0在接收時為數據輸出,在發送時自動配置為數據輸入,將STC的ccp0上升沿和下降沿捕獲打開,并將ccp0跳轉至P4.2。
2262軟解碼的關鍵在于找到正確的起始位。使用定時器0資源,配置成16位向上計數器,初始值為0x0000。過程如下:ccp0第一次捕獲到上升沿時,啟動定時器計數,捕獲到下降沿時停止定時器并記錄下此時TH0和TL0的計數并重新啟動定時器,再一次捕獲到上升沿時停止定時器并記錄下TH0和TL0的值重啟定時器,此時已讀取到一個高電平和低電平的寬度了,然后比較,看低電平寬度是否為高電平寬度的30-33倍,如果是則可以認為是2262編碼的起始位,如果不是,則如此循環直到找到比例合適的。
找到起始位后,循環捕獲,至少捕獲兩個2262編碼周期,因為OOK/ASK方式太不穩定了,取兩次解碼比較如果相同才能認為是正確的。
假定捕獲完畢,到解碼過程了,注意到2262編碼規則,每位需要四個電平寬度來表示,其實可以不管是否為高電平或低電平,只需注意四個電平的比例規則:
‘0’1:3,1:3
‘1’3:1,3:1
‘F’1:3,3:1
還要注意一點,2262編碼中‘F’只能出現在地址碼中,如果在數據碼中出現了‘F’,則可認為解碼錯誤。