/************************************************************************************************** * @fn MRFI_WakeUp * * @brief Wake up radio from sleep state. * * @param none * * @return none ************************************************************************************************** */ void MRFI_WakeUp(void) { /* if radio is already awake, just ignore wakeup request */ if (!mrfiRadioIsSleeping) { return; } /* drive CSn low to initiate wakeup */ MRFI_SPI_DRIVE_CSN_LOW(); /* wait for MISO to go high indicating the oscillator is stable */ while (MRFI_SPI_SO_IS_HIGH()); /* wakeup is complete, drive CSn high and continue */ MRFI_SPI_DRIVE_CSN_HIGH(); /* * The test registers must be restored after sleep for the CC1100 and CC2500 radios. * This is not required for the CC1101 radio. */ #ifndef MRFI_CC1101 mrfiSpiWriteReg( MRFI_CC2500_SPI_REG_TEST2, SMARTRF_SETTING_TEST2 ); mrfiSpiWriteReg( MRFI_CC2500_SPI_REG_TEST1, SMARTRF_SETTING_TEST1 ); mrfiSpiWriteReg( MRFI_CC2500_SPI_REG_TEST0, SMARTRF_SETTING_TEST0 ); #endif /* clear any residual SYNC pin interrupt and then re-enable SYNC pin interrupts */ MRFI_CLEAR_SYNC_PIN_INT_FLAG(); MRFI_ENABLE_SYNC_PIN_INT(); /* clear sleep flag and enter receive mode */ mrfiRadioIsSleeping = 0; mrfiSpiCmdStrobe(MRFI_CC2500_SPI_STROBE_SRX); }
/************************************************************************************************** * @fn Mrfi_TurnOnRadioPower * * @brief Power ON the radio chip. * * @param none * * @return none ************************************************************************************************** */ static void Mrfi_TurnOnRadioPower(void) { /* put radio chip into reset */ MRFI_DRIVE_RESETN_PIN_LOW(); /* enable the voltage regulator */ MRFI_DRIVE_VREG_EN_PIN_HIGH(); /* wait for the chip to power up */ Mrfi_DelayUsec(MRFI_VREG_SETTLE_TIME_USECS); /* release from reset */ MRFI_DRIVE_RESETN_PIN_HIGH(); /* wait for the radio crystal oscillator to stabilize */ MRFI_SPI_SET_CHIP_SELECT_ON(); while (!MRFI_SPI_SO_IS_HIGH()); MRFI_SPI_SET_CHIP_SELECT_OFF(); }
/************************************************************************************************** * @fn MRFI_Init * * @brief Initialize MRFI. * * @param none * * @return none ************************************************************************************************** */ void MRFI_Init(void) { /* ------------------------------------------------------------------ * Initialization * ----------------- */ /* initialize radio state variables */ mrfiRxFilterEnabled = 0; mrfiRadioIsSleeping = 0; mrfiTxActive = 0; mrfiRxActive = 0; /* initialize GPIO pins */ MRFI_CONFIG_GDO0_PIN_AS_INPUT(); MRFI_CONFIG_GDO2_PIN_AS_INPUT(); /* initialize SPI */ mrfiSpiInit(); /* ------------------------------------------------------------------ * Radio power-up reset * ---------------------- */ MRFI_ASSERT(MRFI_SPI_CSN_IS_HIGH()); /* pulse CSn low then high */ MRFI_SPI_DRIVE_CSN_LOW(); MRFI_DELAY(10); MRFI_SPI_DRIVE_CSN_HIGH(); /* hold CSn high for at least 40 microseconds */ MRFI_DELAY(100); /* pull CSn low and wait for SO to go low */ MRFI_SPI_DRIVE_CSN_LOW(); while (MRFI_SPI_SO_IS_HIGH()); /* directly send strobe command - cannot use function as it affects CSn pin */ MRFI_SPI_WRITE_BYTE(MRFI_CC2500_SPI_STROBE_SRES); MRFI_SPI_WAIT_DONE(); /* wait for SO to go low again, reset is complete at that point */ while (MRFI_SPI_SO_IS_HIGH()); /* return CSn pin to its default high level */ MRFI_SPI_DRIVE_CSN_HIGH(); /* ------------------------------------------------------------------ * Run-time integrity checks * --------------------------- */ /* verify that SPI is working */ #ifdef MRFI_ASSERTS_ARE_ON #define TEST_VALUE 0xA5 mrfiSpiWriteReg( MRFI_CC2500_SPI_REG_PKTLEN, TEST_VALUE ); MRFI_ASSERT( mrfiSpiReadReg( MRFI_CC2500_SPI_REG_PKTLEN ) == TEST_VALUE ); /* SPI is not responding */ #endif /* verify the correct radio is installed */ MRFI_ASSERT( mrfiSpiReadReg( MRFI_CC2500_SPI_REG_PARTNUM ) == MRFI_RADIO_PARTNUM); /* incorrect radio specified */ MRFI_ASSERT( mrfiSpiReadReg( MRFI_CC2500_SPI_REG_VERSION ) >= MRFI_RADIO_MIN_VERSION); /* obsolete radio specified */ /* ------------------------------------------------------------------ * Configure radio * ----------------- */ /* initialize radio registers */ { uint8_t i; for (i=0; i<(sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])); i++) { mrfiSpiWriteReg(mrfiRadioCfg[i][0], mrfiRadioCfg[i][1]); } } /* send strobe to turn on receiver */ mrfiSpiCmdStrobe(MRFI_CC2500_SPI_STROBE_SRX); /* ------------------------------------------------------------------ * Configure interrupts * ---------------------- */ /* * Configure and enable the SYNC signal interrupt. * * This interrupt is used to indicate receive. The SYNC signal goes * high when a receive OR a transmit begins. It goes high once the * sync word is received or transmitted and then goes low again once * the packet completes. */ MRFI_CONFIG_SYNC_PIN_FALLING_EDGE_INT(); MRFI_CLEAR_SYNC_PIN_INT_FLAG(); MRFI_ENABLE_SYNC_PIN_INT(); /* configure PA_PD signal interrupt */ MRFI_CONFIG_PAPD_FALLING_EDGE_INT(); /* enable global interrupts */ BSP_ENABLE_INTERRUPTS(); }