123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- /*
- * THE FOLLOWING FIRMWARE IS PROVIDED: (1) "AS IS" WITH NO WARRANTY; AND
- * (2)TO ENABLE ACCESS TO CODING INFORMATION TO GUIDE AND FACILITATE CUSTOMER.
- * CONSEQUENTLY, SEMTECH SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR
- * CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
- * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
- * CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
- *
- * Copyright (C) SEMTECH S.A.
- */
- /*!
- * \file sx1276.c
- * \brief SX1276 RF chip driver
- *
- * \version 2.0.0
- * \date May 6 2013
- * \author Gregory Cristian
- *
- * Last modified by Miguel Luis on Jun 19 2013
- */
- #include "platform.h"
- #include "radio.h"
- #include "string.h"
- #if defined( USE_SX1276_RADIO )
- #include "sx1276.h"
- #include "sx1276-Hal.h"
- #include "sx1276-Fsk.h"
- #include "sx1276-LoRa.h"
- #include "sx1276-FskMisc.h"
- #include "sx1276-LoRamisc.h"
- /*!
- * SX1276 registers variable
- */
- uint8_t SX1276Regs[0x70];
- static bool LoRaOn = true;
- static bool LoRaOnState = false;
- extern tFskSettings FskSettings;
- void SX1276Init( void )
- {
- // Initialize FSK and LoRa registers structure
- SX1276 = ( tSX1276* )SX1276Regs;
- SX1276LR = ( tSX1276LR* )SX1276Regs;
- memset(SX1276,(int)0,sizeof(SX1276));
- memset(SX1276LR,(int)0,sizeof(SX1276LR));
-
- SX1276Reset( );
-
- SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
- // REMARK: After radio reset the default modem is FSK
- // #if ( LORA == 0 )
- if (LoRaOn == false)
- {
- LoRaOn = false;
- SX1276SetLoRaOn( LoRaOn );
- // Initialize FSK modem
- SX1276FskInit( );
- //
- // #else
- }
- else
- {
- LoRaOn = true;
- SX1276SetLoRaOn( LoRaOn );
- // Initialize LoRa modem
- SX1276LoRaInit( );
-
- //SX1276LoRaSetPreambleLength(1600);
-
- // #endif
- }
- }
- void EnterRxTestMode()
- {
- uint8_t PackgeConfigration=0;
-
- SX1276FskSetOpMode( RF_OPMODE_STANDBY );
-
- SX1276Read(REG_PACKETCONFIG2,&PackgeConfigration);
- PackgeConfigration=PackgeConfigration&0xBF;
- SX1276Write( REG_PACKETCONFIG2, PackgeConfigration );
- SX1276Read(REG_PACKETCONFIG2,&PackgeConfigration);
- // SyncAddress Dclk Data Timeout
- SX1276->RegDioMapping1 = RF_DIOMAPPING1_DIO0_00 | RF_DIOMAPPING1_DIO1_00 | RF_DIOMAPPING1_DIO2_11 | RF_DIOMAPPING1_DIO3_00;
- SX1276->RegDioMapping2 = RF_DIOMAPPING2_DIO4_00 | RF_DIOMAPPING2_DIO5_10 | RF_DIOMAPPING2_MAP_PREAMBLEDETECT;
- SX1276WriteBuffer( REG_DIOMAPPING1, &SX1276->RegDioMapping1, 2 );
-
- SX1276FskSetOpMode( RF_OPMODE_RECEIVER );
- }
- void EnterTestMode()
- {
- SX1276FskSetRFFrequency( FskSettings.RFFrequency );
- SX1276FskSetOpMode( RF_OPMODE_TRANSMITTER );
- }
- static void delay(uint32_t delay_ms)
- {
- delay1ms(delay_ms);
- }
- void SX1276Reset( void )
- {
- // uint32_t startTick;
- SX1276SetReset( RADIO_RESET_ON );
-
- // Wait 1ms
- // startTick = GET_TICK_COUNT( );
- // while( ( GET_TICK_COUNT( ) - startTick ) < TICK_RATE_MS( 1) );
- delay(2);
- SX1276SetReset( RADIO_RESET_OFF );
- delay(10);
- // Wait 6ms
- // startTick = GET_TICK_COUNT( );
- // while( ( GET_TICK_COUNT( ) - startTick ) < TICK_RATE_MS( 6) );
-
- }
- void SX1276SetLoRaOn( bool enable )
- {
- // uint8_t ModeTest=0;
- // static uint8_t test=0;
-
- 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 );
-
- // SX1276Write( REG_LR_FRFMSB, 0x86 );
- // SX1276ReadBuffer( REG_LR_FRFMSB, &test, 1);
-
- // 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 );
- }
- }
- bool SX1276GetLoRaOn( void )
- {
- return LoRaOn;
- }
- void SX1276setLoRaSta( bool sta )
- {
- LoRaOn = sta;
- }
- void SX1276SetOpMode( uint8_t opMode )
- {
- if( LoRaOn == false )
- {
- SX1276FskSetOpMode( opMode );
- }
- else
- {
- SX1276LoRaSetOpMode( opMode );
- }
- }
- uint8_t SX1276GetOpMode( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskGetOpMode( );
- }
- else
- {
- return SX1276LoRaGetOpMode( );
- }
- }
- double SX1276ReadRssi( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskReadRssi( );
- }
- else
- {
- return SX1276LoRaReadRssi( );
- }
- }
- uint8_t SX1276ReadRxGain( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskReadRxGain( );
- }
- else
- {
- return SX1276LoRaReadRxGain( );
- }
- }
- uint8_t SX1276GetPacketRxGain( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskGetPacketRxGain( );
- }
- else
- {
- return SX1276LoRaGetPacketRxGain( );
- }
- }
- int8_t SX1276GetPacketSnr( void )
- {
- if( LoRaOn == false )
- {
- while( 1 )
- {
- // Useless in FSK mode
- // Block program here
- }
- }
- else
- {
- return SX1276LoRaGetPacketSnr( );
- }
- }
- double SX1276GetPacketRssi( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskGetPacketRssi( );
- }
- else
- {
- return SX1276LoRaGetPacketRssi( );
- }
- }
- uint32_t SX1276GetPacketAfc( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskGetPacketAfc( );
- }
- else
- {
- while( 1 )
- {
- // Useless in LoRa mode
- // Block program here
- }
- }
- }
- void SX1276StartRx( void )
- {
- if( LoRaOn == false )
- {
- SX1276FskSetRFState( RF_STATE_RX_INIT );
- }
- else
- {
- SX1276LoRaSetRFState( RFLR_STATE_RX_INIT );
- }
- }
- void SX1276StartTx( void )//Add by Andrew
- {
- if( LoRaOn == false )
- {
- SX1276FskSetRFState( RF_STATE_TX_INIT );
- }
- else
- {
- SX1276LoRaSetRFState( RFLR_STATE_TX_INIT );
- }
- }
- void SX1276GetRxPacket( void *buffer, uint16_t *size )
- {
- if( LoRaOn == false )
- {
- SX1276FskGetRxPacket( buffer, size );
- }
- else
- {
- SX1276LoRaGetRxPacket( buffer, size );
- }
- }
- void SX1276SetTxPacket( const void *buffer, uint16_t size )
- {
- if( LoRaOn == false )
- {
- SX1276FskSetTxPacket( buffer, size );
- }
- else
- {
- SX1276LoRaSetTxPacket( buffer, size );
- }
- }
- uint8_t SX1276GetRFState( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskGetRFState( );
- }
- else
- {
- return SX1276LoRaGetRFState( );
- }
- }
- void SX1276SetRFState( uint8_t state )
- {
- if( LoRaOn == false )
- {
- SX1276FskSetRFState( state );
- }
- else
- {
- SX1276LoRaSetRFState( state );
- }
- }
- uint32_t SX1276Process( void )
- {
- if( LoRaOn == false )
- {
- return SX1276FskProcess( );
- }
- else
- {
- return SX1276LoRaProcess( );
- }
- }
- void testSPI(void)
- {
- uint8_t readData = 0;
- SX1276Read(REG_FRFMSB, &readData);
- }
- #endif // USE_SX1276_RADIO
|