📄 cc1000avr.lis
字号:
01E0 ;
01E0 ; char SetupCC1000RX(char RXCurrent,char RXPLL)
01E0 ; {
01E0 .dbline 429
01E0 ; int i;
01E0 ; char lock_status;
01E0 ;
01E0 ; WriteToCC1000Register(CC1000_MAIN,0x11); // Switch into RX, switch to freq. reg A
01E0 21E1 ldi R18,17
01E2 0027 clr R16
01E4 5BDF xcall _WriteToCC1000Register
01E6 .dbline 430
01E6 ; WriteToCC1000Register(CC1000_PLL,RXPLL); // Use RX refdiv setting
01E6 262F mov R18,R22
01E8 0CE0 ldi R16,12
01EA 58DF xcall _WriteToCC1000Register
01EC .dbline 431
01EC ; WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX
01EC 242F mov R18,R20
01EE 09E0 ldi R16,9
01F0 55DF xcall _WriteToCC1000Register
01F2 .dbline 434
01F2 ;
01F2 ; // Wait 250us before monitoring LOCK
01F2 ; delaycc(12);
01F2 0CE0 ldi R16,12
01F4 10E0 ldi R17,0
01F6 04DF xcall _delaycc
01F8 .dbline 437
01F8 4EEF ldi R20,32766
01FA 5FE7 ldi R21,127
01FC 02C0 xjmp L60
01FE L57:
01FE .dbline 437
01FE L58:
01FE .dbline 437
01FE 4150 subi R20,1
0200 5040 sbci R21,0
0202 L60:
0202 .dbline 437
0202 ;
0202 ; // Wait for lock
0202 ; for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(i>0); i--);
0202 0DE0 ldi R16,13
0204 6EDF xcall _ReadFromCC1000Register
0206 00FD sbrc R16,0
0208 05C0 rjmp L61
020A 2224 clr R2
020C 3324 clr R3
020E 2416 cp R2,R20
0210 3506 cpc R3,R21
0212 ACF3 brlt L57
0214 L61:
0214 .dbline 440
0214 ;
0214 ; // If PLL in lock
0214 ; if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
0214 0DE0 ldi R16,13
0216 65DF xcall _ReadFromCC1000Register
0218 802F mov R24,R16
021A 8170 andi R24,1
021C 8130 cpi R24,1
021E 11F4 brne L62
0220 .dbline 440
0220 .dbline 442
0220 ; // Indicate PLL in LOCK
0220 ; lock_status = LOCK_OK;
0220 41E0 ldi R20,1
0222 .dbline 444
0222 07C0 xjmp L63
0224 L62:
0224 .dbline 444
0224 ; // Else (PLL out of LOCK)
0224 ; }else{
0224 .dbline 446
0224 ; // If recalibration ok
0224 ; if(CalibrateCC1000()){
0224 A0DF xcall _CalibrateCC1000
0226 0023 tst R16
0228 11F0 breq L64
022A .dbline 446
022A .dbline 448
022A ; // Indicate PLL in LOCK
022A ; lock_status = LOCK_RECAL_OK;
022A 42E0 ldi R20,2
022C .dbline 450
022C 02C0 xjmp L65
022E L64:
022E .dbline 450
022E ; // Else (recalibration failed)
022E ; }else{
022E .dbline 452
022E ; // Reset frequency syncthesizer (ref.: Errata Note 01)
022E ; ResetFreqSynth();
022E B1D0 xcall _ResetFreqSynth
0230 .dbline 454
0230 ; // Indicate PLL out of LOCK
0230 ; lock_status = LOCK_NOK;
0230 4427 clr R20
0232 .dbline 455
0232 ; }
0232 L65:
0232 .dbline 456
0232 ; }
0232 L63:
0232 .dbline 459
0232 ;
0232 ; // Return LOCK status to application
0232 ; return (lock_status);
0232 042F mov R16,R20
0234 .dbline -2
0234 L56:
0234 0E940000 xcall pop_gset2
0238 .dbline 0 ; func end
0238 0895 ret
023A .dbsym r lock_status 20 c
023A .dbsym r i 20 I
023A .dbsym r RXPLL 22 c
023A .dbsym r RXCurrent 20 c
023A .dbend
023A .dbfunc e SetupCC1000TX _SetupCC1000TX fc
023A ; lock_status -> R20
023A ; i -> R20,R21
023A ; TXPLL -> R22
023A ; TXCurrent -> R20
.even
023A _SetupCC1000TX::
023A 0E940000 xcall push_gset2
023E 622F mov R22,R18
0240 402F mov R20,R16
0242 .dbline -1
0242 .dbline 468
0242 ; }
0242 ;
0242 ; /****************************************************************************/
0242 ; /* This routine puts the CC1000 into TX mode (from RX). When switching to */
0242 ; /* TX from PD, use WakeupCC1000ToTX first */
0242 ; /****************************************************************************/
0242 ;
0242 ; char SetupCC1000TX(char TXCurrent,char TXPLL)
0242 ; {
0242 .dbline 472
0242 ; int i;
0242 ; char lock_status;
0242 ;
0242 ; WriteToCC1000Register(CC1000_PA_POW,0x00); // Turn off PA to avoid frequency splatter
0242 2227 clr R18
0244 0BE0 ldi R16,11
0246 2ADF xcall _WriteToCC1000Register
0248 .dbline 474
0248 ;
0248 ; WriteToCC1000Register(CC1000_MAIN,0xE1); // Switch into TX, switch to freq. reg B
0248 21EE ldi R18,225
024A 0027 clr R16
024C 27DF xcall _WriteToCC1000Register
024E .dbline 475
024E ; WriteToCC1000Register(CC1000_PLL,TXPLL); // Use TX refdiv setting
024E 262F mov R18,R22
0250 0CE0 ldi R16,12
0252 24DF xcall _WriteToCC1000Register
0254 .dbline 476
0254 ; WriteToCC1000Register(CC1000_CURRENT,TXCurrent); // Program VCO current for TX
0254 242F mov R18,R20
0256 09E0 ldi R16,9
0258 21DF xcall _WriteToCC1000Register
025A .dbline 479
025A ;
025A ; // Wait 250us before monitoring LOCK
025A ; delaycc(12);
025A 0CE0 ldi R16,12
025C 10E0 ldi R17,0
025E D0DE xcall _delaycc
0260 .dbline 482
0260 4EEF ldi R20,32766
0262 5FE7 ldi R21,127
0264 02C0 xjmp L70
0266 L67:
0266 .dbline 482
0266 L68:
0266 .dbline 482
0266 4150 subi R20,1
0268 5040 sbci R21,0
026A L70:
026A .dbline 482
026A ;
026A ; // Wait for lock
026A ; for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(i>0); i--);
026A 0DE0 ldi R16,13
026C 3ADF xcall _ReadFromCC1000Register
026E 00FD sbrc R16,0
0270 05C0 rjmp L71
0272 2224 clr R2
0274 3324 clr R3
0276 2416 cp R2,R20
0278 3506 cpc R3,R21
027A ACF3 brlt L67
027C L71:
027C .dbline 485
027C ;
027C ; // If PLL in lock
027C ; if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
027C 0DE0 ldi R16,13
027E 31DF xcall _ReadFromCC1000Register
0280 802F mov R24,R16
0282 8170 andi R24,1
0284 8130 cpi R24,1
0286 11F4 brne L72
0288 .dbline 485
0288 .dbline 487
0288 ; // Indicate PLL in LOCK
0288 ; lock_status = LOCK_OK;
0288 41E0 ldi R20,1
028A .dbline 489
028A 07C0 xjmp L73
028C L72:
028C .dbline 489
028C ; // Else (PLL out of LOCK)
028C ; }else{
028C .dbline 491
028C ; // If recalibration ok
028C ; if(CalibrateCC1000()){
028C 6CDF xcall _CalibrateCC1000
028E 0023 tst R16
0290 11F0 breq L74
0292 .dbline 491
0292 .dbline 493
0292 ; // Indicate PLL in LOCK
0292 ; lock_status = LOCK_RECAL_OK;
0292 42E0 ldi R20,2
0294 .dbline 495
0294 02C0 xjmp L75
0296 L74:
0296 .dbline 495
0296 ; // Else (recalibration failed)
0296 ; }else{
0296 .dbline 497
0296 ; // Reset frequency syncthesizer (ref.: Errata Note 01)
0296 ; ResetFreqSynth();
0296 7DD0 xcall _ResetFreqSynth
0298 .dbline 499
0298 ; // Indicate PLL out of LOCK
0298 ; lock_status = LOCK_NOK;
0298 4427 clr R20
029A .dbline 500
029A ; }
029A L75:
029A .dbline 501
029A ; }
029A L73:
029A .dbline 504
029A ;
029A ; // Increase output power
029A ; WriteToCC1000Register(CC1000_PA_POW,PA_VALUE); // Restore PA setting
029A 20EF ldi R18,240
029C 0BE0 ldi R16,11
029E FEDE xcall _WriteToCC1000Register
02A0 .dbline 507
02A0 ;
02A0 ; // Return LOCK status to application
02A0 ; return (lock_status);
02A0 042F mov R16,R20
02A2 .dbline -2
02A2 L66:
02A2 0E940000 xcall pop_gset2
02A6 .dbline 0 ; func end
02A6 0895 ret
02A8 .dbsym r lock_status 20 c
02A8 .dbsym r i 20 I
02A8 .dbsym r TXPLL 22 c
02A8 .dbsym r TXCurrent 20 c
02A8 .dbend
02A8 .dbfunc e SetupCC1000PD _SetupCC1000PD fV
.even
02A8 _SetupCC1000PD::
02A8 .dbline -1
02A8 .dbline 517
02A8 ; }
02A8 ;
02A8 ; /****************************************************************************/
02A8 ; /* This routine puts the CC1000 into power down mode. Use WakeUpCC1000ToRX */
02A8 ; /* followed by SetupCC1000RX or WakeupCC1000ToTX followed by SetupCC1000TX */
02A8 ; /* to wake up from power down */
02A8 ; /****************************************************************************/
02A8 ;
02A8 ; void SetupCC1000PD(void)
02A8 ; {
02A8 .dbline 518
02A8 ; WriteToCC1000Register(CC1000_MAIN,0x3F); // Put CC1000 into power-down
02A8 2FE3 ldi R18,63
02AA 0027 clr R16
02AC F7DE xcall _WriteToCC1000Register
02AE .dbline 519
02AE ; WriteToCC1000Register(CC1000_PA_POW,0x00); // Turn off PA to minimise current draw
02AE 2227 clr R18
02B0 0BE0 ldi R16,11
02B2 F4DE xcall _WriteToCC1000Register
02B4 .dbline -2
02B4 L76:
02B4 .dbline 0 ; func end
02B4 0895 ret
02B6 .dbend
02B6 .dbfunc e WakeUpCC1000ToRX _WakeUpCC1000ToRX fV
02B6 ; i -> <dead>
02B6 ; RXPLL -> R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -