Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SX1272Lib by
sx1272-hal.cpp
00001 /* 00002 / _____) _ | | 00003 ( (____ _____ ____ _| |_ _____ ____| |__ 00004 \____ \| ___ | (_ _) ___ |/ ___) _ \ 00005 _____) ) ____| | | || |_| ____( (___| | | | 00006 (______/|_____)_|_|_| \__)_____)\____)_| |_| 00007 (C) 2015 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 "sx1272-hal.h" 00016 00017 const RadioRegisters_t SX1272MB2xAS::RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE; 00018 00019 SX1272MB2xAS::SX1272MB2xAS( 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 #if defined ( TARGET_MOTE_L152RC ) 00023 PinName rfSwitchCntr1, PinName rfSwitchCntr2 ) 00024 #elif defined ( TARGET_MTS_MDOT_F411RE ) 00025 PinName txctl, PinName rxctl ) 00026 #else 00027 PinName antSwitch ) 00028 #endif 00029 : SX1272 ( events, mosi, miso, sclk, nss, reset, dio0, dio1, dio2, dio3, dio4, dio5 ), 00030 #if defined ( TARGET_MOTE_L152RC ) 00031 RfSwitchCntr1( rfSwitchCntr1 ), 00032 RfSwitchCntr2( rfSwitchCntr2 ), 00033 PwrAmpCntr( PD_2 ) 00034 #elif defined ( TARGET_MTS_MDOT_F411RE ) 00035 TxCtl ( txctl ), 00036 RxCtl ( rxctl ) 00037 #else 00038 AntSwitch( antSwitch ), 00039 #if( defined ( TARGET_NUCLEO_L152RE ) ) || defined ( TARGET_NUCLEO_L476RG ) 00040 Fake( D8 ) 00041 #else 00042 Fake( A3 ) 00043 #endif 00044 #endif 00045 { 00046 this->RadioEvents = events; 00047 00048 Reset( ); 00049 00050 IoInit( ); 00051 00052 SetOpMode( RF_OPMODE_SLEEP ); 00053 00054 IoIrqInit( dioIrq ); 00055 00056 RadioRegistersInit( ); 00057 00058 SetModem( MODEM_FSK ); 00059 00060 this->settings.State = RF_IDLE ; 00061 } 00062 00063 SX1272MB2xAS::SX1272MB2xAS( RadioEvents_t *events ) 00064 #if defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_NUCLEO_L476RG ) 00065 : SX1272 ( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, A3, D9 ), // For NUCLEO L152RE dio4 is on port A3 00066 AntSwitch( A4 ), 00067 Fake( D8 ) 00068 #elif defined ( TARGET_MOTE_L152RC ) 00069 : SX1272 ( events, PB_15, PB_14, PB_13, PB_12, PC_2, PC_6, PC_10, PC_11, PC_8, PC_9, PC_12 ), 00070 RfSwitchCntr1( PC_4 ), 00071 RfSwitchCntr2( PC_13 ), 00072 PwrAmpCntr( PD_2 ) 00073 #elif defined ( TARGET_MTS_MDOT_F411RE ) 00074 : SX1272 ( events, LORA_MOSI, LORA_MISO, LORA_SCK, LORA_NSS, LORA_RESET, LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5 ), 00075 TxCtl( LORA_TXCTL ), 00076 RxCtl( LORA_RXCTL ) 00077 #else 00078 : SX1272 ( events, D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9 ), 00079 AntSwitch( A4 ), 00080 Fake( A3 ) 00081 #endif 00082 { 00083 this->RadioEvents = events; 00084 00085 Reset( ); 00086 00087 boardConnected = UNKNOWN; 00088 00089 DetectBoardType( ); 00090 00091 IoInit( ); 00092 00093 SetOpMode( RF_OPMODE_SLEEP ); 00094 IoIrqInit( dioIrq ); 00095 00096 RadioRegistersInit( ); 00097 00098 SetModem( MODEM_FSK ); 00099 00100 this->settings.State = RF_IDLE ; 00101 } 00102 00103 //------------------------------------------------------------------------- 00104 // Board relative functions 00105 //------------------------------------------------------------------------- 00106 uint8_t SX1272MB2xAS::DetectBoardType( void ) 00107 { 00108 if( boardConnected == UNKNOWN ) 00109 { 00110 #if defined ( TARGET_MOTE_L152RC ) 00111 boardConnected = NA_MOTE_72; 00112 #elif defined ( TARGET_MTS_MDOT_F411RE ) 00113 boardConnected = MDOT_F411RE; 00114 #else 00115 this->AntSwitch.input( ); 00116 wait_ms( 1 ); 00117 if( this->AntSwitch == 1 ) 00118 { 00119 boardConnected = SX1272MB1DCS; 00120 } 00121 else 00122 { 00123 boardConnected = SX1272MB2XAS; 00124 } 00125 this->AntSwitch.output( ); 00126 wait_ms( 1 ); 00127 #endif 00128 } 00129 return ( boardConnected ); 00130 } 00131 00132 void SX1272MB2xAS::IoInit( void ) 00133 { 00134 AntSwInit( ); 00135 SpiInit( ); 00136 } 00137 00138 void SX1272MB2xAS::RadioRegistersInit( ) 00139 { 00140 uint8_t i = 0; 00141 for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ ) 00142 { 00143 SetModem( RadioRegsInit[i].Modem ); 00144 Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value ); 00145 } 00146 } 00147 00148 void SX1272MB2xAS::SpiInit( void ) 00149 { 00150 nss = 1; 00151 spi .format( 8,0 ); 00152 uint32_t frequencyToSet = 8000000; 00153 #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_MOTE_L152RC ) || defined ( TARGET_NUCLEO_L476RG ) || defined ( TARGET_LPC11U6X ) || defined ( TARGET_MTS_MDOT_F411RE ) ) 00154 spi .frequency( frequencyToSet ); 00155 #elif( defined ( TARGET_KL25Z ) ) //busclock frequency is halved -> double the spi frequency to compensate 00156 spi .frequency( frequencyToSet * 2 ); 00157 #else 00158 #warning "Check the board's SPI frequency" 00159 #endif 00160 wait(0.1); 00161 } 00162 00163 void SX1272MB2xAS::IoIrqInit( DioIrqHandler *irqHandlers ) 00164 { 00165 #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_MOTE_L152RC ) || defined ( TARGET_NUCLEO_L476RG ) || defined ( TARGET_NUCLEO_L476RG ) || defined ( TARGET_LPC11U6X ) ) 00166 dio0.mode( PullDown ); 00167 dio1.mode( PullDown ); 00168 dio2.mode( PullDown ); 00169 dio3.mode( PullDown ); 00170 dio4.mode( PullDown ); 00171 #endif 00172 dio0.rise( this, static_cast< TriggerMB2xAS > ( irqHandlers[0] ) ); 00173 dio1.rise( this, static_cast< TriggerMB2xAS > ( irqHandlers[1] ) ); 00174 dio2.rise( this, static_cast< TriggerMB2xAS > ( irqHandlers[2] ) ); 00175 dio3.rise( this, static_cast< TriggerMB2xAS > ( irqHandlers[3] ) ); 00176 dio4.rise( this, static_cast< TriggerMB2xAS > ( irqHandlers[4] ) ); 00177 } 00178 00179 void SX1272MB2xAS::IoDeInit( void ) 00180 { 00181 //nothing 00182 } 00183 00184 uint8_t SX1272MB2xAS::GetPaSelect( uint32_t channel ) 00185 { 00186 if( boardConnected == SX1272MB1DCS || boardConnected == MDOT_F411RE ) 00187 { 00188 return RF_PACONFIG_PASELECT_PABOOST; 00189 } 00190 else 00191 { 00192 return RF_PACONFIG_PASELECT_RFO; 00193 } 00194 } 00195 00196 void SX1272MB2xAS::SetAntSwLowPower( bool status ) 00197 { 00198 if( isRadioActive != status ) 00199 { 00200 isRadioActive = status; 00201 00202 if( status == false ) 00203 { 00204 AntSwInit( ); 00205 } 00206 else 00207 { 00208 AntSwDeInit( ); 00209 } 00210 } 00211 } 00212 00213 void SX1272MB2xAS::AntSwInit( void ) 00214 { 00215 #if defined ( TARGET_MOTE_L152RC ) 00216 this->RfSwitchCntr1 = 0; 00217 this->RfSwitchCntr2 = 0; 00218 this->PwrAmpCntr = 0; 00219 #elif defined ( TARGET_MTS_MDOT_F411RE ) 00220 this->TxCtl = 0; 00221 this->RxCtl = 0; 00222 #else 00223 this->AntSwitch = 0; 00224 #endif 00225 } 00226 00227 void SX1272MB2xAS::AntSwDeInit( void ) 00228 { 00229 #if defined ( TARGET_MOTE_L152RC ) 00230 this->RfSwitchCntr1 = 0; 00231 this->RfSwitchCntr2 = 0; 00232 this->PwrAmpCntr = 0; 00233 #elif defined ( TARGET_MTS_MDOT_F411RE ) 00234 this->TxCtl = 0; 00235 this->RxCtl = 0; 00236 #else 00237 this->AntSwitch = 0; 00238 #endif 00239 } 00240 00241 void SX1272MB2xAS::SetAntSw( uint8_t rxTx ) 00242 { 00243 #if defined ( TARGET_MOTE_L152RC ) 00244 switch( this->currentOpMode ) 00245 { 00246 case RFLR_OPMODE_TRANSMITTER: 00247 if( ( Read( REG_PACONFIG ) & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST ) 00248 { 00249 this->RfSwitchCntr1 = 1; 00250 this->RfSwitchCntr2 = 0; 00251 } 00252 else 00253 { 00254 this->RfSwitchCntr1 = 0; 00255 this->RfSwitchCntr2 = 1; 00256 } 00257 break; 00258 case RFLR_OPMODE_RECEIVER: 00259 case RFLR_OPMODE_RECEIVER_SINGLE: 00260 case RFLR_OPMODE_CAD: 00261 this->RfSwitchCntr1 = 1; 00262 this->RfSwitchCntr2 = 1; 00263 break; 00264 default: 00265 this->RfSwitchCntr1 = 0; 00266 this->RfSwitchCntr2 = 0; 00267 this->PwrAmpCntr = 0; 00268 break; 00269 } 00270 #elif defined ( TARGET_MTS_MDOT_F411RE ) 00271 /* SKY13350 */ 00272 this->rxTx = rxTx ; 00273 00274 // 1: Tx, 0: Rx 00275 if( rxTx != 0 ) 00276 { 00277 this->TxCtl = 1; 00278 this->RxCtl = 0; 00279 } 00280 else 00281 { 00282 this->TxCtl = 0; 00283 this->RxCtl = 1; 00284 } 00285 #else 00286 this->rxTx = rxTx ; 00287 00288 // 1: Tx, 0: Rx 00289 if( rxTx != 0 ) 00290 { 00291 this->AntSwitch = 1; 00292 } 00293 else 00294 { 00295 this->AntSwitch = 0; 00296 } 00297 #endif 00298 } 00299 00300 bool SX1272MB2xAS::CheckRfFrequency( uint32_t frequency ) 00301 { 00302 //TODO: Implement check, currently all frequencies are supported 00303 return true; 00304 } 00305 00306 00307 void SX1272MB2xAS::Reset( void ) 00308 { 00309 reset.output(); 00310 reset = 0; 00311 wait_ms( 1 ); 00312 reset.input(); 00313 wait_ms( 6 ); 00314 } 00315 00316 void SX1272MB2xAS::Write( uint8_t addr, uint8_t data ) 00317 { 00318 Write( addr, &data, 1 ); 00319 } 00320 00321 uint8_t SX1272MB2xAS::Read( uint8_t addr ) 00322 { 00323 uint8_t data; 00324 Read( addr, &data, 1 ); 00325 return data; 00326 } 00327 00328 void SX1272MB2xAS::Write( uint8_t addr, uint8_t *buffer, uint8_t size ) 00329 { 00330 uint8_t i; 00331 00332 nss = 0; 00333 spi .write( addr | 0x80 ); 00334 for( i = 0; i < size; i++ ) 00335 { 00336 spi .write( buffer[i] ); 00337 } 00338 nss = 1; 00339 } 00340 00341 void SX1272MB2xAS::Read( uint8_t addr, uint8_t *buffer, uint8_t size ) 00342 { 00343 uint8_t i; 00344 00345 nss = 0; 00346 spi .write( addr & 0x7F ); 00347 for( i = 0; i < size; i++ ) 00348 { 00349 buffer[i] = spi .write( 0 ); 00350 } 00351 nss = 1; 00352 } 00353 00354 void SX1272MB2xAS::WriteFifo( uint8_t *buffer, uint8_t size ) 00355 { 00356 Write( 0, buffer, size ); 00357 } 00358 00359 void SX1272MB2xAS::ReadFifo( uint8_t *buffer, uint8_t size ) 00360 { 00361 Read( 0, buffer, size ); 00362 }
Generated on Fri Jul 22 2022 10:57:09 by
1.7.2
