📄 mrfi_radio.c
字号:
}
/**************************************************************************************************
* @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(mrfiRadioState != MRFI_RADIO_STATE_OFF)
{
return;
}
/* drive CSn low to initiate wakeup */
//MRFI_SPI_DRIVE_CSN_LOW();
GPIO_ResetBits(CSPort, CSPICSN);
/* wait for MISO to go high indicating the oscillator is stable */
//while (MRFI_SPI_SO_IS_HIGH());
//while( !(GPIO_ReadValue(CSPIPort) & CSPISO));
while( !(GPIO_ReadInput(CSPIPort) & CSPISO) );
/* wakeup is complete, drive CSn high and continue */
//MRFI_SPI_DRIVE_CSN_HIGH();
GPIO_SetBits(CSPort, CSPICSN);
/*
* 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( TEST2, SMARTRF_SETTING_TEST2 );
mrfiSpiWriteReg( TEST1, SMARTRF_SETTING_TEST1 );
mrfiSpiWriteReg( TEST0, SMARTRF_SETTING_TEST0 );
#endif
/* enter idle mode */
mrfiRadioState = MRFI_RADIO_STATE_IDLE;
MRFI_STROBE_IDLE_AND_WAIT();
}
/**************************************************************************************************
* @fn MRFI_GpioIsr
*
* @brief Interrupt Service Routine for handling GPIO interrupts. The sync pin interrupt
* comes in through GPIO. This function is designed to be compatible with "ganged"
* interrupts. If the GPIO interrupt services more than just a single pin (very
* common), this function just needs to be called from the higher level interrupt
* service routine.
*
* @param none
*
* @return none
**************************************************************************************************
*/
void MRFI_GpioIsr(void)
{
/* see if sync pin interrupt is enabled and has fired */
//if (MRFI_SYNC_PIN_INT_IS_ENABLED() && MRFI_SYNC_PIN_INT_FLAG_IS_SET())
{
/* clear the sync pin interrupt, run sync pin ISR */
/*
* NOTE! The following macro clears the interrupt flag but it also *must*
* reset the interrupt capture. In other words, if a second interrupt
* occurs after the flag is cleared it must be processed, i.e. this interrupt
* exits then immediately starts again. Most microcontrollers handle this
* naturally but it must be verified for every target.
*/
//MRFI_CLEAR_SYNC_PIN_INT_FLAG();
//Mrfi_SyncPinRxIsr();
}
}
/**************************************************************************************************
* @fn MRFI_Rssi
*
* @brief Returns "live" RSSI value
*
* @param none
*
* @return RSSI value in units of dBm.
**************************************************************************************************
*/
int8_t MRFI_Rssi(void)
{
uint8_t regValue;
/* Radio must be in RX state to measure rssi. */
MRFI_ASSERT( mrfiRadioState == MRFI_RADIO_STATE_RX );
/* Wait for the RSSI to be valid:
* Just having the Radio ON is not enough to read
* the correct RSSI value. The Radio must in RX mode for
* a certain duration. This duration depends on
* the baud rate and the received signal strength itself.
*/
MRFI_RSSI_VALID_WAIT();
/* Read the RSSI value */
regValue = mrfiSpiReadReg( RSSI );
/* convert and do offset compensation */
return( Mrfi_CalculateRssi(regValue) );
}
/**************************************************************************************************
* @fn Mrfi_CalculateRssi
*
* @brief Does binary to decimal conversiont and offset compensation.
*
* @param none
*
* @return RSSI value in units of dBm.
**************************************************************************************************
*/
int8_t Mrfi_CalculateRssi(uint8_t rawValue)
{
int16_t rssi;
/* The raw value is in 2's complement and in half db steps. Convert it to
* decimal taking into account the offset value.
*/
if(rawValue >= 128)
{
rssi = (int16_t)(rawValue - 256)/2 - MRFI_RSSI_OFFSET;
}
else
{
rssi = (rawValue/2) - MRFI_RSSI_OFFSET;
}
/* Restrict this value to least value can be held in an 8 bit signed int */
if(rssi < -128)
{
rssi = -128;
}
return rssi;
}
/**************************************************************************************************
* @fn MRFI_RandomByte
*
* @brief Returns a random byte. This is a pseudo-random number generator.
* The generated sequence will repeat every 256 values.
* The sequence itself depends on the initial seed value.
*
* @param none
*
* @return a random byte
**************************************************************************************************
*/
uint8_t MRFI_RandomByte(void)
{
mrfiRndSeed = (mrfiRndSeed*MRFI_RANDOM_MULTIPLIER) + MRFI_RANDOM_OFFSET;
return mrfiRndSeed;
}
/**************************************************************************************************
* @fn Mrfi_RandomBackoffDelay
*
* @brief -
*
* @param none
*
* @return none
**************************************************************************************************
*/
//static void Mrfi_RandomBackoffDelay(void)
//{
// uint8_t backoffs;
// uint8_t i;
//
// /* calculate random value for backoffs - 1 to 16 */
// backoffs = (MRFI_RandomByte() & 0x0F) + 1;
//
// /* delay for randomly computed number of backoff periods */
// for (i=0; i<backoffs; i++)
// {
// Mrfi_DelayUsec( sBackoffHelper );
// }
//}
/****************************************************************************************************
* @fn Mrfi_DelayUsec
*
* @brief Execute a delay loop using HW timer. The macro actually used to do the delay
* is not thread-safe. This routine makes the delay execution thread-safe by breaking
* up the requested delay up into small chunks and executing each chunk as a critical
* section. The chunk size is choosen to be the smallest value used by MRFI. The delay
* is only approximate because of the overhead computations. It errs on the side of
* being too long.
*
* input parameters
* @param howLong - number of microseconds to delay
*
* @return none
****************************************************************************************************
*/
static void Mrfi_DelayUsec(uint16_t howLong)
{
bspIState_t s;
int i=0;
uint16_t count = howLong/MRFI_MAX_DELAY_US;
if (howLong)
{
do
{
BSP_ENTER_CRITICAL_SECTION(s);
//BSP_DELAY_USECS(MRFI_MAX_DELAY_US);
BSP_EXIT_CRITICAL_SECTION(s);
for( i=0; i<50; i++)
{
}
} while (count--);
}
return;
}
/****************************************************************************************************
* @fn Mrfi_DelayUsecSem
*
* @brief Execute a delay loop using a HW timer. See comments for Mrfi_DelayUsec().
* Delay specified number of microseconds checking semaphore for
* early-out. Run in a separate thread when the reply delay is
* invoked. Cleaner then trying to make MRFI_DelayUsec() thread-safe
* and reentrant.
*
* input parameters
* @param howLong - number of microseconds to delay
*
* @return none
****************************************************************************************************
*/
static void Mrfi_DelayUsecSem(uint16_t howLong)
{
bspIState_t s;
uint16_t count = howLong/MRFI_MAX_DELAY_US;
if (howLong)
{
do
{
BSP_ENTER_CRITICAL_SECTION(s);
// BSP_DELAY_USECS(MRFI_MAX_DELAY_US);
BSP_EXIT_CRITICAL_SECTION(s);
if (sKillSem)
{
break;
}
} while (count--);
}
return;
}
/**************************************************************************************************
* @fn MRFI_DelayMs
*
* @brief Delay the specified number of milliseconds.
*
* @param milliseconds - delay time
*
* @return none
**************************************************************************************************
*/
void MRFI_DelayMs(uint16_t milliseconds)
{
while (milliseconds)
{
Mrfi_DelayUsec( APP_USEC_VALUE );
milliseconds--;
}
}
/**************************************************************************************************
* @fn MRFI_ReplyDelay
*
* @brief Delay number of milliseconds scaled by data rate. Check semaphore for
* early-out. Run in a separate thread when the reply delay is
* invoked. Cleaner then trying to make MRFI_DelayMs() thread-safe
* and reentrant.
*
* @param none
*
* @return none
**************************************************************************************************
*/
void MRFI_ReplyDelay()
{
bspIState_t s=0;
uint16_t milliseconds = sReplyDelayScalar;
BSP_ENTER_CRITICAL_SECTION(s);
sReplyDelayContext = 1;
BSP_EXIT_CRITICAL_SECTION(s);
while (milliseconds)
{
Mrfi_DelayUsecSem( APP_USEC_VALUE );
if (sKillSem)
{
break;
}
milliseconds--;
}
BSP_ENTER_CRITICAL_SECTION(s);
sKillSem = 0;
sReplyDelayContext = 0;
BSP_EXIT_CRITICAL_SECTION(s);
}
/**************************************************************************************************
* @fn MRFI_PostKillSem
*
* @brief Post to the loop-kill semaphore that will be checked by the iteration loops
* that control the delay thread.
*
* @param none
*
* @return none
**************************************************************************************************
*/
void MRFI_PostKillSem(void)
{
if (sReplyDelayContext)
{
sKillSem = 1;
}
return;
}
/**************************************************************************************************
* @fn MRFI_GetRadioState
*
* @brief Returns the current radio state.
*
* @param none
*
* @return radio state - off/idle/rx
**************************************************************************************************
*/
uint8_t MRFI_GetRadioState(void)
{
return mrfiRadioState;
}
/**************************************************************************************************
* Compile Time Integrity Checks
**************************************************************************************************
*/
#define MRFI_RADIO_TX_FIFO_SIZE 64 /* from datasheet */
/* verify largest possible packet fits within FIFO buffer */
#if ((MRFI_MAX_FRAME_SIZE + MRFI_RX_METRICS_SIZE) > MRFI_RADIO_TX_FIFO_SIZE)
#error "ERROR: Maximum possible packet length exceeds FIFO buffer. Decrease value of maximum application payload."
#endif
/* verify that the SmartRF file supplied is compatible */
#if ((!defined SMARTRF_RADIO_CC2500) && \
(!defined SMARTRF_RADIO_CC1100) && \
(!defined SMARTRF_RADIO_CC1101) && \
(!defined SMARTRF_RADIO_CC1100E))
#error "ERROR: The SmartRF export file is not compatible."
#endif
/*
* These asserts happen if there is extraneous compiler padding of arrays.
* Modify compiler settings for no padding, or, if that is not possible,
* comment out the offending asserts.
*/
//BSP_STATIC_ASSERT(sizeof(mrfiRadioCfg) == ((sizeof(mrfiRadioCfg)/sizeof(mrfiRadioCfg[0])) * sizeof(mrfiRadioCfg[0])));
/**************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -