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 SX1276Lib by
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, D11, D12, D13, D10, A0, D2, D3, D4, 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 #else 00136 #warning "Check the board's SPI frequency" 00137 #endif 00138 wait(0.1); 00139 } 00140 00141 void SX1276MB1xAS::IoIrqInit( DioIrqHandler *irqHandlers ) 00142 { 00143 #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) ) 00144 dio0 .mode( PullDown ); 00145 dio1.mode( PullDown ); 00146 dio2.mode( PullDown ); 00147 dio3.mode( PullDown ); 00148 dio4.mode( PullDown ); 00149 #endif 00150 dio0 .rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[0] ) ); 00151 dio1.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[1] ) ); 00152 dio2.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[2] ) ); 00153 dio3.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[3] ) ); 00154 dio4.rise( this, static_cast< TriggerMB1xAS > ( irqHandlers[4] ) ); 00155 } 00156 00157 void SX1276MB1xAS::IoDeInit( void ) 00158 { 00159 //nothing 00160 } 00161 00162 uint8_t SX1276MB1xAS::GetPaSelect( uint32_t channel ) 00163 { 00164 if( channel > RF_MID_BAND_THRESH ) 00165 { 00166 if( boardConnected == SX1276MB1LAS ) 00167 { 00168 return RF_PACONFIG_PASELECT_PABOOST; 00169 } 00170 else 00171 { 00172 return RF_PACONFIG_PASELECT_RFO; 00173 } 00174 } 00175 else 00176 { 00177 return RF_PACONFIG_PASELECT_RFO; 00178 } 00179 } 00180 00181 void SX1276MB1xAS::SetAntSwLowPower( bool status ) 00182 { 00183 if( isRadioActive != status ) 00184 { 00185 isRadioActive = status; 00186 00187 if( status == false ) 00188 { 00189 AntSwInit( ); 00190 } 00191 else 00192 { 00193 AntSwDeInit( ); 00194 } 00195 } 00196 } 00197 00198 void SX1276MB1xAS::AntSwInit( void ) 00199 { 00200 antSwitch = 0; 00201 } 00202 00203 void SX1276MB1xAS::AntSwDeInit( void ) 00204 { 00205 antSwitch = 0; 00206 } 00207 00208 void SX1276MB1xAS::SetAntSw( uint8_t rxTx ) 00209 { 00210 00211 this->rxTx = rxTx ; 00212 00213 // 1: Tx, 0: Rx 00214 if( rxTx != 0 ) 00215 { 00216 antSwitch = 1; 00217 } 00218 else 00219 { 00220 antSwitch = 0; 00221 } 00222 } 00223 00224 bool SX1276MB1xAS::CheckRfFrequency( uint32_t frequency ) 00225 { 00226 //TODO: Implement check, currently all frequencies are supported 00227 return true; 00228 } 00229 00230 00231 void SX1276MB1xAS::Reset( void ) 00232 { 00233 reset .output(); 00234 reset = 0; 00235 wait_ms( 1 ); 00236 reset .input(); 00237 wait_ms( 6 ); 00238 } 00239 00240 void SX1276MB1xAS::Write( uint8_t addr, uint8_t data ) 00241 { 00242 Write( addr, &data, 1 ); 00243 } 00244 00245 uint8_t SX1276MB1xAS::Read( uint8_t addr ) 00246 { 00247 uint8_t data; 00248 Read( addr, &data, 1 ); 00249 return data; 00250 } 00251 00252 void SX1276MB1xAS::Write( uint8_t addr, uint8_t *buffer, uint8_t size ) 00253 { 00254 uint8_t i; 00255 00256 nss = 0; 00257 spi .write( addr | 0x80 ); 00258 for( i = 0; i < size; i++ ) 00259 { 00260 spi .write( buffer[i] ); 00261 } 00262 nss = 1; 00263 } 00264 00265 void SX1276MB1xAS::Read( uint8_t addr, uint8_t *buffer, uint8_t size ) 00266 { 00267 uint8_t i; 00268 00269 nss = 0; 00270 spi .write( addr & 0x7F ); 00271 for( i = 0; i < size; i++ ) 00272 { 00273 buffer[i] = spi .write( 0 ); 00274 } 00275 nss = 1; 00276 } 00277 00278 void SX1276MB1xAS::WriteFifo( uint8_t *buffer, uint8_t size ) 00279 { 00280 Write( 0, buffer, size ); 00281 } 00282 00283 void SX1276MB1xAS::ReadFifo( uint8_t *buffer, uint8_t size ) 00284 { 00285 Read( 0, buffer, size ); 00286 }
Generated on Tue Jul 12 2022 21:43:20 by
1.7.2
