Modtronix inAir9 driver based on SX1276 standard driver
Dependents: SX1276PingPong_inAir Sensors LoRaTerminal
Fork of SX1276Lib by
sx1276-inAir.cpp
00001 #include "sx1276-inAir.h" 00002 00003 const RadioRegisters_t SX1276inAir::RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE; 00004 00005 SX1276inAir::SX1276inAir( RadioEvents_t *events, 00006 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset, 00007 PinName dio0, PinName dio1, PinName dio2, PinName dio3, 00008 PinName antSwitch ) 00009 : SX1276 ( events, mosi, miso, sclk, nss, reset, dio0, dio1, dio2, dio3, NC, NC), 00010 antSwitch( NC ), 00011 fake( NC ) 00012 { 00013 this->RadioEvents = events; 00014 00015 Reset(); 00016 00017 RxChainCalibration( ); 00018 00019 IoInit( ); 00020 00021 SetOpMode( RF_OPMODE_SLEEP ); 00022 00023 IoIrqInit( dioIrq ); 00024 00025 RadioRegistersInit( ); 00026 00027 SetModem( MODEM_FSK ); 00028 00029 this->settings.State = RF_IDLE ; 00030 } 00031 00032 SX1276inAir::SX1276inAir( RadioEvents_t *events ) 00033 : SX1276 ( events, D11/*MOSI*/, D12/*MISO*/, D13/*SCLK*/, D7/*CS*/, A5/*RST*/, D2/*DIO0*/, D8, D4, A4, NC, NC ), // For NUCLEO L152RE dio4 is on port A3 00034 antSwitch( A4 ), 00035 fake( D8 ) 00036 { 00037 this->RadioEvents = events; 00038 00039 Reset(); 00040 00041 boardConnected = BOARD_UNKNOWN; 00042 00043 DetectBoardType(); 00044 00045 RxChainCalibration( ); 00046 00047 IoInit( ); 00048 00049 SetOpMode( RF_OPMODE_SLEEP ); 00050 00051 IoIrqInit( dioIrq ); 00052 00053 RadioRegistersInit( ); 00054 00055 SetModem( MODEM_FSK ); 00056 00057 this->settings.State = RF_IDLE ; 00058 } 00059 00060 //------------------------------------------------------------------------- 00061 // Board relative functions 00062 //------------------------------------------------------------------------- 00063 uint8_t SX1276inAir::DetectBoardType( void ) 00064 { 00065 //Detect board type NOT possible with inAir4, inAir9 and inAir9B boards. User has to call 00066 //the SetBoardType() function to set the board type! 00067 return ( boardConnected ); 00068 } 00069 00070 void SX1276inAir::IoInit( void ) 00071 { 00072 AntSwInit( ); 00073 SpiInit( ); 00074 } 00075 00076 void SX1276inAir::RadioRegistersInit( ){ 00077 uint8_t i = 0; 00078 for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ ) 00079 { 00080 SetModem( RadioRegsInit[i].Modem ); 00081 Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value ); 00082 } 00083 } 00084 00085 void SX1276inAir::SpiInit( void ) 00086 { 00087 nss = 1; 00088 spi.format( 8,0 ); 00089 uint32_t frequencyToSet = 8000000; 00090 #if( defined (TARGET_NUCLEO_F446RE) || defined ( TARGET_NUCLEO_L152RE ) || defined (TARGET_NUCLEO_F401RE) || defined ( TARGET_LPC11U6X ) || defined (TARGET_K64F) || defined ( TARGET_NZ32ST1L ) || defined(TARGET_NZ32SC151) ) 00091 spi.frequency( frequencyToSet ); 00092 #elif( defined ( TARGET_KL25Z ) ) //busclock frequency is halved -> double the spi frequency to compensate 00093 spi.frequency( frequencyToSet * 2 ); 00094 #else 00095 #warning "Check the board's SPI frequency" 00096 #endif 00097 wait(0.1); 00098 } 00099 00100 void SX1276inAir::IoIrqInit( DioIrqHandler *irqHandlers ) 00101 { 00102 //TARGET_KL25Z board does not have pulldown resistors, seems like TARGET_K64F does have them 00103 #if( defined (TARGET_NUCLEO_F446RE) || defined ( TARGET_NUCLEO_L152RE ) || defined (TARGET_NUCLEO_F401RE) || defined ( TARGET_LPC11U6X ) || defined (TARGET_K64F) || defined ( TARGET_NZ32ST1L ) || defined(TARGET_NZ32SC151)) 00104 dio0.mode(PullDown); 00105 dio1.mode(PullDown); 00106 dio2.mode(PullDown); 00107 dio3.mode(PullDown); 00108 //dio4.mode(PullDown); 00109 #endif 00110 dio0.rise( this, static_cast< TriggerInAir > ( irqHandlers[0] ) ); 00111 dio1.rise( this, static_cast< TriggerInAir > ( irqHandlers[1] ) ); 00112 dio2.rise( this, static_cast< TriggerInAir > ( irqHandlers[2] ) ); 00113 //For SHD3I with BOARD_INAIR4 in imod3, on FRDM-KL25Z board. It uses A4 on FRDM-KL25Z board, which does not have interrupt 00114 #if( defined ( TARGET_KL25Z ) && defined(SHIELD_SHD3I_INAIR9) ) 00115 //Nothing to be done 00116 #else 00117 dio3.rise( this, static_cast< TriggerInAir > ( irqHandlers[3] ) ); 00118 #endif 00119 //dio4.rise( this, static_cast< TriggerInAir > ( irqHandlers[4] ) ); 00120 } 00121 00122 void SX1276inAir::IoDeInit( void ) 00123 { 00124 //nothing 00125 } 00126 00127 uint8_t SX1276inAir::GetPaSelect( uint32_t channel ) 00128 { 00129 if(boardConnected == BOARD_INAIR9B) { 00130 return RF_PACONFIG_PASELECT_PABOOST; 00131 } 00132 else { 00133 return RF_PACONFIG_PASELECT_RFO; 00134 } 00135 } 00136 00137 void SX1276inAir::SetAntSwLowPower( bool status ) 00138 { 00139 if( isRadioActive != status ) 00140 { 00141 isRadioActive = status; 00142 00143 if( status == false ) 00144 { 00145 AntSwInit( ); 00146 } 00147 else 00148 { 00149 AntSwDeInit( ); 00150 } 00151 } 00152 } 00153 00154 void SX1276inAir::AntSwInit( void ) 00155 { 00156 //antSwitch = 0; 00157 } 00158 00159 void SX1276inAir::AntSwDeInit( void ) 00160 { 00161 //antSwitch = 0; 00162 } 00163 00164 void SX1276inAir::SetAntSw( uint8_t rxTx ) 00165 { 00166 if( this->rxTx == rxTx ) 00167 { 00168 //no need to go further 00169 return; 00170 } 00171 00172 this->rxTx = rxTx; 00173 00174 // if( rxTx != 0 ) 00175 // { 00176 // antSwitch = 1; 00177 // } 00178 // else 00179 // { 00180 // antSwitch = 0; 00181 // } 00182 } 00183 00184 bool SX1276inAir::CheckRfFrequency( uint32_t frequency ) 00185 { 00186 //TODO: Implement check, currently all frequencies are supported 00187 return true; 00188 } 00189 00190 00191 void SX1276inAir::Reset( void ) 00192 { 00193 reset.output(); 00194 reset = 0; 00195 wait_ms( 1 ); 00196 reset.input(); 00197 wait_ms( 6 ); 00198 } 00199 00200 void SX1276inAir::Write( uint8_t addr, uint8_t data ) 00201 { 00202 Write( addr, &data, 1 ); 00203 } 00204 00205 uint8_t SX1276inAir::Read( uint8_t addr ) 00206 { 00207 uint8_t data; 00208 Read( addr, &data, 1 ); 00209 return data; 00210 } 00211 00212 void SX1276inAir::Write( uint8_t addr, uint8_t *buffer, uint8_t size ) 00213 { 00214 uint8_t i; 00215 00216 nss = 0; 00217 spi.write( addr | 0x80 ); 00218 for( i = 0; i < size; i++ ) 00219 { 00220 spi.write( buffer[i] ); 00221 } 00222 nss = 1; 00223 } 00224 00225 void SX1276inAir::Read( uint8_t addr, uint8_t *buffer, uint8_t size ) 00226 { 00227 uint8_t i; 00228 00229 nss = 0; 00230 spi.write( addr & 0x7F ); 00231 for( i = 0; i < size; i++ ) 00232 { 00233 buffer[i] = spi.write( 0 ); 00234 } 00235 nss = 1; 00236 } 00237 00238 void SX1276inAir::WriteFifo( uint8_t *buffer, uint8_t size ) 00239 { 00240 Write( 0, buffer, size ); 00241 } 00242 00243 void SX1276inAir::ReadFifo( uint8_t *buffer, uint8_t size ) 00244 { 00245 Read( 0, buffer, size ); 00246 }
Generated on Thu Jul 14 2022 20:59:58 by 1.7.2