Hello every one,
I am studying with RFM69HCW. My devices transmited and received data together, but it drop some packet when rx mode.
Example: I have a transmiter and receiver, I set transmiter every t (ms) send a packet. I get result in below:
t(ms) Tx counter Rx Counter
512 1200 1191
256 2000 1989
128 10000 9953
64 20000 19788
32 50000 49465
16 50000 49442
I don't want this losting data, I think that reason config bitrate, frequency deviation and RxBw
Any help make me appreciate, Tks!
Hi, can you give more detail?
What library, settings and hardware are you using with your HCW?
I use library of lowpower lab
Using MCU stm32f103
DIO0 connect interrupt MCU
my code configuration
Rfm69h_Write(RFM69H_FIFO_ACCESS,0x00);
/* Operation mode */
Rfm69h_Write(RFM69H_OPERATING_MODE,RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY);
Rfm69h_Write(RFM69H_DATA_MODULE,RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00);
Rfm69h_Write(RFM69H_BITRATE_MSB,RF_BITRATEMSB_100000);
Rfm69h_Write(RFM69H_BITRATE_LSB,RF_BITRATELSB_100000);
/* Frequency Deviation */
Rfm69h_Write(RFM69H_FREQUENCY_DEVIATION_MSB,RF_FDEVMSB_280000);
Rfm69h_Write(RFM69H_FREQUENCY_DEVIATION_LSB,RF_FDEVLSB_280000);
/* Frequency bandwidth */
Rfm69h_Write(RFM69H_FREQUENCY_RF_MSB,RF_FRFMSB_868);
Rfm69h_Write(RFM69H_FREQUENCY_RF_MID,RF_FRFMID_868);
Rfm69h_Write(RFM69H_FREQUENCY_RF_LSB,RF_FRFLSB_868);
Rfm69h_Write(RFM69H_LNA_SETTING, (Rfm69h_Read(RFM69H_LNA_SETTING)& 0x7F) | RF_LNA_ZIN_50);
/* Power RF */
Rfm69h_Write(RFM69H_PA_LEVEL_POWER_CONTROL,RF_PALEVEL_OUTPUTPOWER_11101 | RF_PALEVEL_PA0_OFF | RF_PALEVEL_PA1_ON |RF_PALEVEL_PA2_ON);
// RXBW defaults are { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_5} (RxBw: 10.4KHz)
Rfm69h_Write(RFM69H_CHANNEL_FILTTER_BW,RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_20 | RF_RXBW_EXP_0); // BitRate < 2*RxBw
/* DIO mapping */
Rfm69h_Write(RFM69H_DIO_MAPPING_1,RF_DIOMAPPING1_DIO0_01); /* DIO0 - interrupt TX-RX mode */
Rfm69h_Write(RFM69H_DIO_MAPPING_2,RF_DIOMAPPING2_CLKOUT_OFF); /* DIO5 - OFF */
/* writing to this bit ensures that the FIFO & status flags are reset */
Rfm69h_Write(RFM69H_IRQ_FLAGS_2,RF_IRQFLAGS2_FIFOOVERRUN);
Rfm69h_Write(RFM69H_RSSI_THRESHOLD_CONTROL,0xD2);
/* Preamble Size */
Rfm69h_Write(RFM69H_PREAMBLE_LENGTH_MSB,0x00);
Rfm69h_Write(RFM69H_PREAMBLE_LENGTH_LSB,0x05); /* 5 bytes preamble */
/* Sync word config */
Rfm69h_Write(RFM69H_SYNC_WORD_CONFIG,RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_4 | RF_SYNC_TOL_0);
Rfm69h_Write(RFM69H_SYNC_WORD_VALUE_BYTE_1,'A');
Rfm69h_Write(RFM69H_SYNC_WORD_VALUE_BYTE_2,'C');
Rfm69h_Write(RFM69H_SYNC_WORD_VALUE_BYTE_3,'I');
Rfm69h_Write(RFM69H_SYNC_WORD_VALUE_BYTE_4,'S');
/* Packet 1 config */
Rfm69h_Write(RFM69H_PACKET_CONFIG_1,RF_PACKET1_FORMAT_FIXED | RF_PACKET1_DCFREE_OFF | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON | RF_PACKET1_ADRSFILTERING_OFF);
/* Lenth data transmission */
Rfm69h_Write(RFM69H_PAYLOAD_LENGTH,RF_DATA_LEN);
Rfm69h_Write(RFM69H_FIFO_THRESHOLD,RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | RF_DATA_LEN);
/* Packet 2 config */
Rfm69h_Write(RFM69H_PACKET_CONFIG_2,RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF);
Rfm69h_Write(RFM69H_TEST_LNA,RF_TESTLNA_HIGH_SENSITIVITY);
Rfm69h_Write(RFM69H_FADING_MARGIN_IMPROVEMENT,RF_DAGC_IMPROVED_LOWBETA0);
/* Set RX mode to ready receiving data */
Rfm69h.ToRxMode=true;
//////*Interrupt program*/////////
void RFM69H_ISR(void)
{
RF_DataTypeDef tmp;
volatile uint8_t status1;
volatile uint8_t status2;
uint8_t iCount;
status1=Rfm69h_Read(RFM69H_IRQ_FLAGS_1);
status2=Rfm69h_Read(RFM69H_IRQ_FLAGS_2);
/* Send data */
if(status2 & RF_IRQFLAGS2_PACKETSENT)
{
RFM69H_ClearTxBusy();/* Module is not busy */
Rfm69h.ToRxMode=true;/* back again RX mode */
/* Calc time */
LED_Off(LED1);
Time=TO_GetCurrentTime()-Time;
TxCnt++;
}
/* Received data */
if((status1 & RF_IRQFLAGS1_SYNCADDRESSMATCH) &&
(status2 & RF_IRQFLAGS2_PAYLOADREADY) && /* detected data */
(status2 & RF_IRQFLAGS2_CRCOK) /* CRC ok */
)
{
for(iCount=0; iCount<sizeof(tmp); iCount++)
{
*((uint8_t *)&tmp+iCount)= Rfm69h_Read(RFM69H_FIFO_ACCESS);
}
StoreRx(tmp);
Rfm69h.ToRxMode=true;/* back again RX mode */
LED_Toggle(LED1);
RxCnt++;
}
}