⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hello.lst

📁 CC1000通信
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -