Witam,
Zbudowalem maly system do transmisji bezprzewodowej na bazie CC1000. Wszystko dziala ok poza budzeniem CC1000 z power down. Stosuje procedury opisane w datasheet'cie oraz korzystam z dostępnych bibliotek. Niestety rzaden z tych sposobow nie dziala. Program pisze w C i wg datasheet'a po "power down" nalezy obudzic urzadzenie dla RX lub TX poprzez odpowiednie zaprogramowanie rejestru Main i wykonanie kilku petli opozniajacych. Niestety cos jest nie tak i brak mi juz pomyslow.
Musze wylaczac uklad na okolo 5sek a nastepnie wlaczyc go na okolo 0.5sek i tak w nieskonczonosc. Ta petla czasowa ma zmniejszyc zurzycie baterii.
Przejscie modulu do stanu supienia realizuje procedura:
void SetupCC1000PD(void)
{
WriteToCC1000Register(CC1000_PA_POW,0x00);
WriteToCC1000Register(CC1000_MAIN,0x3F);
}
Wyjscie z tego stanu:
void PowerUpCC1000(void)
{
WakeUpCC1000ToRX(RX_Current);
SetupCC1000RX(RX_Current);
}
gdzie:
void WakeUpCC1000ToRX(char RXCurrent)
{
int i;
WriteToCC1000Register(CC1000_MAIN,0x3B); // Turn on xtal oscillator core
WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX
WriteToCC1000Register(CC1000_PLL,RX_PLL); // Use RX refdiv setting
// Insert wait routine here, must wait for xtal oscillator to stabilise,
// typically takes 2-5ms.
for (i=0;i<0x7FFE;i++);
WriteToCC1000Register(CC1000_MAIN,0x39); // Turn on bias generator
// Wait for 250us, insert wait loop here
// for (i=0;i<0x1000;i++);
WriteToCC1000Register(CC1000_MAIN,0x31); // Turn on frequency synthesiser
}
char SetupCC1000RX(char RXCurrent)
{
int i;
char lock_status;
WriteToCC1000Register(CC1000_MAIN,0x11); // Switch into RX, switch to freq. reg A
WriteToCC1000Register(CC1000_PLL,RX_PLL); // Use RX refdiv setting
WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX
// Wait 250us before monitoring LOCK
for (i=0;i<0x1000;i++);
// Wait for lock
for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(i>0); i--);
// If PLL in lock
if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
// Indicate PLL in LOCK
lock_status = LOCK_OK;
// Else (PLL out of LOCK)
}else{
// If recalibration ok
if(CalibrateCC1000()){
// Indicate PLL in LOCK
lock_status = LOCK_RECAL_OK;
// Else (recalibration failed)
}else{
// Reset frequency syncthesizer (ref.: Errata Note 01)
ResetFreqSynth();
// Indicate PLL out of LOCK
lock_status = LOCK_NOK;
}
}
// Return LOCK status to application
return (lock_status);
}
Jesli ktos wie jak dobie poradzic z tym problemem, prosze o odpowiedz na moj problem.
Pozdrawiam,
kamilcgi_
Zbudowalem maly system do transmisji bezprzewodowej na bazie CC1000. Wszystko dziala ok poza budzeniem CC1000 z power down. Stosuje procedury opisane w datasheet'cie oraz korzystam z dostępnych bibliotek. Niestety rzaden z tych sposobow nie dziala. Program pisze w C i wg datasheet'a po "power down" nalezy obudzic urzadzenie dla RX lub TX poprzez odpowiednie zaprogramowanie rejestru Main i wykonanie kilku petli opozniajacych. Niestety cos jest nie tak i brak mi juz pomyslow.
Musze wylaczac uklad na okolo 5sek a nastepnie wlaczyc go na okolo 0.5sek i tak w nieskonczonosc. Ta petla czasowa ma zmniejszyc zurzycie baterii.
Przejscie modulu do stanu supienia realizuje procedura:
void SetupCC1000PD(void)
{
WriteToCC1000Register(CC1000_PA_POW,0x00);
WriteToCC1000Register(CC1000_MAIN,0x3F);
}
Wyjscie z tego stanu:
void PowerUpCC1000(void)
{
WakeUpCC1000ToRX(RX_Current);
SetupCC1000RX(RX_Current);
}
gdzie:
void WakeUpCC1000ToRX(char RXCurrent)
{
int i;
WriteToCC1000Register(CC1000_MAIN,0x3B); // Turn on xtal oscillator core
WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX
WriteToCC1000Register(CC1000_PLL,RX_PLL); // Use RX refdiv setting
// Insert wait routine here, must wait for xtal oscillator to stabilise,
// typically takes 2-5ms.
for (i=0;i<0x7FFE;i++);
WriteToCC1000Register(CC1000_MAIN,0x39); // Turn on bias generator
// Wait for 250us, insert wait loop here
// for (i=0;i<0x1000;i++);
WriteToCC1000Register(CC1000_MAIN,0x31); // Turn on frequency synthesiser
}
char SetupCC1000RX(char RXCurrent)
{
int i;
char lock_status;
WriteToCC1000Register(CC1000_MAIN,0x11); // Switch into RX, switch to freq. reg A
WriteToCC1000Register(CC1000_PLL,RX_PLL); // Use RX refdiv setting
WriteToCC1000Register(CC1000_CURRENT,RXCurrent); // Program VCO current for RX
// Wait 250us before monitoring LOCK
for (i=0;i<0x1000;i++);
// Wait for lock
for(i=LOCK_TIMEOUT; ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0)&&(i>0); i--);
// If PLL in lock
if ((ReadFromCC1000Register(CC1000_LOCK)&0x01)==0x01){
// Indicate PLL in LOCK
lock_status = LOCK_OK;
// Else (PLL out of LOCK)
}else{
// If recalibration ok
if(CalibrateCC1000()){
// Indicate PLL in LOCK
lock_status = LOCK_RECAL_OK;
// Else (recalibration failed)
}else{
// Reset frequency syncthesizer (ref.: Errata Note 01)
ResetFreqSynth();
// Indicate PLL out of LOCK
lock_status = LOCK_NOK;
}
}
// Return LOCK status to application
return (lock_status);
}
Jesli ktos wie jak dobie poradzic z tym problemem, prosze o odpowiedz na moj problem.
Pozdrawiam,
kamilcgi_