RFM69 - Relation bitrates, frequency deviation and RxBw

Started by huuchinh02, October 14, 2015, 10:10:04 PM

huuchinh02

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!

Felix

Hi, can you give more detail?
What library, settings and hardware are you using with your HCW?

huuchinh02

#2
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++;
  }
}