void SX1276LoRaInit( void ) { SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LoRaSetDefaults( ); SX1276ReadBuffer( 0x1,&SX1276LR, 0x70 - 1 ); SX1276Read( REG_LR_VERSION, &SX1276LR.RegVersion ); // set the RF settings SX1276LoRaSetRFFrequency( LoRaSettings.RFFrequency,&SX1276LR ); SX1276LoRaSetRFPower_2( LoRaSettings.Power,&SX1276LR ); SX1276LoRaSetSpreadingFactor( LoRaSettings.SpreadingFactor,&SX1276LR ); // SF6 only operates in implicit header mode. SX1276LoRaSetErrorCoding( LoRaSettings.ErrorCoding,&SX1276LR ); SX1276LoRaSetPacketCrcOn( LoRaSettings.CrcOn,&SX1276LR ); SX1276LoRaSetSignalBandwidth( LoRaSettings.SignalBw,&SX1276LR ); SX1276LoRaSetImplicitHeaderOn( LoRaSettings.ImplicitHeaderOn,&SX1276LR ); SX1276LoRaSetSymbTimeout( 0x3FF,&SX1276LR ); //Maximum - casove okno pro hledani preamble v single rezimu SX1276LoRaSetPayloadLength( LoRaSettings.PayloadLength,&SX1276LR ); // // SX1276LoRaSetLowDatarateOptimize( true,&SX1276LR ); //dela problemy - u delsiho paketu je rozsypany caj /*AGC AUTO*/ SX1276Read( REG_LR_MODEMCONFIG3,&SX1276LR.RegModemConfig3 ); SX1276LR.RegModemConfig3|=0x4; SX1276Write( REG_LR_MODEMCONFIG3,SX1276LR.RegModemConfig3 ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); }
void SX1276SetLoRaOFF(void) { SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LR.RegOpMode = ( SX1276LR.RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF; SX1276Write( REG_LR_OPMODE, SX1276LR.RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); // SX1276ReadBuffer( REG_OPMODE, SX1276Regs + 1, 0x70 - 1 ); }
void SX1276LoRaInit( void ) { RFLRState = RFLR_STATE_IDLE; SX1276LoRaSetDefaults( ); // 读取XS1276的版本号到SX1276LR->RegVersion SX1276ReadBuffer( REG_LR_OPMODE, SX1276Regs + 1, 0x70 - 1 ); // 从REG_LR_OPMODE地址开始连续读出0x6F个寄存器的值到SX1276Regs[1...0x6F] SX1276LR->RegLna = RFLR_LNA_GAIN_G1; SX1276WriteBuffer( REG_LR_OPMODE, SX1276Regs + 1, 0x70 - 1 ); // set the RF settings SX1276LoRaSetRFFrequency( LoRaSettings.RFFrequency ); SX1276LoRaSetSpreadingFactor( LoRaSettings.SpreadingFactor ); // SF6 only operates in implicit header mode. SX1276LoRaSetErrorCoding( LoRaSettings.ErrorCoding ); SX1276LoRaSetPacketCrcOn( LoRaSettings.CrcOn ); SX1276LoRaSetSignalBandwidth( LoRaSettings.SignalBw ); SX1276LoRaSetImplicitHeaderOn( LoRaSettings.ImplicitHeaderOn ); SX1276LoRaSetSymbTimeout( 0x3FF ); SX1276LoRaSetPayloadLength( LoRaSettings.PayloadLength ); SX1276LoRaSetLowDatarateOptimize( FALSE ); #if( ( MODULE_SX1276RF1IAS == 1 ) || ( MODULE_SX1276RF1KAS == 1 ) ) if( LoRaSettings.RFFrequency > 860000000 ) { SX1276LoRaSetPAOutput( RFLR_PACONFIG_PASELECT_RFO ); SX1276LoRaSetPa20dBm( FALSE ); LoRaSettings.Power = 14; SX1276LoRaSetRFPower( LoRaSettings.Power ); } else { SX1276LoRaSetPAOutput( RFLR_PACONFIG_PASELECT_PABOOST ); SX1276LoRaSetPa20dBm( TRUE ); LoRaSettings.Power = 20; SX1276LoRaSetRFPower( LoRaSettings.Power ); } #elif( MODULE_SX1276RF1JAS == 1 ) if( LoRaSettings.RFFrequency > 860000000 ) { SX1276LoRaSetPAOutput( RFLR_PACONFIG_PASELECT_PABOOST ); SX1276LoRaSetPa20dBm( TRUE ); LoRaSettings.Power = 20; SX1276LoRaSetRFPower( LoRaSettings.Power ); } else { SX1276LoRaSetPAOutput( RFLR_PACONFIG_PASELECT_RFO ); SX1276LoRaSetPa20dBm( FALSE ); LoRaSettings.Power = 14; SX1276LoRaSetRFPower( LoRaSettings.Power ); } #endif SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); }
void SX1276_FSK_init(void) { #if defined(SX1276_FSK) SX1276 = ( tSX1276* )SX1276Regs; SX1276Reset( ); SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF; SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); SX1276ReadBuffer( REG_OPMODE, SX1276Regs + 1, 0x70 - 1 ); #endif }
/***************************************************************************** Prototype : SX1276SetLoRaOn Description : none Input : bool enable Output : None Return Value : Date : 2014/3/15 Author : Barry *****************************************************************************/ void SX1276SetLoRaOn( bool enable ) { /* if current state is the same of wanted state,return */ if( LoRaOnState == enable ) { return; } LoRaOnState = enable; LoRaOn = enable; if( LoRaOn == true ) { #if defined(SX1276_LORA) SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); /* set to lora mode */ SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON; SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); g_GDOx_map_conf.GDO0Config = DIO0_RxDone; g_GDOx_map_conf.GDO1Config = DIO1_RxTimeout; g_GDOx_map_conf.GDO2Config = DIO2_FhssCC; g_GDOx_map_conf.GDO3Config = DIO3_CadDone; g_GDOx_map_conf.GDO4Config = DIO4_CadDetected; g_GDOx_map_conf.GDO5Config = DIO5_ModeReady; config_GDOx_Map(g_GDOx_map_conf); SX1276ReadBuffer( REG_LR_OPMODE, SX1276Regs + 1, 0x70 - 1 ); #endif } else { #if defined(SX1276_FSK) SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF; SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); SX1276ReadBuffer( REG_OPMODE, SX1276Regs + 1, 0x70 - 1 ); #endif } }
void SX1276SetOpMode( uint8_t opMode ) { if( LoRaOn == false ) { SX1276FskSetOpMode( opMode ); } else { SX1276LoRaSetOpMode( opMode ); } }
void SX1276_lora_init(void) { SX1276LR = ( tSX1276LR* )SX1276Regs; SX1276Reset( ); SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); /* set to lora mode */ SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON; SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); g_GDOx_map_conf.GDO0Config = DIO0_RxDone; g_GDOx_map_conf.GDO1Config = DIO1_RxTimeout; g_GDOx_map_conf.GDO2Config = DIO2_FhssCC; g_GDOx_map_conf.GDO3Config = DIO3_CadDone; g_GDOx_map_conf.GDO4Config = DIO4_CadDetected; g_GDOx_map_conf.GDO5Config = DIO5_ModeReady; config_GDOx_Map(g_GDOx_map_conf); SX1276ReadBuffer( REG_LR_OPMODE, SX1276Regs + 1, 0x70 - 1 ); }
void SX1276SetLoRaOn( bool enable ) { if( LoRaOnState == enable ) { return; } LoRaOnState = enable; LoRaOn = enable; if( LoRaOn == true ) { SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON; SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); // RxDone RxTimeout FhssChangeChannel CadDone SX1276LR->RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00; //| RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_00; // CadDetected ModeReady SX1276LR->RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00; SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR->RegDioMapping1, 2 ); SX1276ReadBuffer( REG_LR_OPMODE, SX1276Regs + 1, 0x70 - 1 ); } else { SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_OFF; SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); SX1276ReadBuffer( REG_OPMODE, SX1276Regs + 1, 0x70 - 1 ); } }
void SX1276SetLoRaOn(void) { SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LR.RegOpMode = ( SX1276LR.RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON; SX1276LR.RegOpMode&=~0x8;//-0x08 - HF SX1276Write( REG_LR_OPMODE, SX1276LR.RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); // RxDone RxTimeout FhssChangeChannel CadDone SX1276LR.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO0_01| RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_00; //TX_Done // CadDetected ModeReady SX1276LR.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00; SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR.RegDioMapping1, 2 ); // SX1276ReadBuffer( REG_LR_OPMODE, SX1276Regs + 1, 0x70 - 1 ); }
void SX1276SetLoRaOn(void) { SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP ); SX1276LR.RegOpMode = ( SX1276LR.RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON; SX1276LR.RegOpMode&=~0x8; // vynuluju bit pro LF SX1276Write( REG_LR_OPMODE, SX1276LR.RegOpMode ); SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); // RxDone RxTimeout FhssChangeChannel CadDone SX1276LR.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 ; //RXTimeout // RFLR_DIOMAPPING1_DIO2_00 | // RFLR_DIOMAPPING1_DIO3_10; //CRC error // CadDetected ModeReady SX1276LR.RegDioMapping2 =0;// RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00; // CadDetected ModeReady SX1276LR.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00; SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR.RegDioMapping1, 2 ); }
void SX1276SetOpMode( uint8_t opMode ) { SX1276LoRaSetOpMode( opMode ); }
void Continous_wave() { /* / _____) _ | | ( (____ _____ ____ _| |_ _____ ____| |__ \____ \| ___ | (_ _) ___ |/ ___) _ \ _____) ) ____| | | || |_| ____( (___| | | | (______/|_____)_|_|_| \__)_____)\____)_| |_| ( C )2014 Semtech Description: Tx Continuous Wave implementation License: Revised BSD License, see LICENSE.TXT file include in the project Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin */ //#include "sx1276-hal.h" /* Set this flag to '1' to test the HF max output power or '0' to the the LF max output power */ /** * Main application entry point. */ uint8_t TxOuputPower = 0; /**********************************************/ /* WARNING */ /* The below settings can damage the chipset */ /* if wrongly used. DO NOT CHANGE THE VALUES! */ /* */ /**********************************************/ // SX1276MB1MAS // debug("\r\n TEST_HF_OUTPUT on SX1276MB1MAS: 14 dBm at 868 MHz \r\n" ); SX1276LoRaSetRFFrequency( 869525000,&SX1276LR ); // TxOuputPower = 14; SX1276Write( 0x01, 0x88 ); SX1276Write( 0x3D, 0xA1 ); SX1276Write( 0x36, 0x01 ); SX1276Write( 0x1e, 0x08 ); //LORA SX1276SetLoRaOn(); SX1276LoRaInit(); SX1276LoRaSetOpMode(RFLR_OPMODE_TRANSMITTER); // Radio.SetTxConfig( MODEM_LORA, TxOuputPower, 0, LORA_BANDWIDTH, // LORA_SPREADING_FACTOR, LORA_CODINGRATE, // LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, // LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, // LORA_IQ_INVERSION_ON, 3000000 ); // Sets the radio in Tx mode // Radio.Send( NULL, 0 ); // // debug( "Start main loop: \r\n" ); // // Blink LEDs just to show some activity // while( 1 ) // { // debug( "Continuous Wave activated... \r\n" ); // wait_ms( 200 ); // } }
/*! * \brief Process the LoRa modem Rx and Tx state machines depending on the * SX1276 operating mode. * * \retval rfState Current RF state [RF_IDLE, RF_BUSY, * RF_RX_DONE, RF_RX_TIMEOUT, * RF_TX_DONE, RF_TX_TIMEOUT] */ uint32_t SX1276LoRaProcess( void ) { uint32_t result = RF_BUSY; switch( RFLRState ) { case RFLR_STATE_IDLE: break; case RFLR_STATE_RX_INIT: SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY ); SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT | //RFLR_IRQFLAGS_RXDONE | //RFLR_IRQFLAGS_PAYLOADCRCERROR | RFLR_IRQFLAGS_VALIDHEADER | RFLR_IRQFLAGS_TXDONE | RFLR_IRQFLAGS_CADDONE | //RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL | RFLR_IRQFLAGS_CADDETECTED; SX1276Write( REG_LR_IRQFLAGSMASK, SX1276LR->RegIrqFlagsMask ); if( LoRaSettings.FreqHopOn == true ) { SX1276LR->RegHopPeriod = LoRaSettings.HopPeriod; SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel ); SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] ); } else { SX1276LR->RegHopPeriod = 255; } SX1276Write( REG_LR_HOPPERIOD, SX1276LR->RegHopPeriod ); // RxDone RxTimeout FhssChangeChannel CadDone SX1276LR->RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_00; // CadDetected ModeReady SX1276LR->RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00; SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR->RegDioMapping1, 2 ); if( LoRaSettings.RxSingleOn == true ) // Rx single mode { SX1276LoRaSetOpMode( RFLR_OPMODE_RECEIVER_SINGLE ); } else // Rx continuous mode { SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxBaseAddr; SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr ); SX1276LoRaSetOpMode( RFLR_OPMODE_RECEIVER ); } memset( RFBuffer, 0, ( size_t )RF_BUFFER_SIZE ); PacketTimeout = LoRaSettings.RxPacketTimeout; RxTimeoutTimer = GET_TICK_COUNT( ); RFLRState = RFLR_STATE_RX_RUNNING; break; case RFLR_STATE_RX_RUNNING: if( DIO0 == 1 ) // RxDone { RxTimeoutTimer = GET_TICK_COUNT( ); if( LoRaSettings.FreqHopOn == true ) { SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel ); SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] ); } // Clear Irq SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE ); RFLRState = RFLR_STATE_RX_DONE; } if( DIO2 == 1 ) // FHSS Changed Channel { RxTimeoutTimer = GET_TICK_COUNT( ); if( LoRaSettings.FreqHopOn == true ) { SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel ); SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] ); } // Clear Irq SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL ); // Debug RxGain = SX1276LoRaReadRxGain( ); } if( LoRaSettings.RxSingleOn == true ) // Rx single mode { if( ( GET_TICK_COUNT( ) - RxTimeoutTimer ) > PacketTimeout ) { RFLRState = RFLR_STATE_RX_TIMEOUT; } } break; case RFLR_STATE_RX_DONE: SX1276Read( REG_LR_IRQFLAGS, &SX1276LR->RegIrqFlags ); if( ( SX1276LR->RegIrqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR ) == RFLR_IRQFLAGS_PAYLOADCRCERROR ) { // Clear Irq SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR ); if( LoRaSettings.RxSingleOn == true ) // Rx single mode { RFLRState = RFLR_STATE_RX_INIT; } else { RFLRState = RFLR_STATE_RX_RUNNING; } break; } { uint8_t rxSnrEstimate; SX1276Read( REG_LR_PKTSNRVALUE, &rxSnrEstimate ); if( rxSnrEstimate & 0x80 ) // The SNR sign bit is 1 { // Invert and divide by 4 RxPacketSnrEstimate = ( ( ~rxSnrEstimate + 1 ) & 0xFF ) >> 2; RxPacketSnrEstimate = -RxPacketSnrEstimate; } else { // Divide by 4 RxPacketSnrEstimate = ( rxSnrEstimate & 0xFF ) >> 2; } }