SX1276Lib
Fork of SX1276Lib by
Embed:
(wiki syntax)
Show/hide line numbers
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 #else 00028 fake( A3 ) 00029 #endif 00030 { 00031 this->RadioEvents = events; 00032 00033 Reset( ); 00034 00035 RxChainCalibration( ); 00036 00037 IoInit( ); 00038 00039 SetOpMode( RF_OPMODE_SLEEP ); 00040 00041 IoIrqInit( dioIrq ); 00042 00043 RadioRegistersInit( ); 00044 00045 SetModem( MODEM_FSK ); 00046 00047 this->settings.State = RF_IDLE ; 00048 } 00049 00050 SX1276MB1xAS::SX1276MB1xAS( RadioEvents_t *events ) 00051 #if defined ( TARGET_NUCLEO_L152RE ) 00052 : SX1276 ( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, A3, D9 ), // For NUCLEO L152RE dio4 is on port A3 00053 antSwitch( A4 ), 00054 fake( D8 ) 00055 #elif defined( TARGET_LPC11U6X ) 00056 : SX1276 ( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ), 00057 antSwitch( P0_23 ), 00058 fake( A3 ) 00059 #else 00060 : SX1276 ( events, PA_7, PA_6, PA_5, PA_4, PA_3, PA_0, PA_1, PA_2, D5, D8, D9 ), 00061 antSwitch( A4 ), 00062 fake( A3 ) 00063 #endif 00064 { 00065 this->RadioEvents = events; 00066 00067 Reset( ); 00068 00069 boardConnected = UNKNOWN; 00070 00071 DetectBoardType( ); 00072 00073 RxChainCalibration( ); 00074 00075 IoInit( ); 00076 00077 SetOpMode( RF_OPMODE_SLEEP ); 00078 IoIrqInit( dioIrq ); 00079 00080 RadioRegistersInit( ); 00081 00082 SetModem( MODEM_FSK ); 00083 00084 this->settings.State = RF_IDLE ; 00085 } 00086 00087 //------------------------------------------------------------------------- 00088 // Board relative functions 00089 //------------------------------------------------------------------------- 00090 uint8_t SX1276MB1xAS::DetectBoardType( void ) 00091 { 00092 if( boardConnected == UNKNOWN ) 00093 { 00094 antSwitch .input( ); 00095 wait_ms( 1 ); 00096 if( antSwitch == 1 ) 00097 { 00098 boardConnected = SX1276MB1LAS; 00099 } 00100 else 00101 { 00102 boardConnected = SX1276MB1MAS; 00103 } 00104 antSwitch .output( ); 00105 wait_ms( 1 ); 00106 } 00107 return ( boardConnected ); 00108 } 00109 00110 void SX1276MB1xAS::IoInit( void ) 00111 { 00112 AntSwInit( ); 00113 SpiInit( ); 00114 } 00115 00116 void SX1276MB1xAS::RadioRegistersInit( ) 00117 { 00118 uint8_t i = 0; 00119 for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ ) 00120 { 00121 SetModem( RadioRegsInit[i].Modem ); 00122 Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value ); 00123 } 00124 } 00125 00126 void SX1276MB1xAS::SpiInit( void ) 00127 { 00128 nss = 1; 00129 spi .format( 8,0 ); 00130 uint32_t frequencyToSet = 8000000; 00131 #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) ) 00132 spi .frequency( frequencyToSet ); 00133 #elif( defined ( TARGET_KL25Z ) ) //busclock frequency is halved -> double the spi frequency to compensate 00134 spi .frequency( frequencyToSet * 2 ); 00135 #elif( defined ( TARGET_NUCLEO_F103RB ) ) //busclock frequency is halved -> double the spi frequency to compensate 00136 spi .frequency( frequencyToSet); 00137 #else 00138 #warning "Check the board's SPI frequency" 00139 #endif 00140 wait(0.1); 00141 } 00142 00143 void SX1276MB1xAS::IoIrqInit( DioIrqHandler *irqHandlers ) 00144 { 00145 #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) || defined ( TARGET_NUCLEO_F103RB )) 00146 dio0 .mode(PullDown); 00147 dio1.mode(PullDown); 00148 dio2.mode(PullDown); 00149 dio3.mode(PullDown); 00150 dio4.mode(PullDown); 00151 #endif 00152 dio0 .rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[0] ) ); 00153 dio1.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[1] ) ); 00154 dio2.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[2] ) ); 00155 dio3.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[3] ) ); 00156 dio4.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[4] ) ); 00157 } 00158 00159 void SX1276MB1xAS::IoDeInit( void ) 00160 { 00161 //nothing 00162 } 00163 00164 uint8_t SX1276MB1xAS::GetPaSelect( uint32_t channel ) 00165 { 00166 if( channel > RF_MID_BAND_THRESH ) 00167 { 00168 if( boardConnected == SX1276MB1LAS ) 00169 { 00170 return RF_PACONFIG_PASELECT_PABOOST; 00171 } 00172 else 00173 { 00174 return RF_PACONFIG_PASELECT_RFO; 00175 } 00176 } 00177 else 00178 { 00179 return RF_PACONFIG_PASELECT_RFO; 00180 } 00181 } 00182 00183 void SX1276MB1xAS::SetAntSwLowPower( bool status ) 00184 { 00185 if( isRadioActive != status ) 00186 { 00187 isRadioActive = status; 00188 00189 if( status == false ) 00190 { 00191 AntSwInit( ); 00192 } 00193 else 00194 { 00195 AntSwDeInit( ); 00196 } 00197 } 00198 } 00199 00200 void SX1276MB1xAS::AntSwInit( void ) 00201 { 00202 antSwitch = 0; 00203 } 00204 00205 void SX1276MB1xAS::AntSwDeInit( void ) 00206 { 00207 antSwitch = 0; 00208 } 00209 00210 void SX1276MB1xAS::SetAntSw( uint8_t rxTx ) 00211 { 00212 if( this->rxTx == rxTx ) 00213 { 00214 //no need to go further 00215 return; 00216 } 00217 00218 this->rxTx = rxTx ; 00219 00220 if( rxTx != 0 ) 00221 { 00222 antSwitch = 1; 00223 } 00224 else 00225 { 00226 antSwitch = 0; 00227 } 00228 } 00229 00230 bool SX1276MB1xAS::CheckRfFrequency( uint32_t frequency ) 00231 { 00232 //TODO: Implement check, currently all frequencies are supported 00233 return true; 00234 } 00235 00236 00237 void SX1276MB1xAS::Reset( void ) 00238 { 00239 reset .output(); 00240 reset = 0; 00241 wait_ms( 1 ); 00242 reset .input(); 00243 wait_ms( 6 ); 00244 } 00245 00246 void SX1276MB1xAS::Write( uint8_t addr, uint8_t data ) 00247 { 00248 Write( addr, &data, 1 ); 00249 } 00250 00251 uint8_t SX1276MB1xAS::Read( uint8_t addr ) 00252 { 00253 uint8_t data; 00254 Read( addr, &data, 1 ); 00255 return data; 00256 } 00257 00258 void SX1276MB1xAS::Write( uint8_t addr, uint8_t *buffer, uint8_t size ) 00259 { 00260 uint8_t i; 00261 00262 nss = 0; 00263 spi .write( addr | 0x80 ); 00264 for( i = 0; i < size; i++ ) 00265 { 00266 spi .write( buffer[i] ); 00267 } 00268 nss = 1; 00269 } 00270 00271 void SX1276MB1xAS::Read( uint8_t addr, uint8_t *buffer, uint8_t size ) 00272 { 00273 uint8_t i; 00274 00275 nss = 0; 00276 spi .write( addr & 0x7F ); 00277 for( i = 0; i < size; i++ ) 00278 { 00279 buffer[i] = spi .write( 0 ); 00280 } 00281 nss = 1; 00282 } 00283 00284 void SX1276MB1xAS::WriteFifo( uint8_t *buffer, uint8_t size ) 00285 { 00286 Write( 0, buffer, size ); 00287 } 00288 00289 void SX1276MB1xAS::ReadFifo( uint8_t *buffer, uint8_t size ) 00290 { 00291 Read( 0, buffer, size ); 00292 }
Generated on Wed Jul 13 2022 22:23:26 by
