Fork for LoDev

Committer:
Helmut Tschemernjak
Date:
Tue May 09 11:19:51 2017 +0200
Revision:
43:90de42f3c1fd
Parent:
42:72deced1a4c4
Added proper TCXO support (being using in the Murata module)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:e6ceb13d2d05 1 /*
GregCr 0:e6ceb13d2d05 2 / _____) _ | |
GregCr 0:e6ceb13d2d05 3 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:e6ceb13d2d05 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:e6ceb13d2d05 5 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:e6ceb13d2d05 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 22:7f3aab69cca9 7 (C) 2014 Semtech
GregCr 0:e6ceb13d2d05 8
GregCr 0:e6ceb13d2d05 9 Description: -
GregCr 0:e6ceb13d2d05 10
GregCr 0:e6ceb13d2d05 11 License: Revised BSD License, see LICENSE.TXT file include in the project
GregCr 0:e6ceb13d2d05 12
GregCr 0:e6ceb13d2d05 13 Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
GregCr 0:e6ceb13d2d05 14 */
Helmut Tschemernjak 34:07e89f23c734 15
Helmut Tschemernjak 34:07e89f23c734 16 /*
Helmut Tschemernjak 38:d9189d958db8 17 * additional development to make it more generic across multiple OS versions
Helmut Tschemernjak 34:07e89f23c734 18 * (c) 2017 Helmut Tschemernjak
Helmut Tschemernjak 34:07e89f23c734 19 * 30826 Garbsen (Hannover) Germany
Helmut Tschemernjak 34:07e89f23c734 20 */
Helmut Tschemernjak 34:07e89f23c734 21
Helmut64 36:f2b885b6f33e 22 #include "sx1276-mbed-hal.h"
GregCr 0:e6ceb13d2d05 23
Helmut Tschemernjak 38:d9189d958db8 24
GregCr 0:e6ceb13d2d05 25
Helmut Tschemernjak 34:07e89f23c734 26 SX1276Generic::SX1276Generic( RadioEvents_t *events, BoardType_t board,
GregCr 0:e6ceb13d2d05 27 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
GregCr 0:e6ceb13d2d05 28 PinName dio0, PinName dio1, PinName dio2, PinName dio3, PinName dio4, PinName dio5,
Helmut Tschemernjak 34:07e89f23c734 29 PinName antSwitch, PinName antSwitchTX, PinName antSwitchTXBoost, PinName tcxo)
Helmut Tschemernjak 34:07e89f23c734 30 : SX1276( events)
GregCr 0:e6ceb13d2d05 31 {
mluis 21:2e496deb7858 32 this->RadioEvents = events;
Helmut Tschemernjak 34:07e89f23c734 33 boardConnected = board;
Helmut Tschemernjak 34:07e89f23c734 34
Helmut Tschemernjak 34:07e89f23c734 35 _antSwitch = NULL;
Helmut Tschemernjak 34:07e89f23c734 36 _antSwitchTX = NULL;
Helmut Tschemernjak 34:07e89f23c734 37 _antSwitchTXBoost = NULL;
Helmut Tschemernjak 34:07e89f23c734 38
Helmut Tschemernjak 34:07e89f23c734 39 _tcxo = NULL;
Helmut Tschemernjak 34:07e89f23c734 40 if (tcxo != NC)
Helmut Tschemernjak 34:07e89f23c734 41 _tcxo = new DigitalOut(tcxo);
Helmut Tschemernjak 34:07e89f23c734 42
Helmut Tschemernjak 34:07e89f23c734 43 switch(boardConnected) {
Helmut Tschemernjak 34:07e89f23c734 44 case SX1276MB1MAS:
Helmut Tschemernjak 34:07e89f23c734 45 case SX1276MB1LAS:
Helmut Tschemernjak 34:07e89f23c734 46 _antSwitch = new DigitalInOut(antSwitch);
Helmut Tschemernjak 34:07e89f23c734 47 break;
Helmut Tschemernjak 34:07e89f23c734 48 case RFM95_SX1276:
Helmut Tschemernjak 34:07e89f23c734 49 break;
Helmut Tschemernjak 34:07e89f23c734 50 case MURATA_SX1276:
Helmut Tschemernjak 34:07e89f23c734 51 _antSwitch = new DigitalInOut(antSwitch);
Helmut Tschemernjak 34:07e89f23c734 52 _antSwitchTX = new DigitalInOut(antSwitchTX);
Helmut Tschemernjak 34:07e89f23c734 53 _antSwitchTXBoost = new DigitalInOut(antSwitchTXBoost);
Helmut Tschemernjak 34:07e89f23c734 54 break;
Helmut Tschemernjak 34:07e89f23c734 55 default:
Helmut Tschemernjak 34:07e89f23c734 56 break;
Helmut Tschemernjak 34:07e89f23c734 57 }
Helmut Tschemernjak 34:07e89f23c734 58 _spi = new SPI(mosi, miso, sclk );
Helmut Tschemernjak 34:07e89f23c734 59 _nss = new DigitalOut(nss);
Helmut Tschemernjak 34:07e89f23c734 60
Helmut Tschemernjak 34:07e89f23c734 61 _reset = new DigitalInOut(reset);
Helmut Tschemernjak 34:07e89f23c734 62
Helmut Tschemernjak 34:07e89f23c734 63 _dio0 = NULL;
Helmut Tschemernjak 34:07e89f23c734 64 _dio1 = NULL;
Helmut Tschemernjak 34:07e89f23c734 65 _dio2 = NULL;
Helmut Tschemernjak 34:07e89f23c734 66 _dio3 = NULL;
Helmut Tschemernjak 34:07e89f23c734 67 _dio4 = NULL;
Helmut Tschemernjak 34:07e89f23c734 68 _dio5 = NULL;
Helmut Tschemernjak 34:07e89f23c734 69 if (dio0 != NC)
Helmut Tschemernjak 34:07e89f23c734 70 _dio0 = new InterruptIn(dio0);
Helmut Tschemernjak 34:07e89f23c734 71 if (dio1 != NC)
Helmut Tschemernjak 34:07e89f23c734 72 _dio1 = new InterruptIn(dio1);
Helmut Tschemernjak 34:07e89f23c734 73 if (dio2 != NC)
Helmut Tschemernjak 34:07e89f23c734 74 _dio2 = new InterruptIn(dio2);
Helmut Tschemernjak 34:07e89f23c734 75 if (dio3 != NC)
Helmut Tschemernjak 34:07e89f23c734 76 _dio3 = new InterruptIn(dio3);
Helmut Tschemernjak 34:07e89f23c734 77 if (dio4 != NC)
Helmut Tschemernjak 34:07e89f23c734 78 _dio4 = new InterruptIn(dio4);
Helmut Tschemernjak 34:07e89f23c734 79 if (dio5 != NC)
Helmut Tschemernjak 34:07e89f23c734 80 _dio5 = new DigitalIn(dio5);
Helmut Tschemernjak 34:07e89f23c734 81
GregCr 0:e6ceb13d2d05 82 Reset( );
mluis 25:3778e6204cc1 83
GregCr 0:e6ceb13d2d05 84 IoInit( );
mluis 25:3778e6204cc1 85
Helmut Tschemernjak 34:07e89f23c734 86 RxChainCalibration( );
Helmut Tschemernjak 34:07e89f23c734 87
GregCr 0:e6ceb13d2d05 88 SetOpMode( RF_OPMODE_SLEEP );
mluis 25:3778e6204cc1 89
GregCr 0:e6ceb13d2d05 90 IoIrqInit( dioIrq );
mluis 25:3778e6204cc1 91
GregCr 0:e6ceb13d2d05 92 RadioRegistersInit( );
GregCr 0:e6ceb13d2d05 93
GregCr 0:e6ceb13d2d05 94 SetModem( MODEM_FSK );
GregCr 0:e6ceb13d2d05 95
mluis 21:2e496deb7858 96 this->settings.State = RF_IDLE ;
GregCr 0:e6ceb13d2d05 97 }
GregCr 0:e6ceb13d2d05 98
Helmut Tschemernjak 34:07e89f23c734 99 SX1276Generic::~SX1276Generic()
GregCr 0:e6ceb13d2d05 100 {
Helmut Tschemernjak 34:07e89f23c734 101 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 102 delete _antSwitch;
Helmut Tschemernjak 34:07e89f23c734 103 if (_antSwitchTX)
Helmut Tschemernjak 34:07e89f23c734 104 delete _antSwitchTX;
Helmut Tschemernjak 34:07e89f23c734 105 if (_antSwitchTXBoost)
Helmut Tschemernjak 34:07e89f23c734 106 delete _antSwitchTXBoost;
Helmut Tschemernjak 34:07e89f23c734 107
Helmut Tschemernjak 34:07e89f23c734 108 if (_tcxo) {
Helmut Tschemernjak 34:07e89f23c734 109 *_tcxo = 0;
Helmut Tschemernjak 34:07e89f23c734 110 delete (_tcxo);
Helmut Tschemernjak 34:07e89f23c734 111 }
Helmut Tschemernjak 34:07e89f23c734 112 delete _reset;
Helmut Tschemernjak 34:07e89f23c734 113 delete _spi;
Helmut Tschemernjak 34:07e89f23c734 114 delete _nss;
Helmut Tschemernjak 34:07e89f23c734 115
Helmut Tschemernjak 34:07e89f23c734 116 if (_dio0)
Helmut Tschemernjak 34:07e89f23c734 117 delete _dio0;
Helmut Tschemernjak 34:07e89f23c734 118 if (_dio1)
Helmut Tschemernjak 34:07e89f23c734 119 delete _dio1;
Helmut Tschemernjak 34:07e89f23c734 120 if (_dio2)
Helmut Tschemernjak 34:07e89f23c734 121 delete _dio2;
Helmut Tschemernjak 34:07e89f23c734 122 if (_dio3)
Helmut Tschemernjak 34:07e89f23c734 123 delete _dio3;
Helmut Tschemernjak 34:07e89f23c734 124 if (_dio4)
Helmut Tschemernjak 34:07e89f23c734 125 delete _dio4;
Helmut Tschemernjak 34:07e89f23c734 126 if (_dio5)
Helmut Tschemernjak 34:07e89f23c734 127 delete _dio5;
GregCr 0:e6ceb13d2d05 128 }
GregCr 0:e6ceb13d2d05 129
Helmut Tschemernjak 38:d9189d958db8 130
GregCr 0:e6ceb13d2d05 131 //-------------------------------------------------------------------------
GregCr 0:e6ceb13d2d05 132 // Board relative functions
GregCr 0:e6ceb13d2d05 133 //-------------------------------------------------------------------------
Helmut Tschemernjak 34:07e89f23c734 134 uint8_t SX1276Generic::DetectBoardType( void )
GregCr 1:f979673946c0 135 {
Helmut Tschemernjak 34:07e89f23c734 136 return boardConnected;
GregCr 1:f979673946c0 137 }
GregCr 0:e6ceb13d2d05 138
Helmut Tschemernjak 34:07e89f23c734 139 void SX1276Generic::IoInit( void )
GregCr 0:e6ceb13d2d05 140 {
Helmut Tschemernjak 43:90de42f3c1fd 141 if (_tcxo) {
Helmut Tschemernjak 34:07e89f23c734 142 *_tcxo = 1;
Helmut Tschemernjak 43:90de42f3c1fd 143 wait_ms(TCXO_STARTUP_MS);
Helmut Tschemernjak 43:90de42f3c1fd 144 }
GregCr 0:e6ceb13d2d05 145 AntSwInit( );
GregCr 0:e6ceb13d2d05 146 SpiInit( );
GregCr 0:e6ceb13d2d05 147 }
GregCr 0:e6ceb13d2d05 148
GregCr 0:e6ceb13d2d05 149
Helmut Tschemernjak 34:07e89f23c734 150 void SX1276Generic::SpiInit( void )
GregCr 0:e6ceb13d2d05 151 {
Helmut Tschemernjak 34:07e89f23c734 152 *_nss = 1;
Helmut Tschemernjak 34:07e89f23c734 153 _spi->format( 8,0 );
GregCr 0:e6ceb13d2d05 154 uint32_t frequencyToSet = 8000000;
Helmut Tschemernjak 34:07e89f23c734 155 #ifdef TARGET_KL25Z //busclock frequency is halved -> double the spi frequency to compensate
Helmut Tschemernjak 34:07e89f23c734 156 _spi->frequency( frequencyToSet * 2 );
Helmut Tschemernjak 34:07e89f23c734 157 #else
Helmut Tschemernjak 34:07e89f23c734 158 _spi->frequency( frequencyToSet );
Helmut Tschemernjak 34:07e89f23c734 159 #endif
Helmut Tschemernjak 34:07e89f23c734 160 wait_ms(100);
GregCr 0:e6ceb13d2d05 161 }
GregCr 0:e6ceb13d2d05 162
Helmut Tschemernjak 34:07e89f23c734 163 void SX1276Generic::IoIrqInit( DioIrqHandler *irqHandlers )
GregCr 0:e6ceb13d2d05 164 {
mluis 25:3778e6204cc1 165 #if( defined ( TARGET_NUCLEO_L152RE ) || defined ( TARGET_LPC11U6X ) )
mluis 25:3778e6204cc1 166 dio0.mode( PullDown );
mluis 25:3778e6204cc1 167 dio1.mode( PullDown );
mluis 25:3778e6204cc1 168 dio2.mode( PullDown );
mluis 25:3778e6204cc1 169 dio3.mode( PullDown );
mluis 25:3778e6204cc1 170 dio4.mode( PullDown );
mluis 22:7f3aab69cca9 171 #endif
Helmut Tschemernjak 34:07e89f23c734 172 if (_dio0)
Helmut Tschemernjak 39:706c32eda7e7 173 _dio0->rise(callback(this, static_cast< Trigger > ( irqHandlers[0] )));
Helmut Tschemernjak 34:07e89f23c734 174 if (_dio1)
Helmut Tschemernjak 39:706c32eda7e7 175 _dio1->rise(callback(this, static_cast< Trigger > ( irqHandlers[1] )));
Helmut Tschemernjak 34:07e89f23c734 176 if (_dio2)
Helmut Tschemernjak 39:706c32eda7e7 177 _dio2->rise(callback(this, static_cast< Trigger > ( irqHandlers[2] )));
Helmut Tschemernjak 34:07e89f23c734 178 if (_dio3)
Helmut Tschemernjak 39:706c32eda7e7 179 _dio3->rise(callback(this, static_cast< Trigger > ( irqHandlers[3] )));
Helmut Tschemernjak 34:07e89f23c734 180 if (_dio4)
Helmut Tschemernjak 39:706c32eda7e7 181 _dio4->rise(callback(this, static_cast< Trigger > ( irqHandlers[4] )));
GregCr 0:e6ceb13d2d05 182 }
GregCr 0:e6ceb13d2d05 183
Helmut Tschemernjak 34:07e89f23c734 184 void SX1276Generic::IoDeInit( void )
GregCr 0:e6ceb13d2d05 185 {
GregCr 0:e6ceb13d2d05 186 //nothing
GregCr 0:e6ceb13d2d05 187 }
GregCr 0:e6ceb13d2d05 188
Helmut Tschemernjak 34:07e89f23c734 189 void SX1276Generic::SetRfTxPower( int8_t power )
Helmut Tschemernjak 31:e50929bd3f32 190 {
Helmut Tschemernjak 31:e50929bd3f32 191 uint8_t paConfig = 0;
Helmut Tschemernjak 31:e50929bd3f32 192 uint8_t paDac = 0;
Helmut Tschemernjak 31:e50929bd3f32 193
Helmut Tschemernjak 31:e50929bd3f32 194 paConfig = Read( REG_PACONFIG );
Helmut Tschemernjak 31:e50929bd3f32 195 paDac = Read( REG_PADAC );
Helmut Tschemernjak 31:e50929bd3f32 196
Helmut Tschemernjak 31:e50929bd3f32 197 paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | GetPaSelect( this->settings.Channel );
Helmut Tschemernjak 31:e50929bd3f32 198 paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
Helmut Tschemernjak 31:e50929bd3f32 199
Helmut Tschemernjak 31:e50929bd3f32 200 if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
Helmut Tschemernjak 31:e50929bd3f32 201 {
Helmut Tschemernjak 31:e50929bd3f32 202 if( power > 17 )
Helmut Tschemernjak 31:e50929bd3f32 203 {
Helmut Tschemernjak 31:e50929bd3f32 204 paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
Helmut Tschemernjak 31:e50929bd3f32 205 }
Helmut Tschemernjak 31:e50929bd3f32 206 else
Helmut Tschemernjak 31:e50929bd3f32 207 {
Helmut Tschemernjak 31:e50929bd3f32 208 paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
Helmut Tschemernjak 31:e50929bd3f32 209 }
Helmut Tschemernjak 31:e50929bd3f32 210 if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
Helmut Tschemernjak 31:e50929bd3f32 211 {
Helmut Tschemernjak 31:e50929bd3f32 212 if( power < 5 )
Helmut Tschemernjak 31:e50929bd3f32 213 {
Helmut Tschemernjak 31:e50929bd3f32 214 power = 5;
Helmut Tschemernjak 31:e50929bd3f32 215 }
Helmut Tschemernjak 31:e50929bd3f32 216 if( power > 20 )
Helmut Tschemernjak 31:e50929bd3f32 217 {
Helmut Tschemernjak 31:e50929bd3f32 218 power = 20;
Helmut Tschemernjak 31:e50929bd3f32 219 }
Helmut Tschemernjak 31:e50929bd3f32 220 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
Helmut Tschemernjak 31:e50929bd3f32 221 }
Helmut Tschemernjak 31:e50929bd3f32 222 else
Helmut Tschemernjak 31:e50929bd3f32 223 {
Helmut Tschemernjak 31:e50929bd3f32 224 if( power < 2 )
Helmut Tschemernjak 31:e50929bd3f32 225 {
Helmut Tschemernjak 31:e50929bd3f32 226 power = 2;
Helmut Tschemernjak 31:e50929bd3f32 227 }
Helmut Tschemernjak 31:e50929bd3f32 228 if( power > 17 )
Helmut Tschemernjak 31:e50929bd3f32 229 {
Helmut Tschemernjak 31:e50929bd3f32 230 power = 17;
Helmut Tschemernjak 31:e50929bd3f32 231 }
Helmut Tschemernjak 31:e50929bd3f32 232 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
Helmut Tschemernjak 31:e50929bd3f32 233 }
Helmut Tschemernjak 31:e50929bd3f32 234 }
Helmut Tschemernjak 31:e50929bd3f32 235 else
Helmut Tschemernjak 31:e50929bd3f32 236 {
Helmut Tschemernjak 31:e50929bd3f32 237 if( power < -1 )
Helmut Tschemernjak 31:e50929bd3f32 238 {
Helmut Tschemernjak 31:e50929bd3f32 239 power = -1;
Helmut Tschemernjak 31:e50929bd3f32 240 }
Helmut Tschemernjak 31:e50929bd3f32 241 if( power > 14 )
Helmut Tschemernjak 31:e50929bd3f32 242 {
Helmut Tschemernjak 31:e50929bd3f32 243 power = 14;
Helmut Tschemernjak 31:e50929bd3f32 244 }
Helmut Tschemernjak 31:e50929bd3f32 245 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
Helmut Tschemernjak 31:e50929bd3f32 246 }
Helmut Tschemernjak 31:e50929bd3f32 247 Write( REG_PACONFIG, paConfig );
Helmut Tschemernjak 31:e50929bd3f32 248 Write( REG_PADAC, paDac );
Helmut Tschemernjak 31:e50929bd3f32 249 }
Helmut Tschemernjak 31:e50929bd3f32 250
Helmut Tschemernjak 31:e50929bd3f32 251
Helmut Tschemernjak 34:07e89f23c734 252 uint8_t SX1276Generic::GetPaSelect( uint32_t channel )
GregCr 0:e6ceb13d2d05 253 {
GregCr 0:e6ceb13d2d05 254 if( channel > RF_MID_BAND_THRESH )
GregCr 0:e6ceb13d2d05 255 {
Helmut Tschemernjak 34:07e89f23c734 256 if( boardConnected == SX1276MB1LAS || boardConnected == RFM95_SX1276)
GregCr 1:f979673946c0 257 {
GregCr 1:f979673946c0 258 return RF_PACONFIG_PASELECT_PABOOST;
GregCr 1:f979673946c0 259 }
GregCr 1:f979673946c0 260 else
GregCr 1:f979673946c0 261 {
GregCr 1:f979673946c0 262 return RF_PACONFIG_PASELECT_RFO;
GregCr 1:f979673946c0 263 }
GregCr 0:e6ceb13d2d05 264 }
GregCr 0:e6ceb13d2d05 265 else
GregCr 0:e6ceb13d2d05 266 {
GregCr 0:e6ceb13d2d05 267 return RF_PACONFIG_PASELECT_RFO;
GregCr 0:e6ceb13d2d05 268 }
GregCr 0:e6ceb13d2d05 269 }
GregCr 0:e6ceb13d2d05 270
Helmut Tschemernjak 34:07e89f23c734 271 void SX1276Generic::SetAntSwLowPower( bool status )
GregCr 0:e6ceb13d2d05 272 {
GregCr 0:e6ceb13d2d05 273 if( isRadioActive != status )
GregCr 0:e6ceb13d2d05 274 {
GregCr 0:e6ceb13d2d05 275 isRadioActive = status;
GregCr 0:e6ceb13d2d05 276
GregCr 0:e6ceb13d2d05 277 if( status == false )
GregCr 0:e6ceb13d2d05 278 {
GregCr 0:e6ceb13d2d05 279 AntSwInit( );
GregCr 0:e6ceb13d2d05 280 }
GregCr 0:e6ceb13d2d05 281 else
GregCr 0:e6ceb13d2d05 282 {
GregCr 0:e6ceb13d2d05 283 AntSwDeInit( );
GregCr 0:e6ceb13d2d05 284 }
GregCr 0:e6ceb13d2d05 285 }
GregCr 0:e6ceb13d2d05 286 }
GregCr 0:e6ceb13d2d05 287
Helmut Tschemernjak 34:07e89f23c734 288 void SX1276Generic::AntSwInit( void )
GregCr 0:e6ceb13d2d05 289 {
Helmut Tschemernjak 34:07e89f23c734 290 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 291 *_antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 292 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 293 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 294 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 295 }
GregCr 0:e6ceb13d2d05 296 }
GregCr 0:e6ceb13d2d05 297
Helmut Tschemernjak 34:07e89f23c734 298 void SX1276Generic::AntSwDeInit( void )
GregCr 0:e6ceb13d2d05 299 {
Helmut Tschemernjak 34:07e89f23c734 300 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 301 *_antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 302 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 303 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 304 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 305 }
GregCr 0:e6ceb13d2d05 306 }
GregCr 0:e6ceb13d2d05 307
Helmut Tschemernjak 31:e50929bd3f32 308
Helmut Tschemernjak 34:07e89f23c734 309 void SX1276Generic::SetAntSw( uint8_t opMode )
GregCr 0:e6ceb13d2d05 310 {
Helmut Tschemernjak 43:90de42f3c1fd 311 /*
Helmut Tschemernjak 43:90de42f3c1fd 312 * Note that the Mode RFLR (LoRa) and Mode RF are using identical
Helmut Tschemernjak 43:90de42f3c1fd 313 * values. Unfortunately booth representations are being used.
Helmut Tschemernjak 43:90de42f3c1fd 314 */
Helmut Tschemernjak 43:90de42f3c1fd 315 if (_tcxo && *_tcxo == 0 && opMode != RFLR_OPMODE_SLEEP) {
Helmut Tschemernjak 43:90de42f3c1fd 316 *_tcxo = 1;
Helmut Tschemernjak 43:90de42f3c1fd 317 wait_ms(TCXO_STARTUP_MS);
Helmut Tschemernjak 43:90de42f3c1fd 318 }
Helmut Tschemernjak 43:90de42f3c1fd 319
Helmut Tschemernjak 31:e50929bd3f32 320 switch( opMode )
GregCr 0:e6ceb13d2d05 321 {
Helmut Tschemernjak 31:e50929bd3f32 322 case RFLR_OPMODE_TRANSMITTER:
Helmut Tschemernjak 34:07e89f23c734 323 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 324 *_antSwitch = 0;// Murata-RX
Helmut Tschemernjak 41:2dbc4afedf61 325 if (Read( REG_PACONFIG) & RF_PACONFIG_PASELECT_PABOOST)
Helmut Tschemernjak 41:2dbc4afedf61 326 *_antSwitchTXBoost = 1;
Helmut Tschemernjak 41:2dbc4afedf61 327 else
Helmut Tschemernjak 41:2dbc4afedf61 328 *_antSwitchTX = 1; // alternate: antSwitchTXBoost = 1
Helmut Tschemernjak 35:c278a826a8e2 329 } else {
Helmut Tschemernjak 34:07e89f23c734 330 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 331 *_antSwitch = 1;
Helmut Tschemernjak 34:07e89f23c734 332 }
Helmut Tschemernjak 31:e50929bd3f32 333 break;
Helmut Tschemernjak 31:e50929bd3f32 334 case RFLR_OPMODE_RECEIVER:
Helmut Tschemernjak 31:e50929bd3f32 335 case RFLR_OPMODE_RECEIVER_SINGLE:
Helmut Tschemernjak 31:e50929bd3f32 336 case RFLR_OPMODE_CAD:
Helmut Tschemernjak 34:07e89f23c734 337 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 338 *_antSwitch = 1; // Murata-RX
Helmut Tschemernjak 34:07e89f23c734 339 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 340 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 341 } else {
Helmut Tschemernjak 34:07e89f23c734 342 if (_antSwitch)
Helmut Tschemernjak 43:90de42f3c1fd 343 *_antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 344 }
Helmut Tschemernjak 31:e50929bd3f32 345 break;
Helmut Tschemernjak 41:2dbc4afedf61 346 case RFLR_OPMODE_SLEEP:
Helmut Tschemernjak 43:90de42f3c1fd 347 if (_tcxo)
Helmut Tschemernjak 43:90de42f3c1fd 348 *_tcxo = 0;
Helmut Tschemernjak 41:2dbc4afedf61 349 case RFLR_OPMODE_STANDBY:
Helmut Tschemernjak 31:e50929bd3f32 350 default:
Helmut Tschemernjak 34:07e89f23c734 351 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 352 *_antSwitch = 0; //Murata-RX
Helmut Tschemernjak 34:07e89f23c734 353 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 354 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 355 } else {
Helmut Tschemernjak 34:07e89f23c734 356 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 357 *_antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 358 }
Helmut Tschemernjak 31:e50929bd3f32 359 break;
GregCr 0:e6ceb13d2d05 360 }
GregCr 0:e6ceb13d2d05 361 }
GregCr 0:e6ceb13d2d05 362
Helmut Tschemernjak 42:72deced1a4c4 363 void SX1276Generic::SetTimeout(TimeoutTimer_t timer, int timeout_ms)
Helmut Tschemernjak 38:d9189d958db8 364 {
Helmut Tschemernjak 42:72deced1a4c4 365 SX1276 *sx = this;
Helmut Tschemernjak 42:72deced1a4c4 366 switch(timer) {
Helmut Tschemernjak 42:72deced1a4c4 367 case RXTimeoutTimer:
Helmut Tschemernjak 42:72deced1a4c4 368 if (timeout_ms)
Helmut Tschemernjak 42:72deced1a4c4 369 rxTimeoutTimer.attach_us(callback(sx, &SX1276::OnTimeoutIrq), timeout_ms);
Helmut Tschemernjak 42:72deced1a4c4 370 else
Helmut Tschemernjak 42:72deced1a4c4 371 rxTimeoutTimer.detach();
Helmut Tschemernjak 42:72deced1a4c4 372 break;
Helmut Tschemernjak 42:72deced1a4c4 373 case TXTimeoutTimer:
Helmut Tschemernjak 42:72deced1a4c4 374 if (timeout_ms)
Helmut Tschemernjak 42:72deced1a4c4 375 txTimeoutTimer.attach_us(callback(sx, &SX1276::OnTimeoutIrq), timeout_ms);
Helmut Tschemernjak 42:72deced1a4c4 376 else
Helmut Tschemernjak 42:72deced1a4c4 377 txTimeoutTimer.detach();
Helmut Tschemernjak 42:72deced1a4c4 378 break;
Helmut Tschemernjak 42:72deced1a4c4 379 case RXTimeoutSyncWorldTimer:
Helmut Tschemernjak 42:72deced1a4c4 380 if (timeout_ms)
Helmut Tschemernjak 42:72deced1a4c4 381 rxTimeoutSyncWord.attach_us(callback(sx, &SX1276::OnTimeoutIrq), timeout_ms);
Helmut Tschemernjak 42:72deced1a4c4 382 else
Helmut Tschemernjak 42:72deced1a4c4 383 rxTimeoutSyncWord.detach();
Helmut Tschemernjak 42:72deced1a4c4 384 break;
Helmut Tschemernjak 42:72deced1a4c4 385 break;
Helmut Tschemernjak 42:72deced1a4c4 386 }
Helmut Tschemernjak 38:d9189d958db8 387 }
Helmut Tschemernjak 38:d9189d958db8 388
Helmut Tschemernjak 34:07e89f23c734 389 bool SX1276Generic::CheckRfFrequency( uint32_t frequency )
GregCr 0:e6ceb13d2d05 390 {
Helmut Tschemernjak 31:e50929bd3f32 391 // Implement check. Currently all frequencies are supported
GregCr 0:e6ceb13d2d05 392 return true;
GregCr 0:e6ceb13d2d05 393 }
GregCr 0:e6ceb13d2d05 394
Helmut Tschemernjak 34:07e89f23c734 395 void SX1276Generic::Reset( void )
GregCr 0:e6ceb13d2d05 396 {
Helmut Tschemernjak 34:07e89f23c734 397 _reset->output();
Helmut Tschemernjak 34:07e89f23c734 398 *_reset = 0;
Helmut Tschemernjak 31:e50929bd3f32 399 wait_ms( 1 );
Helmut Tschemernjak 34:07e89f23c734 400 *_reset = 1;
Helmut Tschemernjak 34:07e89f23c734 401 _reset->input(); // I don't know my input again, maybe to save power (Helmut T)
Helmut Tschemernjak 31:e50929bd3f32 402 wait_ms( 6 );
GregCr 0:e6ceb13d2d05 403 }
Helmut Tschemernjak 31:e50929bd3f32 404
Helmut Tschemernjak 34:07e89f23c734 405 void SX1276Generic::Write( uint8_t addr, uint8_t data )
GregCr 0:e6ceb13d2d05 406 {
GregCr 0:e6ceb13d2d05 407 Write( addr, &data, 1 );
GregCr 0:e6ceb13d2d05 408 }
GregCr 0:e6ceb13d2d05 409
Helmut Tschemernjak 34:07e89f23c734 410 uint8_t SX1276Generic::Read( uint8_t addr )
GregCr 0:e6ceb13d2d05 411 {
GregCr 0:e6ceb13d2d05 412 uint8_t data;
GregCr 0:e6ceb13d2d05 413 Read( addr, &data, 1 );
GregCr 0:e6ceb13d2d05 414 return data;
GregCr 0:e6ceb13d2d05 415 }
GregCr 0:e6ceb13d2d05 416
Helmut Tschemernjak 34:07e89f23c734 417 void SX1276Generic::Write( uint8_t addr, uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 418 {
GregCr 0:e6ceb13d2d05 419 uint8_t i;
GregCr 0:e6ceb13d2d05 420
Helmut Tschemernjak 34:07e89f23c734 421 *_nss = 0; // what about SPI hold/release timing on fast MCUs? Helmut
Helmut Tschemernjak 34:07e89f23c734 422 _spi->write( addr | 0x80 );
GregCr 0:e6ceb13d2d05 423 for( i = 0; i < size; i++ )
GregCr 0:e6ceb13d2d05 424 {
Helmut Tschemernjak 34:07e89f23c734 425 _spi->write( buffer[i] );
GregCr 0:e6ceb13d2d05 426 }
Helmut Tschemernjak 34:07e89f23c734 427 *_nss = 1;
GregCr 0:e6ceb13d2d05 428 }
GregCr 0:e6ceb13d2d05 429
Helmut Tschemernjak 34:07e89f23c734 430 void SX1276Generic::Read( uint8_t addr, uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 431 {
GregCr 0:e6ceb13d2d05 432 uint8_t i;
GregCr 0:e6ceb13d2d05 433
Helmut Tschemernjak 34:07e89f23c734 434 *_nss = 0; // what about SPI hold/release timing on fast MCUs? Helmut
Helmut Tschemernjak 34:07e89f23c734 435 _spi->write( addr & 0x7F );
GregCr 0:e6ceb13d2d05 436 for( i = 0; i < size; i++ )
GregCr 0:e6ceb13d2d05 437 {
Helmut Tschemernjak 34:07e89f23c734 438 buffer[i] = _spi->write( 0 );
GregCr 0:e6ceb13d2d05 439 }
Helmut Tschemernjak 34:07e89f23c734 440 *_nss = 1;
GregCr 0:e6ceb13d2d05 441 }
GregCr 0:e6ceb13d2d05 442
Helmut Tschemernjak 34:07e89f23c734 443 void SX1276Generic::WriteFifo( uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 444 {
GregCr 0:e6ceb13d2d05 445 Write( 0, buffer, size );
GregCr 0:e6ceb13d2d05 446 }
GregCr 0:e6ceb13d2d05 447
Helmut Tschemernjak 34:07e89f23c734 448 void SX1276Generic::ReadFifo( uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 449 {
GregCr 0:e6ceb13d2d05 450 Read( 0, buffer, size );
GregCr 0:e6ceb13d2d05 451 }