/************************************************************************************************** * @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 mrfiSpiInit * * @brief Initialize SPI. * * @param none * * @return none ************************************************************************************************** */ void mrfiSpiInit(void) { #ifdef MRFI_TIMER_ALWAYS_ACTIVE sActiveSPI = false; // initialize interface status #endif /* configure all SPI related pins */ MRFI_SPI_CONFIG_CSN_PIN_AS_OUTPUT(); MRFI_SPI_CONFIG_SCLK_PIN_AS_OUTPUT(); MRFI_SPI_CONFIG_SI_PIN_AS_OUTPUT(); MRFI_SPI_CONFIG_SO_PIN_AS_INPUT(); /* set CSn to default high level */ MRFI_SPI_DRIVE_CSN_HIGH(); /* initialize the SPI registers */ MRFI_SPI_INIT(); }
/************************************************************************************************** * @fn mrfiSpiInit * * @brief Initialize SPI. * * @param none * * @return none ************************************************************************************************** */ void mrfiSpiInit(void) { /* configure all SPI related pins */ MRFI_SPI_CONFIG_CSN_PIN_AS_OUTPUT(); MRFI_SPI_CONFIG_SCLK_PIN_AS_OUTPUT(); MRFI_SPI_CONFIG_SI_PIN_AS_OUTPUT(); MRFI_SPI_CONFIG_SO_PIN_AS_INPUT(); /* set CSn to default high level */ MRFI_SPI_DRIVE_CSN_HIGH(); /* initialize the SPI registers */ MRFI_SPI_INIT(); /* USART0 in SPI mode (Port 3) */ /*P3SEL |= ((0x01 << 1) | (0x01 << 3) | (0x01 << 2)); // Select Peripheral functionality (SPI: SIMO, SOI, SCK) P3DIR |= ((0x01 << 1) | (0x01 << 3)); // Configure as outputs(SIMO,SCK) P3DIR &= ~(0x01 << 2); // Configure as inputs(SOMI)*/ /* Perform SPI module initialization */ /*U0CTL = CHAR + SYNC + MM + SWRST; // SPI mode, 8-bit transfer, Listen disabled, SPI master, SW reset (c[2]p14-14) U0TCTL = CKPH + SSEL1 + STC; // Data on Rising Edge, SMCLK, 3-wire SPI mode (c[2]p14-15) U0BR0 = 0x04; // SPICLK set baud (c[2]p14-17) U0BR1 = 0; // Dont need baud rate control register 2 - clear it (c[2]p14-15) U0MCTL = 0; // Dont need modulation control (c[2]p14-15) ME1 |= USPIE0; // Module 0 enabled (c[2]p14-19) U0CTL &= ~SWRST; // Remove RESET (c[2]p14-14) //IE1 &= ~(UTXIE0); // no interrupt on SPI tx, active polling on U0TCTL.TXEPT //IE1 &= ~(URXIE0); // toverify, active polling on IFG2.URXIFG0 //wait delay int i,j; for(j=0; j < 0x100; j++) { for (i = 0; i < 0xff; i++) { __no_operation(); __no_operation(); } }*/ }
/************************************************************************************************** * @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(); }