/*************************************************************************//** *****************************************************************************/ void PHY_TaskHandler(void) { if (PHY_STATE_SLEEP == phyState) { return; } if (IRQ_STATUS_REG_s.rxEnd) { PHY_DataInd_t ind; uint8_t size = TST_RX_LENGTH_REG; for (uint8_t i = 0; i < size + 1 /*lqi*/; i++) { phyRxBuffer[i] = TRX_FRAME_BUFFER(i); } ind.data = phyRxBuffer; ind.size = size - PHY_CRC_SIZE; ind.lqi = phyRxBuffer[size]; ind.rssi = (int8_t)PHY_ED_LEVEL_REG + PHY_RSSI_BASE_VAL; PHY_DataInd(&ind); while (TRX_STATUS_RX_AACK_ON != TRX_STATUS_REG_s.trxStatus) { } IRQ_STATUS_REG_s.rxEnd = 1; TRX_CTRL_2_REG_s.rxSafeMode = 0; TRX_CTRL_2_REG_s.rxSafeMode = 1; } else if (IRQ_STATUS_REG_s.txEnd) { if (TRX_STATUS_TX_ARET_ON == TRX_STATUS_REG_s.trxStatus) { uint8_t status = TRX_STATE_REG_s.tracStatus; if (TRAC_STATUS_SUCCESS == status) { status = PHY_STATUS_SUCCESS; } else if (TRAC_STATUS_CHANNEL_ACCESS_FAILURE == status) { status = PHY_STATUS_CHANNEL_ACCESS_FAILURE; } else if (TRAC_STATUS_NO_ACK == status) { status = PHY_STATUS_NO_ACK; } else { status = PHY_STATUS_ERROR; } phySetRxState(); phyState = PHY_STATE_IDLE; PHY_DataConf(status); } IRQ_STATUS_REG_s.txEnd = 1; } }
/*************************************************************************//** *****************************************************************************/ 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; }
/*************************************************************************//** *****************************************************************************/ 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; }
/*************************************************************************//** *****************************************************************************/ 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_SetRxState(bool rx) { phyRxState = rx; phySetRxState(); }
/*************************************************************************//** *****************************************************************************/ void PHY_Wakeup(void) { TRXPR_REG_s.slptr = 0; phySetRxState(); phyState = PHY_STATE_IDLE; }