📄 hello.lst
字号:
(0419) /* This routine puts the CC1000 into RX mode (from TX). When switching to */
(0420) /* RX from PD, use WakeupC1000ToRX first */
(0421) /****************************************************************************/
(0422)
(0423)
(0424) char SetupCC1000RX(char RXCurrent,char RXPLL)
(0425) {
(0426) int i;
(0427) char lock_status;
(0428)
(0429) WriteToCC1000Register(CC1000_MAIN,0x11); // Switch into RX, switch to freq. reg A
0172 E121 LDI R18,0x11
0173 2700 CLR R16
0174 DF5B RCALL _WriteToCC1000Register
(0430) WriteToCC1000Register(CC1000_PLL,RXPLL); // Use RX refdiv setting
0175 2F26 MOV R18,R22
0176 E00C LDI R16,0xC
0177 DF58 RCALL _WriteToCC1000Register
(0431) WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX
0178 2F24 MOV R18,R20
0179 E009 LDI R16,0x9
017A DF55 RCALL _WriteToCC1000Register
(0432)
(0433) // Wait 250us before monitoring LOCK
(0434) delaycc(12);
017B E00C LDI R16,0xC
017C E010 LDI R17,0
017D DF04 RCALL _delaycc
(0435)
(0436) // Wait for lock
(0437) for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(i>0); i--);
017E EF4E LDI R20,0xFE
017F E75F LDI R21,0x7F
0180 C002 RJMP 0x0183
0181 5041 SUBI R20,1
0182 4050 SBCI R21,0
0183 E00D LDI R16,0xD
0184 DF6E RCALL _ReadFromCC1000Register
0185 FD00 SBRC R16,0
0186 C005 RJMP 0x018C
0187 2422 CLR R2
0188 2433 CLR R3
0189 1624 CP R2,R20
018A 0635 CPC R3,R21
018B F3AC BLT 0x0181
(0438)
(0439) // If PLL in lock
(0440) if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
018C E00D LDI R16,0xD
018D DF65 RCALL _ReadFromCC1000Register
018E 2F80 MOV R24,R16
018F 7081 ANDI R24,1
0190 3081 CPI R24,1
0191 F411 BNE 0x0194
(0441) // Indicate PLL in LOCK
(0442) lock_status = LOCK_OK;
0192 E041 LDI R20,1
(0443) // Else (PLL out of LOCK)
(0444) }else{
0193 C007 RJMP 0x019B
(0445) // If recalibration ok
(0446) if(CalibrateCC1000()){
0194 DFA0 RCALL _CalibrateCC1000
0195 2300 TST R16
0196 F011 BEQ 0x0199
(0447) // Indicate PLL in LOCK
(0448) lock_status = LOCK_RECAL_OK;
0197 E042 LDI R20,2
(0449) // Else (recalibration failed)
(0450) }else{
0198 C002 RJMP 0x019B
(0451) // Reset frequency syncthesizer (ref.: Errata Note 01)
(0452) ResetFreqSynth();
0199 D0B1 RCALL _ResetFreqSynth
(0453) // Indicate PLL out of LOCK
(0454) lock_status = LOCK_NOK;
019A 2744 CLR R20
(0455) }
(0456) }
(0457)
(0458) // Return LOCK status to application
(0459) return (lock_status);
019B 2F04 MOV R16,R20
019C 940E0391 CALL pop_gset2
019E 9508 RET
_SetupCC1000TX:
lock_status --> R20
i --> R20
TXPLL --> R22
TXCurrent --> R20
019F 940E039D CALL push_gset2
01A1 2F62 MOV R22,R18
01A2 2F40 MOV R20,R16
(0460) }
(0461)
(0462) /****************************************************************************/
(0463) /* This routine puts the CC1000 into TX mode (from RX). When switching to */
(0464) /* TX from PD, use WakeupCC1000ToTX first */
(0465) /****************************************************************************/
(0466)
(0467) char SetupCC1000TX(char TXCurrent,char TXPLL)
(0468) {
(0469) int i;
(0470) char lock_status;
(0471)
(0472) WriteToCC1000Register(CC1000_PA_POW,0x00); // Turn off PA to avoid frequency splatter
01A3 2722 CLR R18
01A4 E00B LDI R16,0xB
01A5 DF2A RCALL _WriteToCC1000Register
(0473)
(0474) WriteToCC1000Register(CC1000_MAIN,0xE1); // Switch into TX, switch to freq. reg B
01A6 EE21 LDI R18,0xE1
01A7 2700 CLR R16
01A8 DF27 RCALL _WriteToCC1000Register
(0475) WriteToCC1000Register(CC1000_PLL,TXPLL); // Use TX refdiv setting
01A9 2F26 MOV R18,R22
01AA E00C LDI R16,0xC
01AB DF24 RCALL _WriteToCC1000Register
(0476) WriteToCC1000Register(CC1000_CURRENT,TXCurrent); // Program VCO current for TX
01AC 2F24 MOV R18,R20
01AD E009 LDI R16,0x9
01AE DF21 RCALL _WriteToCC1000Register
(0477)
(0478) // Wait 250us before monitoring LOCK
(0479) delaycc(12);
01AF E00C LDI R16,0xC
01B0 E010 LDI R17,0
01B1 DED0 RCALL _delaycc
(0480)
(0481) // Wait for lock
(0482) for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(i>0); i--);
01B2 EF4E LDI R20,0xFE
01B3 E75F LDI R21,0x7F
01B4 C002 RJMP 0x01B7
01B5 5041 SUBI R20,1
01B6 4050 SBCI R21,0
01B7 E00D LDI R16,0xD
01B8 DF3A RCALL _ReadFromCC1000Register
01B9 FD00 SBRC R16,0
01BA C005 RJMP 0x01C0
01BB 2422 CLR R2
01BC 2433 CLR R3
01BD 1624 CP R2,R20
01BE 0635 CPC R3,R21
01BF F3AC BLT 0x01B5
(0483)
(0484) // If PLL in lock
(0485) if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
01C0 E00D LDI R16,0xD
01C1 DF31 RCALL _ReadFromCC1000Register
01C2 2F80 MOV R24,R16
01C3 7081 ANDI R24,1
01C4 3081 CPI R24,1
01C5 F411 BNE 0x01C8
(0486) // Indicate PLL in LOCK
(0487) lock_status = LOCK_OK;
01C6 E041 LDI R20,1
(0488) // Else (PLL out of LOCK)
(0489) }else{
01C7 C007 RJMP 0x01CF
(0490) // If recalibration ok
(0491) if(CalibrateCC1000()){
01C8 DF6C RCALL _CalibrateCC1000
01C9 2300 TST R16
01CA F011 BEQ 0x01CD
(0492) // Indicate PLL in LOCK
(0493) lock_status = LOCK_RECAL_OK;
01CB E042 LDI R20,2
(0494) // Else (recalibration failed)
(0495) }else{
01CC C002 RJMP 0x01CF
(0496) // Reset frequency syncthesizer (ref.: Errata Note 01)
(0497) ResetFreqSynth();
01CD D07D RCALL _ResetFreqSynth
(0498) // Indicate PLL out of LOCK
(0499) lock_status = LOCK_NOK;
01CE 2744 CLR R20
(0500) }
(0501) }
(0502)
(0503) // Increase output power
(0504) WriteToCC1000Register(CC1000_PA_POW,PA_VALUE); // Restore PA setting
01CF EF20 LDI R18,0xF0
01D0 E00B LDI R16,0xB
01D1 DEFE RCALL _WriteToCC1000Register
(0505)
(0506) // Return LOCK status to application
(0507) return (lock_status);
01D2 2F04 MOV R16,R20
01D3 940E0391 CALL pop_gset2
01D5 9508 RET
(0508) }
(0509)
(0510) /****************************************************************************/
(0511) /* This routine puts the CC1000 into power down mode. Use WakeUpCC1000ToRX */
(0512) /* followed by SetupCC1000RX or WakeupCC1000ToTX followed by SetupCC1000TX */
(0513) /* to wake up from power down */
(0514) /****************************************************************************/
(0515)
(0516) void SetupCC1000PD(void)
(0517) {
(0518) WriteToCC1000Register(CC1000_MAIN,0x3F); // Put CC1000 into power-down
_SetupCC1000PD:
01D6 E32F LDI R18,0x3F
01D7 2700 CLR R16
01D8 DEF7 RCALL _WriteToCC1000Register
(0519) WriteToCC1000Register(CC1000_PA_POW,0x00); // Turn off PA to minimise current draw
01D9 2722 CLR R18
01DA E00B LDI R16,0xB
01DB DEF4 RCALL _WriteToCC1000Register
01DC 9508 RET
_WakeUpCC1000ToRX:
i --> Y+1
RXPLL --> R20
RXCurrent --> R22
01DD 940E039D CALL push_gset2
01DF 2F42 MOV R20,R18
01E0 2F60 MOV R22,R16
(0520) }
(0521)
(0522) /****************************************************************************/
(0523) /* This routine wakes the CC1000 up from PD mode to RX mode, call */
(0524) /* SetupCC1000RX after this routine is finished. */
(0525) /****************************************************************************/
(0526)
(0527) void WakeUpCC1000ToRX(char RXCurrent,char RXPLL)
(0528) {
(0529) int i;
(0530)
(0531)
(0532) WriteToCC1000Register(CC1000_MAIN,0x3B); // Turn on xtal oscillator core
01E1 E32B LDI R18,0x3B
01E2 2700 CLR R16
01E3 DEEC RCALL _WriteToCC1000Register
(0533) WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX
01E4 2F26 MOV R18,R22
01E5 E009 LDI R16,0x9
01E6 DEE9 RCALL _WriteToCC1000Register
(0534) WriteToCC1000Register(CC1000_PLL,RXPLL); // Use RX refdiv setting
01E7 2F24 MOV R18,R20
01E8 E00C LDI R16,0xC
01E9 DEE6 RCALL _WriteToCC1000Register
(0535)
(0536) // Insert wait routine here, must wait for xtal oscillator to stabilise,
(0537) // typically takes 2-5ms.
(0538) delaycc(38); //35 is 2ms
01EA E206 LDI R16,0x26
01EB E010 LDI R17,0
01EC DE95 RCALL _delaycc
(0539)
(0540) WriteToCC1000Register(CC1000_MAIN,0x39); // Turn on bias generator
01ED E329 LDI R18,0x39
01EE 2700 CLR R16
01EF DEE0 RCALL _WriteToCC1000Register
(0541) // Wait for 250us, insert wait loop here
(0542) delaycc(12);
01F0 E00C LDI R16,0xC
01F1 E010 LDI R17,0
01F2 DE8F RCALL _delaycc
(0543) WriteToCC1000Register(CC1000_MAIN,0x31); // Turn on frequency synthesiser
01F3 E321 LDI R18,0x31
01F4 2700 CLR R16
01F5 DEDA RCALL _WriteToCC1000Register
01F6 940E0391 CALL pop_gset2
01F8 9508 RET
_WakeUpCC1000ToTX:
i --> Y+1
TXPLL --> R20
TXCurrent --> R22
01F9 940E039D CALL push_gset2
01FB 2F42 MOV R20,R18
01FC 2F60 MOV R22,R16
(0544) }
(0545)
(0546) /****************************************************************************/
(0547) /* This routine wakes the CC1000 up from PD mode to TX mode, call */
(0548) /* SetupCC1000TX after this routine is finished. */
(0549) /****************************************************************************/
(0550)
(0551) void WakeUpCC1000ToTX(char TXCurrent,char TXPLL)
(0552) {
(0553) int i;
(0554)
(0555)
(0556) WriteToCC1000Register(CC1000_MAIN,0xFB); // Turn on xtal oscillator core
01FD EF2B LDI R18,0xFB
01FE 2700 CLR R16
01FF DED0 RCALL _WriteToCC1000Register
(0557) WriteToCC1000Register(CC1000_CURRENT,TXCurrent); // Program VCO current for TX
0200 2F26 MOV R18,R22
0201 E009 LDI R16,0x9
0202 DECD RCALL _WriteToCC1000Register
(0558) WriteToCC1000Register(CC1000_PLL,TXPLL); // Use TX refdiv setting
0203 2F24 MOV R18,R20
0204 E00C LDI R16,0xC
0205 DECA RCALL _WriteToCC1000Register
(0559)
(0560) // Insert wait routine here, must wait for xtal oscillator to stabilise,
(0561) // typically takes 2-5ms.
(0562) delaycc(38); //35 is 2ms
0206 E206 LDI R16,0x26
0207 E010 LDI R17,0
0208 DE79 RCALL _delaycc
(0563)
(0564) WriteToCC1000Register(CC1000_MAIN,0xF9); // Turn on bias generator
0209 EF29 LDI R18,0xF9
020A 2700 CLR R16
020B DEC4 RCALL _WriteToCC1000Register
(0565) // Wait for 250us, insert wait loop here
(0566) delaycc(12);
020C E00C LDI R16,0xC
020D E010 LDI R17,0
020E DE73 RCALL _delaycc
(0567) WriteToCC1000Register(CC1000_PA_POW,PA_VALUE); // Turn on PA
020F EF20 LDI R18,0xF0
0210 E00B LDI R16,0xB
0211 DEBE RCALL _WriteToCC1000Register
(0568) WriteToCC1000Register(CC1000_MAIN,0xF1); // Turn on frequency synthesiser
0212 EF21 LDI R18,0xF1
0213 2700 CLR R16
0214 DEBB RCALL _WriteToCC1000Register
0215 940E0391 CALL pop_gset2
0217 9508 RET
(0569) }
(0570)
(0571) /****************************************************************************/
(0572) /* This routine locks the averaging filter of the CC1000 */
(0573) /****************************************************************************/
(0574)
(0575) void AverageManualLockCC1000(void)
(0576) {
(0577) WriteToCC1000Register(CC1000_MODEM1,0x1D);//0x19
_AverageManualLockCC1000:
0218 E12D LDI R18,0x1D
0219 E100 LDI R16,0x10
021A DEB5 RCALL _WriteToCC1000Register
021B 9508 RET
(0578) }
(0579)
(0580) /****************************************************************************/
(0581) /* This routine unlocks the averaging filter of the CC1000 */
(0582) /****************************************************************************/
(0583)
(0584) void AverageFreeRunCC1000(void)
(0585) {
(0586) WriteToCC1000Register(CC1000_MODEM1,0x09);
_AverageFreeRunCC1000:
021C E029 LDI R18,0x9
021D E100 LDI R16,0x10
021E DEB1 RCALL _WriteToCC1000Register
021F 9508 RET
(0587) }
(0588)
(0589) /****************************************************************************/
(0590) /* This routine sets up the averaging filter of the CC1000 for automatic */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -