📄 rfsetrxtxoff.c
字号:
/*****************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** +++ *** *
* *** + + *** *
* *** + CHIPCON CC1010 *
* *** + + *** HAL - RFSetRxTxOff *
* *** +++ *** *
* *** *** *
* *********** *
* ********* *
* *
*****************************************************************************
* *
*****************************************************************************
* Author: ROH *
*****************************************************************************
* Revision history: *
* *
* $Log: RFSetRxTxOff.c,v $
* Revision 1.2 2003/05/12 09:59:26 tos
* Corrections according to Errata Note 01: recalibrate if unable to lock PLL.
*
* Revision 1.1.2.3 2003/05/12 07:06:46 tos
* Corrections according to Errata Note 01: recalibrate if unable to lock PLL.
*
* Revision 1.1.2.2 2003/04/28 15:13:49 tos
* Preparation for release: removed LED control for LOCK status indication.
*
* Revision 1.1.2.1 2003/04/28 14:36:14 tos
* Added LOCK monitor.
*
* Revision 1.1 2002/10/14 13:04:35 tos
* Initial version in CVS.
*
* *
****************************************************************************/
#include <chipcon/hal.h>
// Variables that are used to override baudrate and PA output power
extern byte xdata hal_dataformat_override,
hal_baudrate_override,
hal_pa_pow_override,
hal_modem0_original,
hal_pa_pow_original;
//----------------------------------------------------------------------------
// void halRFSetRxTxOff(...)
//
// Description:
// Function used to set a specific RX/TX channel pair as the current RF
// configuration. The _mode_ parameter is used to select between
// activating RF in RX or TX or turning off RF.
//
// Arguments:
// byte mode
// Options given below. Turn off, turn on in RX, or on in TX. If
// RF_OFF is supplied the two pointers can be NULL.
// RF_RXTXPAIR_SETTINGS* rf_settings
// Pointer to a RF_RXTXPAIR_SETTINGS data structure containing the
// settings for an RX/TX channel pair (exported from SmartRF Studio.)
// RF_RXTXPAIR_CALDATA xdata* rf_caldata
// A pointer to a RF_RXTXPAIR_CALDATA data structure which will be
// filled with the results from the calibration.
//
// Return value:
// void
//----------------------------------------------------------------------------
LOCK_STATUS halRFSetRxTxOff(byte mode, RF_RXTXPAIR_SETTINGS code* rf_settings, RF_RXTXPAIR_CALDATA xdata* rf_caldata) {
byte code* ptr=rf_settings;
byte n;
int i;
LOCK_STATUS lock_status = LOCK_NOK;
if (mode==RF_OFF) {
RFMAIN=0x38; // RX, TX, FS powered down
return (LOCK_NOK);
}
n = 0;
MODEM0=hal_modem0_original=ptr[n++];
if (hal_baudrate_override&0x01)
MODEM0=(MODEM0&0x1F)|(hal_baudrate_override&0xE0);
if (hal_dataformat_override&0x01)
MODEM0=(MODEM0&0xE7)|(hal_dataformat_override&0x18);
MODEM1=ptr[n++];
MODEM2=ptr[n++];
FREQ_2A=ptr[n++];
FREQ_1A=ptr[n++];
FREQ_0A=ptr[n++];
FREQ_2B=ptr[n++];
FREQ_1B=ptr[n++];
FREQ_0B=ptr[n++];
FSEP1=ptr[n++];
FSEP0=ptr[n++];
if (mode==RF_RX) {
PLL=ptr[n++]; // pll_rx
n++;
RFMAIN=0x30;
TEST5=0x10 | rf_caldata->vco_ao_rx;
TEST6=0x20 | rf_caldata->chp_co_rx;
CURRENT=ptr[n++];
n++;
} else {
n++;
PLL=ptr[n++]; // pll_tx
RFMAIN=0xF0;
TEST5=0x10 | rf_caldata->vco_ao_tx;
TEST6=0x3B;
n++;
CURRENT=ptr[n++];
}
FREND=ptr[n++];
// Wait 200 usec before monitoring LOCK
for(i=LOCK_MONITOR_DELAY; i>0; i--);
// Wait for lock
for(i=LOCK_TIMEOUT; !(LOCK&0x01) && (i>0); i--);
// If PLL in LOCK
if(LOCK&0x01){
// Indicate PLL in LOCK
lock_status = LOCK_OK;
// Else (PLL out of LOCK)
}else{
// Start recalibration, wait for completion
CAL |= 0x80; // Start calibration
for(i=CAL_TIMEOUT; !(CAL&0x08) && (i>0); i--); // Wait until finished (max 34 ms)
CAL &= ~0x80;
// Wait for lock
for(i=LOCK_TIMEOUT; !(LOCK&0x01) && (i>0); i--);
// If recalibration ok
if(LOCK&0x01){
// Indicate PLL in LOCK
lock_status = LOCK_RECAL_OK;
// Else (recalibration failed)
}else{
// Reset frequency synthesizer
RF_RESET_FREQSYNTH;
// Indicate PLL in LOCK
lock_status = LOCK_NOK;
}
}
PA_POW=hal_pa_pow_original=ptr[n++];
if (hal_pa_pow_override)
PA_POW=hal_pa_pow_override;
MATCH=ptr[n++];
PRESCALER=ptr[n++];
return(lock_status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -