Fork of SX1276 Lib
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 #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 }
Generated on Wed Jul 13 2022 04:33:56 by 1.7.2