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 SX1276LoRaSetDefaults( void ) { //See app note if (LoRaSettings.SignalBw<9) //mensi nez 500 { SX1276Read( 0x31, &SX1276LR.RegTestReserved31 ); // Sets IF frequency selection manual SX1276LR.RegTestReserved31 &= 0x7F; // pro pasmo krome 5000 khz musime vycistiti bit 7 SX1276LR.RegTestReserved31 &=~ 0x80; //7 bit vznulovat SX1276Write( 0x31, SX1276LR.RegTestReserved31 ); }else { SX1276Read( 0x31, &SX1276LR.RegTestReserved31 ); // Sets IF frequency selection manual SX1276LR.RegTestReserved31 &= 0x7F; // pro pasmo krome 5000 khz musime vycistiti bit 7 SX1276LR.RegTestReserved31 |= 0x80; //7 bit set SX1276Write( 0x31, SX1276LR.RegTestReserved31 ); SX1276Write( 0x36, 0x2); //See Erata SX1276Write( 0x3a, 0x64); //See Erata } if(LoRaSettings.SignalBw==0) SX1276Write( 0x2F, 0x48 ); if((LoRaSettings.SignalBw>=0)&&(LoRaSettings.SignalBw<=5)) SX1276Write( 0x2F, 0x44 ); if((LoRaSettings.SignalBw>=6)&&(LoRaSettings.SignalBw<=8)) SX1276Write( 0x2F, 0x40 ); // SX1276Write( 0x2F, 0x40 ); SX1276Read( 0x30, &SX1276LR.RegTestReserved31 ); SX1276LR.RegTestReserved31&=0xFE; SX1276Write( 0x30, SX1276LR.RegTestReserved31 ); }
void start_continuous_mode(void) { //4、BitSyncOn //5、continuous mode //6、RX u8 RegDioMapping[2]; u8 temp; SX1276FskSetOpMode(RF_OPMODE_STANDBY); hal_DIOx_ITConfig(all,DISABLE); RegDioMapping[0] = RF_DIOMAPPING1_DIO0_11 | RF_DIOMAPPING1_DIO1_00 | RF_DIOMAPPING1_DIO2_11 | RF_DIOMAPPING1_DIO3_10; RegDioMapping[1] = RF_DIOMAPPING2_DIO4_00 | RF_DIOMAPPING2_DIO5_11 | RF_DIOMAPPING2_MAP_PREAMBLEDETECT; SX1276WriteBuffer( REG_DIOMAPPING1, RegDioMapping, 2 ); SX1276Read(REG_OOKPEAK, &temp); temp |= (0x20); SX1276Write(REG_OOKPEAK, temp); SX1276Read(REG_PACKETCONFIG2, &temp); temp &= (~0x40); SX1276Write(REG_PACKETCONFIG2, temp); SX1276FskSetOpMode(RF_OPMODE_RECEIVER); }
double SX1276LoRaReadRssi( void ) { // Reads the RSSI value SX1276Read( REG_LR_RSSIVALUE, &SX1276LR.RegRssiValue ); return RssiOffset[LoRaSettings.SignalBw] + ( double )SX1276LR.RegRssiValue; }
void SX1276LoRaSetOpMode( uint8_t opMode ) { static uint8_t opModePrev = RFLR_OPMODE_STANDBY; bool antennaSwitchTxOn = false; opModePrev = SX1276LR.RegOpMode & ~RFLR_OPMODE_MASK; if( opMode == RFLR_OPMODE_TRANSMITTER ) { antennaSwitchTxOn = true; } else { antennaSwitchTxOn = false; } //RXTX( antennaSwitchTxOn ); // Antenna switch control SX1276LR.RegOpMode = ( SX1276LR.RegOpMode & RFLR_OPMODE_MASK ) | opMode; SX1276Read( REG_LR_OPMODE, SX1276LR.RegOpMode ); SX1276LR.RegOpMode = ( SX1276LR.RegOpMode & RFLR_OPMODE_MASK ) | opMode; SX1276Write( REG_LR_OPMODE, SX1276LR.RegOpMode ); }
double SX1276LoRaReadRssi( void ) { // Reads the RSSI value SX1276Read( REG_LR_RSSIVALUE, &SX1276LR->RegRssiValue ); if( LoRaSettings.RFFrequency < 860000000 ) // LF { return RSSI_OFFSET_LF + ( double )SX1276LR->RegRssiValue; } else { return RSSI_OFFSET_HF + ( double )SX1276LR->RegRssiValue; } }
void SX1276Init( void ) { SX1276InitIo( ); SX1276Reset( ); static uint8_t temp=0; SX1276Read( REG_LR_VERSION, &temp ); //SX1276Write( REG_LR_OPMODE, 0x09 ); SX1276SetLoRaOn(); // Initialize LoRa modem SX1276LoRaInit( ); }
double SX1276FskReadRssi( void ) { SX1276Read( REG_RSSIVALUE, &SX1276.RegRssiValue ); // Reads the RSSI value return -( double )( ( double )SX1276.RegRssiValue / 2.0 ); }
uint8_t SX1276FskReadRxGain( void ) { SX1276Read( REG_LNA, &SX1276.RegLna ); return( SX1276.RegLna >> 5 ) & 0x07; }
uint8_t SX1276FskGetOpMode( void ) { SX1276Read( REG_OPMODE, &SX1276.RegOpMode ); return SX1276.RegOpMode & ~RF_OPMODE_MASK; }
void SX1276FskSetDefaults( void ) { // REMARK: See SX1276 datasheet for modified default values. SX1276Read( REG_VERSION, &SX1276.RegVersion ); }
/*! * \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; } }
uint8_t SX1276LoRaReadRxGain( void ) { SX1276Read( REG_LR_LNA, &SX1276LR->RegLna ); return( SX1276LR->RegLna >> 5 ) & 0x07; }
uint8_t SX1276LoRaGetOpMode( void ) { SX1276Read( REG_LR_OPMODE, &SX1276LR->RegOpMode ); return SX1276LR->RegOpMode & ~RFLR_OPMODE_MASK; }