2025-02-15 06:49 AM - edited 2025-02-15 06:52 AM
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)?