Beispiel #1
0
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 );
}
Beispiel #2
0
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);  
}
Beispiel #4
0
double SX1276LoRaReadRssi( void )
{
    // Reads the RSSI value
    SX1276Read( REG_LR_RSSIVALUE, &SX1276LR.RegRssiValue );

    return RssiOffset[LoRaSettings.SignalBw] + ( double )SX1276LR.RegRssiValue;
}
Beispiel #5
0
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 );
}
Beispiel #6
0
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;
    }
}
Beispiel #7
0
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( );


}
Beispiel #8
0
double SX1276FskReadRssi( void )
{
    SX1276Read( REG_RSSIVALUE, &SX1276.RegRssiValue );                               // Reads the RSSI value

    return -( double )( ( double )SX1276.RegRssiValue / 2.0 );
}
Beispiel #9
0
uint8_t SX1276FskReadRxGain( void )
{
    SX1276Read( REG_LNA, &SX1276.RegLna );
    return( SX1276.RegLna >> 5 ) & 0x07;
}
Beispiel #10
0
uint8_t SX1276FskGetOpMode( void )
{
    SX1276Read( REG_OPMODE, &SX1276.RegOpMode );
    
    return SX1276.RegOpMode & ~RF_OPMODE_MASK;
}
Beispiel #11
0
void SX1276FskSetDefaults( void )
{
    // REMARK: See SX1276 datasheet for modified default values.

    SX1276Read( REG_VERSION, &SX1276.RegVersion );
}
Beispiel #12
0
/*!
 * \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;
            }
        }
Beispiel #13
0
uint8_t SX1276LoRaReadRxGain( void )
{
    SX1276Read( REG_LR_LNA, &SX1276LR->RegLna );
    return( SX1276LR->RegLna >> 5 ) & 0x07;
}
Beispiel #14
0
uint8_t SX1276LoRaGetOpMode( void )
{
    SX1276Read( REG_LR_OPMODE, &SX1276LR->RegOpMode );
    
    return SX1276LR->RegOpMode & ~RFLR_OPMODE_MASK;
}