/*************************************************************************//** *****************************************************************************/ static void phySetRxState(void) { phyTrxSetState(TRX_CMD_TRX_OFF); IRQ_STATUS_REG = IRQ_CLEAR_VALUE; if (phyRxState) phyTrxSetState(TRX_CMD_RX_AACK_ON); }
/*************************************************************************//** *****************************************************************************/ void PHY_Init(void) { sysclk_enable_peripheral_clock(&TRX_CTRL_0); TRXPR_REG_s.trxrst = 1; phyRxState = false; phyState = PHY_STATE_IDLE; phyTrxSetState(TRX_CMD_TRX_OFF); TRX_CTRL_2_REG_s.rxSafeMode = 1; #ifdef PHY_ENABLE_RANDOM_NUMBER_GENERATOR CSMA_SEED_0_REG = (uint8_t)PHY_RandomReq(); #endif #if defined(PLATFORM_WM100) || defined(PLATFORM_WM100_DUINO) #if (ANTENNA_DIVERSITY == 1) ANT_DIV_REG_s.antCtrl = 2; RX_CTRL_REG_s.pdtThres = 0x03; ANT_DIV_REG_s.antDivEn = 1; ANT_DIV_REG_s.antExtSwEn = 1; #endif // ANTENNA_DIVERSITY #ifdef EXT_RF_FRONT_END_CTRL TRX_CTRL_1_REG_s.paExtEn = 1; #endif // EXT_RF_FRONT_END_CTRL #endif // PLATFORM_WM100 }
/*************************************************************************//** *****************************************************************************/ void PHY_DataReq(uint8_t *data) { phyTrxSetState(TRX_CMD_TX_ARET_ON); TRX_FRAME_BUFFER(0) = data[0] + PHY_CRC_SIZE; for (uint8_t i = 0; i < data[0]; i++) { TRX_FRAME_BUFFER(i + 1) = data[i + 1]; } phyState = PHY_STATE_TX_WAIT_END; TRX_STATE_REG = TRX_CMD_TX_START; }
/*************************************************************************//** *****************************************************************************/ uint16_t PHY_RandomReq(void) { uint16_t rnd = 0; TRX_RPC_REG = 0x00; phyTrxSetState(TRX_CMD_RX_ON); for (uint8_t i = 0; i < 16; i += 2) { HAL_Delay(RANDOM_NUMBER_UPDATE_INTERVAL); rnd |= PHY_RSSI_REG_s.rndValue << i; } phyTrxSetState(TRX_CMD_TRX_OFF); TRX_RPC_REG = TRX_RPC_REG_VALUE; phySetRxState(); return rnd; }
/*************************************************************************//** *****************************************************************************/ void PHY_DataReq(uint8_t *data, uint8_t size) { phyTrxSetState(TRX_CMD_TX_ARET_ON); IRQ_STATUS_REG = IRQ_CLEAR_VALUE; TRX_FRAME_BUFFER(0) = size + PHY_CRC_SIZE; for (uint8_t i = 0; i < size; i++) TRX_FRAME_BUFFER(i+1) = data[i]; phyState = PHY_STATE_TX_WAIT_END; TRX_STATE_REG = TRX_CMD_TX_START; }
/*************************************************************************//** *****************************************************************************/ uint16_t PHY_RandomReq(void) { uint16_t rnd = 0; phyTrxSetState(TRX_CMD_RX_ON); for (uint8_t i = 0; i < 16; i += 2) { delay_us(RANDOM_NUMBER_UPDATE_INTERVAL); rnd |= PHY_RSSI_REG_s.rndValue << i; } phySetRxState(); return rnd; }
/*************************************************************************//** *****************************************************************************/ void PHY_Init(void) { TRXPR_REG_s.trxrst = 1; phyRxState = false; phyState = PHY_STATE_IDLE; phyTrxSetState(TRX_CMD_TRX_OFF); TRX_CTRL_2_REG_s.rxSafeMode = 1; #ifdef PHY_ENABLE_RANDOM_NUMBER_GENERATOR CSMA_SEED_0_REG = (uint8_t)PHY_RandomReq(); #endif }
/*************************************************************************//** *****************************************************************************/ void PHY_Sleep(void) { phyTrxSetState(TRX_CMD_TRX_OFF); TRXPR_REG_s.slptr = 1; phyState = PHY_STATE_SLEEP; #if defined(PLATFORM_WM100) || defined(PLATFORM_WM100_DUINO) #if (ANTENNA_DIVERSITY == 1) ANT_DIV_REG_s.antExtSwEn = 0; ANT_DIV_REG_s.antDivEn = 0; #endif // ANTENNA_DIVERSITY #ifdef EXT_RF_FRONT_END_CTRL TRX_CTRL_1_REG_s.paExtEn = 0; #endif // EXT_RF_FRONT_END_CTRL #endif // PLATFORM_WM100 }
/*************************************************************************//** *****************************************************************************/ int8_t PHY_EdReq(void) { int8_t ed; phyTrxSetState(TRX_CMD_RX_ON); IRQ_STATUS_REG_s.ccaEdDone = 1; PHY_ED_LEVEL_REG = 0; while (0 == IRQ_STATUS_REG_s.ccaEdDone); ed = (int8_t)PHY_ED_LEVEL_REG + PHY_RSSI_BASE_VAL; phySetRxState(); return ed; }
/*************************************************************************//** *****************************************************************************/ void PHY_Sleep(void) { phyTrxSetState(TRX_CMD_TRX_OFF); TRXPR_REG_s.slptr = 1; phyState = PHY_STATE_SLEEP; }