char SetupCC1020RX(char RXANALOG1, char PA_POWER1) { volatile int TimeOutCounter; char lock_status; // Turn ON DCLK_CS (Carrier Sense Squelch) in RX WriteToCC1020Register(CC1020_INTERFACE,ReadFromCC1020Register(CC1020_INTERFACE) | 0x10); // Switch into RX, switch to freq. reg A WriteToCC1020Register(CC1020_MAIN,0x11); // Setup bias current adjustment WriteToCC1020Register(CC1020_ANALOG,RXANALOG); // Monitor LOCK for(TimeOutCounter=30; ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0)&&(TimeOutCounter>0); TimeOutCounter--) { _delay_ms(1); } // If PLL in lock if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10) { lock_status = TRUE; sbi(PORTA,LED_PLL); } else // Recalibrate { // If recalibration ok if(CalibrateCC1020(PA_POWER1)) { lock_status = TRUE; sbi(PORTA,LED_PLL); // Else (recalibration failed) } else { lock_status = FALSE; cbi(PORTA,LED_PLL); } } // Switch RX part of CC1020 on // RX coming out of PD at this stage WriteToCC1020Register(CC1020_MAIN,0x01); // Configure LOCK pin to continuous lock status. Active low indicates PLL in lock //WriteToCC1020Register(CC1020_LOCK,0x20); // Configure LOCK pin to indicate carrier sense. Active low when RSSI above threshold WriteToCC1020Register(CC1020_LOCK,0x40); // Return LOCK status to application return (lock_status); }
char SetupCC1020TX(char TXANALOG1, char PA_POWER1) { volatile int TimeOutCounter; int lock_status; // Turn off PA to avoid frequency splatter WriteToCC1020Register(CC1020_PA_POWER,0x00); // Setup bias current adjustment WriteToCC1020Register(CC1020_ANALOG,TXANALOG1); // Switch into TX, switch to freq. reg B WriteToCC1020Register(CC1020_MAIN,0xC1); // TX Coming out of Power down at this stage // Monitor lock // LOCK_CONTINUOUS bit set to 1 when PLL is in LOCK for(TimeOutCounter=30; ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x00)&&(TimeOutCounter>0); TimeOutCounter--) { _delay_ms(1); } // If PLL in lock if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10) { lock_status = TRUE; sbi(PORTA,LED_PLL); } else // if PLL is not locked then Recalibrate { // If recalibration ok if(CalibrateCC1020(PA_POWER1)) { lock_status = TRUE; sbi(PORTA,LED_PLL); // Else (recalibration failed) } else { lock_status = FALSE; cbi(PORTA,LED_PLL); } } // Restore PA setting WriteToCC1020Register(CC1020_PA_POWER,PA_POWER1); // Turn OFF DCLK_CS (Carrier Sense Squelch) in TX WriteToCC1020Register(CC1020_INTERFACE,ReadFromCC1020Register(CC1020_INTERFACE)&~0x10); // Configure LOCK pin to continuous lock status. Active low indicates PLL in lock WriteToCC1020Register(CC1020_LOCK,0x20); // Return LOCK status to application return (lock_status); }
int init_CC1020 (void){ //init_SPI_trans(CC1020); SetupCC1020PD(); ResetCC1020();//CC is still in PD (Power_Down mode) after reset SetupCC1020Allregisters(); WakeUpCC1020ToRX(RXANALOG); CalibrateCC1020 (PA_POWER); WakeUpCC1020ToRX(RXANALOG); return SetupCC1020RX(RXANALOG,PA_POWER); }