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

📄 rfsetrxtxoff.c

📁 ti-Chipcon CC1010 1G以下Soc源码库。包括rf,powermodes,clockmodes,flashRW,interrupts,timer,pwm,uart...所有底层驱动源码
💻 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 + -