Пример #1
0
TransmitResult internalSendPacket(const uint8_t *buff, const size_t &length, const uint32_t maxTimeoutUs, bool requestAck)
{
  irq = false;
  const size_t toSendLength = MIN(length, RFM73_MAX_PACKET_LEN);
  sendPayload(buff, toSendLength, requestAck ? 1 : 0);

  TransmitResult result;

  uint32_t i = 0;
  uint8_t status = 0;
  bool readStatus = true;
  while (!irq && i++ < maxTimeoutUs)
  {
    delayMicroseconds(1);
    if (i >= 10 && i % 5 == 0)
    {
      if (checkStatusForMissingIRQ(status))
      {
        readStatus = false;
        break;
      }
    }
  }

  if (readStatus)
  {
    status = readRegVal(RFM73_REG_STATUS);
  }

  if (status & RFM73_IRQ_STATUS_TX_DS)
  {
    result.status = Success;
    result.bytesSent = toSendLength;
  }
  else if (status & RFM73_IRQ_STATUS_MAX_RT)
  {
    result.status = MaxRT;
    result.bytesSent = 0;
  }
  else if (status & RFM73_IRQ_STATUS_TX_FULL)
  {
    result.status = FifoFull;
    result.bytesSent = 0;
  }

  if (i >= maxTimeoutUs)
  {
    result.status = Unknown;
    result.bytesSent = 0;
  }

  // Reset error flags
  writeRegVal(RFM73_CMD_WRITE_REG | RFM73_REG_STATUS, status);

  return result;
}
Пример #2
0
TransmitResult_t RFM75_Transmit_bytes(const uint8_t *buff,
		const uint32_t *length,
		const uint32_t maxTimeoutUs,
		bool requestAck)
{
	TransmitResult_t result;
	const uint32_t toSendLength = *length;
	uint32_t i=0;
	uint8_t status = 0;
	bool readStatus = true;

	sendPayload(buff, toSendLength, (uint8_t)requestAck);

	rxtx_interrupt = 0;
	while((rxtx_interrupt == 0) &&
			(i < maxTimeoutUs)){
		_delay_us(20);
		if(checkStatusForMissingIRQ(&status)){
			readStatus=false;
			break;
		}
		i++;
	}

	rxtx_interrupt = 0;
	/* Clear the status interrupt */
	writeRegVal(RFM7x_CMD_WRITE_REG | RFM7x_REG_STATUS, status);

	if (readStatus){
		status = readRegVal(RFM7x_REG_STATUS);
	}
	if (status & RFM7x_IRQ_STATUS_TX_DS){
		result.status = SUCCESS;
		result.bytesSent = toSendLength;
	}
	else if (status & RFM7x_IRQ_STATUS_MAX_RT){
		result.status = MAXRT;
		result.bytesSent = 0;
	}
	else if (status & RFM7x_IRQ_STATUS_TX_FULL){
		result.status = FIFOFULL;
		result.bytesSent = 0;
	}

	if (i >= maxTimeoutUs){
		result.status = UNKNOWN;
		result.bytesSent = 0;
	}
	return result;
}