cancel
Showing results for 
Search instead for 
Did you mean: 

STM32WL33 Receive mode

RZub
Associate II

Hi,

Shortly. I want to send and receive data from another Transceiver module NRF905.

I'm able to send data to NRF905 successfully, but to receive - unsuccess, and don't understand where the problem is.

Here is setup:

 

void MX_MRSUBG_Init(void)
{

  /* USER CODE BEGIN MRSUBG_Init 0 */

  /* USER CODE END MRSUBG_Init 0 */

  /* USER CODE BEGIN MRSUBG_Init 1 */

  /* USER CODE END MRSUBG_Init 1 */

  /** Configures the radio parameters
  */
  MRSUBG_RadioInitStruct.lFrequencyBase = 868400000;
  MRSUBG_RadioInitStruct.xModulationSelect = MOD_2GFSK05;
  MRSUBG_RadioInitStruct.lDatarate = 100000;
  MRSUBG_RadioInitStruct.lFreqDev = 50000;
  MRSUBG_RadioInitStruct.lBandwidth = 100000;
  MRSUBG_RadioInitStruct.dsssExp = 0;
  MRSUBG_RadioInitStruct.outputPower = 10;
  MRSUBG_RadioInitStruct.PADrvMode = PA_DRV_TX_HP;
  HAL_MRSubG_Init(&MRSUBG_RadioInitStruct);

  /** Configures the packet parameters
  */
  MRSUBG_PacketSettingsStruct.PreambleLength = 5;
  MRSUBG_PacketSettingsStruct.PostambleLength = 0;
  MRSUBG_PacketSettingsStruct.SyncLength = 0;
  MRSUBG_PacketSettingsStruct.SyncWord = 0;
  MRSUBG_PacketSettingsStruct.FixVarLength = FIXED;
  MRSUBG_PacketSettingsStruct.PreambleSequence = PRE_SEQ_0101;
  MRSUBG_PacketSettingsStruct.PostambleSequence = POST_SEQ_0101;
  MRSUBG_PacketSettingsStruct.CrcMode = PKT_CRC_MODE_16BITS_2;
  MRSUBG_PacketSettingsStruct.Coding = CODING_MANCHESTER;
  MRSUBG_PacketSettingsStruct.DataWhitening = DISABLE;
  MRSUBG_PacketSettingsStruct.LengthWidth = BYTE_LEN_1;
  MRSUBG_PacketSettingsStruct.SyncPresent = DISABLE;
  HAL_MRSubG_PacketBasicInit(&MRSUBG_PacketSettingsStruct);
  /* USER CODE BEGIN MRSUBG_Init 2 */

  /* USER CODE END MRSUBG_Init 2 */

}

 

Enabling Manchester coding before main loop:

 

 

LL_MRSubG_PacketHandlerManchesterType(MANCHESTER_TYPE1);

 

 

Set RX mode:

 

/* Clear flag */
__HAL_MRSUBG_CLEAR_RFSEQ_IRQ_FLAG(MR_SUBG_GLOB_STATUS_RFSEQ_IRQ_STATUS_SABORT_DONE_F);

/* Mode */
LL_MRSubG_SetRXMode(RX_NORMAL);

/* Set the packet length */
__HAL_MRSUBG_SET_PKT_LEN(PACKET_LENGTH_RX);

/* Set the data buffer size length */
__HAL_MRSUBG_SET_DATABUFFER_SIZE(PACKET_LENGTH_RX);

/* Set the pointers to the data buffers */
__HAL_MRSUBG_SET_DATABUFFER0_POINTER((uint32_t )&rxPacket[0]);

/* Start RX */
__HAL_MRSUBG_STROBE_CMD(CMD_RX);

 

Defined variables:

 

#define PACKET_LENGTH_TX (20)
#define PACKET_LENGTH_RX (20)

uint8_t txPacket[PACKET_LENGTH_TX] ={ 165, 90, 90, 165, 0xFF ,0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF};

volatile uint8_t rxPacket[PACKET_LENGTH_RX * 2] =
{ 0 };

 

And here is my function to check if received any correct packet:

 

uint8_t IsRxReceived(void)
{
	uint32_t irqStatus = __HAL_MRSUBG_GET_RFSEQ_IRQ_STATUS();
	uint8_t status = 0;

	if (irqStatus & MR_SUBG_GLOB_STATUS_RFSEQ_IRQ_STATUS_RX_OK_F)
	{
		status = 1;
		/* Clear the IRQ flag */
		__HAL_MRSUBG_CLEAR_RFSEQ_IRQ_FLAG(MR_SUBG_GLOB_STATUS_RFSEQ_IRQ_STATUS_RX_OK_F);

	}
	else if (irqStatus & MR_SUBG_GLOB_STATUS_RFSEQ_IRQ_STATUS_RX_CRC_ERROR_F)
	{
		/* Clear the IRQ flag */
		__HAL_MRSUBG_CLEAR_RFSEQ_IRQ_FLAG(MR_SUBG_GLOB_STATUS_RFSEQ_IRQ_STATUS_RX_CRC_ERROR_F);

	}
	else if (irqStatus & MR_SUBG_GLOB_STATUS_RFSEQ_IRQ_STATUS_RX_TIMEOUT_F)
	{
		/* Clear the IRQ flag */
		__HAL_MRSUBG_CLEAR_RFSEQ_IRQ_FLAG(MR_SUBG_GLOB_STATUS_RFSEQ_IRQ_STATUS_RX_TIMEOUT_F);
	}

	/* Restart RX */
	__HAL_MRSUBG_STROBE_CMD(CMD_RX);

	return (status);
}

 

 

With the NRF905 I'm transmitting a known packet, but STM32WL33 is not invoking a flag.

Because TX is working with STM32WL33 (NRF905 gets packets), I expect that the settings are correct (freq., modulation, data rate, coding...).

Are there any extra ideas I could try? Thank you.

 

p.s. I understand, that the NRF905 module coding in Manchester all packets (Address + payload), while STM32WL only payload (+lenght if used). So, in this case, I cannot use the SYNC feature :( 

p.s.s. screenshot. Interestingly, that rxPacket[] buffer always changes data from member 1 or 2 to 19. Why not from 0 to 19 (20 bytes)?

0 REPLIES 0