Fork of SX1276 Lib

Fork of SX1276Lib by Semtech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sx1276-hal.cpp Source File

sx1276-hal.cpp

00001 /*
00002  / _____)             _              | |
00003 ( (____  _____ ____ _| |_ _____  ____| |__
00004  \____ \| ___ |    (_   _) ___ |/ ___)  _ \
00005  _____) ) ____| | | || |_| ____( (___| | | |
00006 (______/|_____)_|_|_| \__)_____)\____)_| |_|
00007     (C) 2014 Semtech
00008 
00009 Description: -
00010 
00011 License: Revised BSD License, see LICENSE.TXT file include in the project
00012 
00013 Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
00014 */
00015 #include "sx1276-hal.h"
00016 
00017 const RadioRegisters_t  SX1276MB1xAS::RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE;
00018 
00019 SX1276MB1xAS::SX1276MB1xAS( RadioEvents_t *events,
00020                             PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
00021                             PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5,
00022                             PinName antSwitch )
00023                             : SX1276 ( events, mosi, miso, sclk, nss, reset, dio0, dio1, dio2, dio3, dio4, dio5 ),
00024                             antSwitch( antSwitch ),
00025                         #if( defined ( TARGET_NUCLEO_L152RE ) )
00026                             fake( D8 ) 
00027                         #elif ( defined( TARGET_MOTE_L152RC ) || defined( TARGET_XDOT_L151CC) )
00028                             fake( PB_2 )
00029                         #else
00030                             fake( A3 )
00031                         #endif
00032 {
00033     this->RadioEvents = events;
00034 
00035     Reset( );
00036     
00037     RxChainCalibration( );
00038     
00039     IoInit( );
00040     
00041     SetOpMode( RF_OPMODE_SLEEP );
00042     
00043     IoIrqInit( dioIrq );
00044     
00045     RadioRegistersInit( );
00046 
00047     SetModem( MODEM_FSK );
00048 
00049     this->settings.State = RF_IDLE ;
00050 }
00051 
00052 SX1276MB1xAS::SX1276MB1xAS( RadioEvents_t *events ) 
00053                         #if defined ( TARGET_NUCLEO_L152RE )
00054                         :   SX1276 ( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, A3, D9 ), // For NUCLEO L152RE dio4 is on port A3
00055                             antSwitch( A4 ),
00056                             fake( D8 )
00057                         #elif defined( TARGET_LPC11U6X )
00058                         :   SX1276 ( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ),
00059                             antSwitch( P0_23 ), 
00060                             fake( A3 )
00061                         #elif defined( TARGET_XDOT_L151CC)
00062                         :  SX1276 ( events, PA_15, PA_14, PB_3, PB_4, PC_13, PB_6, PB_8, PB_2, PB_9, PB_15, PB_5 ), 
00063                             antSwitch( PB_0 ),
00064                             fake( PB_1 )
00065                         #elif defined( TARGET_MOTE_L152RC ) 
00066                         // This is Pinout Setting for Drifter v1.1 (To Do: move to commisioning / main file)
00067                         :  SX1276 ( events, PB_5, PB_4, PB_3, PA_15, PA_1, PA_6, PA_7, PA_8, PB_15, PA_0, PB_14 ), 
00068                             antSwitch( PB_0 ),
00069                             fake( PB_2 )
00070                         #else
00071                         :   SX1276 ( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ),
00072                             antSwitch( A4 ), 
00073                             fake( A3 )
00074                         #endif
00075 {
00076     this->RadioEvents = events;
00077 
00078     Reset( );
00079     
00080     //Determine the board type
00081     // board known: Hope RFM95 / RFM98: SX1276MB1LAS (PA_Boost Pin),
00082     //              Semtech Board :     SX1276MB1MAS (RFO Pin)
00083     boardConnected = SX1276MB1LAS; 
00084     
00085     RxChainCalibration( );
00086     
00087     IoInit( );
00088     
00089     SetOpMode( RF_OPMODE_SLEEP );
00090     IoIrqInit( dioIrq );
00091     
00092     RadioRegistersInit( );
00093 
00094     SetModem( MODEM_FSK );
00095 
00096     this->settings.State = RF_IDLE ;
00097 }
00098 
00099 //-------------------------------------------------------------------------
00100 //                      Board relative functions
00101 //-------------------------------------------------------------------------
00102 uint8_t SX1276MB1xAS::DetectBoardType( void )
00103 {
00104     if( boardConnected == UNKNOWN )
00105     {
00106         antSwitch .input( );
00107         wait_ms( 1 );
00108         if( antSwitch  == 1 )
00109         {
00110             boardConnected = SX1276MB1LAS;
00111         }
00112         else
00113         {
00114             boardConnected = SX1276MB1MAS;
00115         }
00116         antSwitch .output( );
00117         wait_ms( 1 );
00118     }
00119     return ( boardConnected );
00120 }
00121 
00122 void SX1276MB1xAS::IoInit( void )
00123 {
00124     AntSwInit( );
00125     SpiInit( );
00126 }
00127 
00128 void SX1276MB1xAS::RadioRegistersInit( )
00129 {
00130     uint8_t i = 0;
00131     for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t  ); i++ )
00132     {
00133         SetModem( RadioRegsInit[i].Modem );
00134         Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value );
00135     }    
00136 }
00137 
00138 void SX1276MB1xAS::SpiInit( void )
00139 {
00140     nss = 1;    
00141     spi .format( 8,0 );   
00142     uint32_t frequencyToSet = 8000000;
00143     #if( defined( TARGET_MOTE_L152RC ) || defined( TARGET_XDOT_L151CC) || defined ( TARGET_NUCLEO_L152RE ) ||  defined ( TARGET_LPC11U6X ) )
00144         spi .frequency( frequencyToSet );
00145     #elif( defined ( TARGET_KL25Z ) ) //busclock frequency is halved -> double the spi frequency to compensate
00146         spi .frequency( frequencyToSet * 2 );
00147     #else
00148         #warning "Check the board's SPI frequency"
00149     #endif
00150     wait(0.1); 
00151 }
00152 
00153 void SX1276MB1xAS::IoIrqInit( DioIrqHandler *irqHandlers )
00154 {
00155 #if( defined( TARGET_MOTE_L152RC ) || defined( TARGET_XDOT_L151CC) || defined ( TARGET_NUCLEO_L152RE ) ||  defined ( TARGET_LPC11U6X ) )
00156     dio0 .mode(PullDown);
00157     dio1.mode(PullDown);   
00158     dio2.mode(PullDown);
00159     dio3.mode(PullDown); 
00160     dio4.mode(PullDown); 
00161 #endif
00162     dio0 .rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[0] ) );
00163     dio1.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[1] ) );
00164     dio2.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[2] ) );
00165     dio3.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[3] ) );
00166     dio4.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[4] ) );
00167     
00168 }
00169 
00170 void SX1276MB1xAS::IoDeInit( void )
00171 {
00172     //nothing
00173 }
00174 
00175 uint8_t SX1276MB1xAS::GetPaSelect( uint32_t channel )
00176 {
00177     if( channel > RF_MID_BAND_THRESH )
00178     {
00179         if( boardConnected == SX1276MB1LAS )
00180         {
00181             return RF_PACONFIG_PASELECT_PABOOST;
00182         }
00183         else
00184         {
00185             return RF_PACONFIG_PASELECT_RFO;
00186         }
00187     }
00188     else
00189     {
00190         return RF_PACONFIG_PASELECT_RFO;
00191     }
00192 }
00193 
00194 void SX1276MB1xAS::SetAntSwLowPower( bool status )
00195 {
00196     if( isRadioActive != status )
00197     {
00198         isRadioActive = status;
00199     
00200         if( status == false )
00201         {
00202             AntSwInit( );
00203         }
00204         else
00205         {
00206             AntSwDeInit( );
00207         }
00208     }
00209 }
00210 
00211 void SX1276MB1xAS::AntSwInit( void )
00212 {
00213     antSwitch  = 0;
00214 }
00215 
00216 void SX1276MB1xAS::AntSwDeInit( void )
00217 {
00218     antSwitch  = 0;
00219 }
00220 
00221 void SX1276MB1xAS::SetAntSw( uint8_t rxTx )
00222 {
00223     if( this->rxTx == rxTx )
00224     {
00225         //no need to go further
00226         return;
00227     }
00228 
00229     this->rxTx = rxTx ;
00230 
00231     if( rxTx != 0 )
00232     {
00233         antSwitch  = 1;
00234     }
00235     else
00236     {
00237         antSwitch  = 0;
00238     }
00239 }
00240 
00241 bool SX1276MB1xAS::CheckRfFrequency( uint32_t frequency )
00242 {
00243     //TODO: Implement check, currently all frequencies are supported
00244     return true;
00245 }
00246 
00247 
00248 void SX1276MB1xAS::Reset( void )
00249 {
00250     reset .output();
00251     reset  = 0;
00252     wait_ms( 1 );
00253     reset .input();
00254     wait_ms( 6 );
00255 }
00256     
00257 void SX1276MB1xAS::Write( uint8_t addr, uint8_t data )
00258 {
00259     Write( addr, &data, 1 );
00260 }
00261 
00262 uint8_t SX1276MB1xAS::Read( uint8_t addr )
00263 {
00264     uint8_t data;
00265     Read( addr, &data, 1 );
00266     return data;
00267 }
00268 
00269 void SX1276MB1xAS::Write( uint8_t addr, uint8_t *buffer, uint8_t size )
00270 {
00271     uint8_t i;
00272 
00273     nss = 0;
00274     spi .write( addr | 0x80 );
00275     for( i = 0; i < size; i++ )
00276     {
00277         spi .write( buffer[i] );
00278     }
00279     nss = 1;
00280 }
00281 
00282 void SX1276MB1xAS::Read( uint8_t addr, uint8_t *buffer, uint8_t size )
00283 {
00284     uint8_t i;
00285 
00286     nss = 0;
00287     spi .write( addr & 0x7F );
00288     for( i = 0; i < size; i++ )
00289     {
00290         buffer[i] = spi .write( 0 );
00291     }
00292     nss = 1;
00293 }
00294 
00295 void SX1276MB1xAS::WriteFifo( uint8_t *buffer, uint8_t size )
00296 {
00297     Write( 0, buffer, size );
00298 }
00299 
00300 void SX1276MB1xAS::ReadFifo( uint8_t *buffer, uint8_t size )
00301 {
00302     Read( 0, buffer, size );
00303 }