예제 #1
0
/*************************************************************************//**
*****************************************************************************/
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;
	}
}
예제 #2
0
/*************************************************************************//**
*****************************************************************************/
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;
}
예제 #3
0
/*************************************************************************//**
*****************************************************************************/
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;
}
예제 #4
0
/*************************************************************************//**
*****************************************************************************/
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;
}
예제 #5
0
/*************************************************************************//**
*****************************************************************************/
void PHY_SetRxState(bool rx)
{
	phyRxState = rx;
	phySetRxState();
}
예제 #6
0
/*************************************************************************//**
*****************************************************************************/
void PHY_Wakeup(void)
{
	TRXPR_REG_s.slptr = 0;
	phySetRxState();
	phyState = PHY_STATE_IDLE;
}