/** * @brief This function will turn on the radio and waits till it enters the Ready state. * @param Param:None. * @retval None * */ void RadioPowerON(void) { SpiritCmdStrobeReady(); do{ /* Delay for state transition */ for(volatile uint8_t i=0; i!=0xFF; i++); /* Reads the MC_STATUS register */ SpiritRefreshStatus(); } while(g_xStatus.MC_STATE!=MC_STATE_READY); }
uint8_t SpiritManagementWaVcoCalibration(void) { uint8_t s_cVcoWordRx; uint8_t s_cVcoWordTx; uint32_t nFreq; uint8_t cRestore = 0; uint8_t cStandby = 0; uint32_t xtal_frequency = SpiritRadioGetXtalFrequency(); /* Enable the reference divider if the XTAL is between 48 and 52 MHz */ if(xtal_frequency>26000000) { if(!SpiritRadioGetRefDiv()) { cRestore = 1; nFreq = SpiritRadioGetFrequencyBase(); SpiritRadioSetRefDiv(S_ENABLE); SpiritManagementSetFrequencyBase(nFreq); } } nFreq = SpiritRadioGetFrequencyBase(); /* Increase the VCO current */ uint8_t tmp = 0x19; SpiritSpiWriteRegisters(0xA1,1,&tmp); SpiritCalibrationVco(S_ENABLE); SpiritRefreshStatus(); if(g_xStatus.MC_STATE == MC_STATE_STANDBY) { cStandby = 1; SpiritCmdStrobeReady(); do{ SpiritRefreshStatus(); if(g_xStatus.MC_STATE == 0x13) { return 1; } }while(g_xStatus.MC_STATE != MC_STATE_READY); } SpiritCmdStrobeLockTx(); do{ SpiritRefreshStatus(); if(g_xStatus.MC_STATE == 0x13) { return 1; } }while(g_xStatus.MC_STATE != MC_STATE_LOCK); s_cVcoWordTx = SpiritCalibrationGetVcoCalData(); SpiritCmdStrobeReady(); do{ SpiritRefreshStatus(); }while(g_xStatus.MC_STATE != MC_STATE_READY); SpiritCmdStrobeLockRx(); do{ SpiritRefreshStatus(); if(g_xStatus.MC_STATE == 0x13) { return 1; } }while(g_xStatus.MC_STATE != MC_STATE_LOCK); s_cVcoWordRx = SpiritCalibrationGetVcoCalData(); SpiritCmdStrobeReady(); do{ SpiritRefreshStatus(); if(g_xStatus.MC_STATE == 0x13) { return 1; } }while(g_xStatus.MC_STATE != MC_STATE_READY); if(cStandby == 1) { SpiritCmdStrobeStandby(); } SpiritCalibrationVco(S_DISABLE); /* Disable the reference divider if the XTAL is between 48 and 52 MHz */ if(cRestore) { SpiritRadioSetRefDiv(S_DISABLE); SpiritManagementSetFrequencyBase(nFreq); } /* Restore the VCO current */ tmp = 0x11; SpiritSpiWriteRegisters(0xA1,1,&tmp); SpiritCalibrationSetVcoCalDataTx(s_cVcoWordTx); SpiritCalibrationSetVcoCalDataRx(s_cVcoWordRx); return 0; }