Fork with intent to refactor and add support for American 902-928(915) Frequency Bands

Committer:
Helmut Tschemernjak
Date:
Thu May 11 10:11:13 2017 +0200
Revision:
46:e78a1d0391ac
Parent:
45:9788b98821a5
Child:
51:aef3234bcb71
Updated LoRa_TODO.txt
Added template code to the Arduino HAL files
Change DigitalInOut to DigitalOut for the antenna switch
Added README.md file

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 46:e78a1d0391ac 46 _antSwitch = new DigitalOut(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 46:e78a1d0391ac 51 _antSwitch = new DigitalOut(antSwitch);
Helmut Tschemernjak 46:e78a1d0391ac 52 _antSwitchTX = new DigitalOut(antSwitchTX);
Helmut Tschemernjak 46:e78a1d0391ac 53 _antSwitchTXBoost = new DigitalOut(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 34:07e89f23c734 141 if (_tcxo)
Helmut Tschemernjak 34:07e89f23c734 142 *_tcxo = 1;
GregCr 0:e6ceb13d2d05 143 AntSwInit( );
GregCr 0:e6ceb13d2d05 144 SpiInit( );
GregCr 0:e6ceb13d2d05 145 }
GregCr 0:e6ceb13d2d05 146
GregCr 0:e6ceb13d2d05 147
Helmut Tschemernjak 34:07e89f23c734 148 void SX1276Generic::SpiInit( void )
GregCr 0:e6ceb13d2d05 149 {
Helmut Tschemernjak 34:07e89f23c734 150 *_nss = 1;
Helmut Tschemernjak 34:07e89f23c734 151 _spi->format( 8,0 );
GregCr 0:e6ceb13d2d05 152 uint32_t frequencyToSet = 8000000;
Helmut Tschemernjak 34:07e89f23c734 153 #ifdef TARGET_KL25Z //busclock frequency is halved -> double the spi frequency to compensate
Helmut Tschemernjak 34:07e89f23c734 154 _spi->frequency( frequencyToSet * 2 );
Helmut Tschemernjak 34:07e89f23c734 155 #else
Helmut Tschemernjak 34:07e89f23c734 156 _spi->frequency( frequencyToSet );
Helmut Tschemernjak 34:07e89f23c734 157 #endif
Helmut Tschemernjak 34:07e89f23c734 158 wait_ms(100);
GregCr 0:e6ceb13d2d05 159 }
GregCr 0:e6ceb13d2d05 160
Helmut Tschemernjak 34:07e89f23c734 161 void SX1276Generic::IoIrqInit( DioIrqHandler *irqHandlers )
GregCr 0:e6ceb13d2d05 162 {
Helmut Tschemernjak 34:07e89f23c734 163 if (_dio0)
Helmut Tschemernjak 39:706c32eda7e7 164 _dio0->rise(callback(this, static_cast< Trigger > ( irqHandlers[0] )));
Helmut Tschemernjak 34:07e89f23c734 165 if (_dio1)
Helmut Tschemernjak 39:706c32eda7e7 166 _dio1->rise(callback(this, static_cast< Trigger > ( irqHandlers[1] )));
Helmut Tschemernjak 34:07e89f23c734 167 if (_dio2)
Helmut Tschemernjak 39:706c32eda7e7 168 _dio2->rise(callback(this, static_cast< Trigger > ( irqHandlers[2] )));
Helmut Tschemernjak 34:07e89f23c734 169 if (_dio3)
Helmut Tschemernjak 39:706c32eda7e7 170 _dio3->rise(callback(this, static_cast< Trigger > ( irqHandlers[3] )));
Helmut Tschemernjak 34:07e89f23c734 171 if (_dio4)
Helmut Tschemernjak 39:706c32eda7e7 172 _dio4->rise(callback(this, static_cast< Trigger > ( irqHandlers[4] )));
GregCr 0:e6ceb13d2d05 173 }
GregCr 0:e6ceb13d2d05 174
Helmut Tschemernjak 34:07e89f23c734 175 void SX1276Generic::IoDeInit( void )
GregCr 0:e6ceb13d2d05 176 {
GregCr 0:e6ceb13d2d05 177 //nothing
GregCr 0:e6ceb13d2d05 178 }
GregCr 0:e6ceb13d2d05 179
Helmut Tschemernjak 34:07e89f23c734 180 void SX1276Generic::SetRfTxPower( int8_t power )
Helmut Tschemernjak 31:e50929bd3f32 181 {
Helmut Tschemernjak 31:e50929bd3f32 182 uint8_t paConfig = 0;
Helmut Tschemernjak 31:e50929bd3f32 183 uint8_t paDac = 0;
Helmut Tschemernjak 31:e50929bd3f32 184
Helmut Tschemernjak 31:e50929bd3f32 185 paConfig = Read( REG_PACONFIG );
Helmut Tschemernjak 31:e50929bd3f32 186 paDac = Read( REG_PADAC );
Helmut Tschemernjak 31:e50929bd3f32 187
Helmut Tschemernjak 31:e50929bd3f32 188 paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | GetPaSelect( this->settings.Channel );
Helmut Tschemernjak 31:e50929bd3f32 189 paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
Helmut Tschemernjak 31:e50929bd3f32 190
Helmut Tschemernjak 31:e50929bd3f32 191 if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
Helmut Tschemernjak 31:e50929bd3f32 192 {
Helmut Tschemernjak 31:e50929bd3f32 193 if( power > 17 )
Helmut Tschemernjak 31:e50929bd3f32 194 {
Helmut Tschemernjak 31:e50929bd3f32 195 paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_ON;
Helmut Tschemernjak 31:e50929bd3f32 196 }
Helmut Tschemernjak 31:e50929bd3f32 197 else
Helmut Tschemernjak 31:e50929bd3f32 198 {
Helmut Tschemernjak 31:e50929bd3f32 199 paDac = ( paDac & RF_PADAC_20DBM_MASK ) | RF_PADAC_20DBM_OFF;
Helmut Tschemernjak 31:e50929bd3f32 200 }
Helmut Tschemernjak 31:e50929bd3f32 201 if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
Helmut Tschemernjak 31:e50929bd3f32 202 {
Helmut Tschemernjak 31:e50929bd3f32 203 if( power < 5 )
Helmut Tschemernjak 31:e50929bd3f32 204 {
Helmut Tschemernjak 31:e50929bd3f32 205 power = 5;
Helmut Tschemernjak 31:e50929bd3f32 206 }
Helmut Tschemernjak 31:e50929bd3f32 207 if( power > 20 )
Helmut Tschemernjak 31:e50929bd3f32 208 {
Helmut Tschemernjak 31:e50929bd3f32 209 power = 20;
Helmut Tschemernjak 31:e50929bd3f32 210 }
Helmut Tschemernjak 31:e50929bd3f32 211 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
Helmut Tschemernjak 31:e50929bd3f32 212 }
Helmut Tschemernjak 31:e50929bd3f32 213 else
Helmut Tschemernjak 31:e50929bd3f32 214 {
Helmut Tschemernjak 31:e50929bd3f32 215 if( power < 2 )
Helmut Tschemernjak 31:e50929bd3f32 216 {
Helmut Tschemernjak 31:e50929bd3f32 217 power = 2;
Helmut Tschemernjak 31:e50929bd3f32 218 }
Helmut Tschemernjak 31:e50929bd3f32 219 if( power > 17 )
Helmut Tschemernjak 31:e50929bd3f32 220 {
Helmut Tschemernjak 31:e50929bd3f32 221 power = 17;
Helmut Tschemernjak 31:e50929bd3f32 222 }
Helmut Tschemernjak 31:e50929bd3f32 223 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
Helmut Tschemernjak 31:e50929bd3f32 224 }
Helmut Tschemernjak 31:e50929bd3f32 225 }
Helmut Tschemernjak 31:e50929bd3f32 226 else
Helmut Tschemernjak 31:e50929bd3f32 227 {
Helmut Tschemernjak 31:e50929bd3f32 228 if( power < -1 )
Helmut Tschemernjak 31:e50929bd3f32 229 {
Helmut Tschemernjak 31:e50929bd3f32 230 power = -1;
Helmut Tschemernjak 31:e50929bd3f32 231 }
Helmut Tschemernjak 31:e50929bd3f32 232 if( power > 14 )
Helmut Tschemernjak 31:e50929bd3f32 233 {
Helmut Tschemernjak 31:e50929bd3f32 234 power = 14;
Helmut Tschemernjak 31:e50929bd3f32 235 }
Helmut Tschemernjak 31:e50929bd3f32 236 paConfig = ( paConfig & RF_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power + 1 ) & 0x0F );
Helmut Tschemernjak 31:e50929bd3f32 237 }
Helmut Tschemernjak 31:e50929bd3f32 238 Write( REG_PACONFIG, paConfig );
Helmut Tschemernjak 31:e50929bd3f32 239 Write( REG_PADAC, paDac );
Helmut Tschemernjak 31:e50929bd3f32 240 }
Helmut Tschemernjak 31:e50929bd3f32 241
Helmut Tschemernjak 31:e50929bd3f32 242
Helmut Tschemernjak 34:07e89f23c734 243 uint8_t SX1276Generic::GetPaSelect( uint32_t channel )
GregCr 0:e6ceb13d2d05 244 {
GregCr 0:e6ceb13d2d05 245 if( channel > RF_MID_BAND_THRESH )
GregCr 0:e6ceb13d2d05 246 {
Helmut Tschemernjak 34:07e89f23c734 247 if( boardConnected == SX1276MB1LAS || boardConnected == RFM95_SX1276)
GregCr 1:f979673946c0 248 {
GregCr 1:f979673946c0 249 return RF_PACONFIG_PASELECT_PABOOST;
GregCr 1:f979673946c0 250 }
GregCr 1:f979673946c0 251 else
GregCr 1:f979673946c0 252 {
GregCr 1:f979673946c0 253 return RF_PACONFIG_PASELECT_RFO;
GregCr 1:f979673946c0 254 }
GregCr 0:e6ceb13d2d05 255 }
GregCr 0:e6ceb13d2d05 256 else
GregCr 0:e6ceb13d2d05 257 {
GregCr 0:e6ceb13d2d05 258 return RF_PACONFIG_PASELECT_RFO;
GregCr 0:e6ceb13d2d05 259 }
GregCr 0:e6ceb13d2d05 260 }
GregCr 0:e6ceb13d2d05 261
Helmut Tschemernjak 34:07e89f23c734 262 void SX1276Generic::SetAntSwLowPower( bool status )
GregCr 0:e6ceb13d2d05 263 {
GregCr 0:e6ceb13d2d05 264 if( isRadioActive != status )
GregCr 0:e6ceb13d2d05 265 {
GregCr 0:e6ceb13d2d05 266 isRadioActive = status;
GregCr 0:e6ceb13d2d05 267
GregCr 0:e6ceb13d2d05 268 if( status == false )
GregCr 0:e6ceb13d2d05 269 {
GregCr 0:e6ceb13d2d05 270 AntSwInit( );
GregCr 0:e6ceb13d2d05 271 }
GregCr 0:e6ceb13d2d05 272 else
GregCr 0:e6ceb13d2d05 273 {
GregCr 0:e6ceb13d2d05 274 AntSwDeInit( );
GregCr 0:e6ceb13d2d05 275 }
GregCr 0:e6ceb13d2d05 276 }
GregCr 0:e6ceb13d2d05 277 }
GregCr 0:e6ceb13d2d05 278
Helmut Tschemernjak 34:07e89f23c734 279 void SX1276Generic::AntSwInit( void )
GregCr 0:e6ceb13d2d05 280 {
Helmut Tschemernjak 34:07e89f23c734 281 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 282 *_antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 283 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 284 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 285 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 286 }
GregCr 0:e6ceb13d2d05 287 }
GregCr 0:e6ceb13d2d05 288
Helmut Tschemernjak 34:07e89f23c734 289 void SX1276Generic::AntSwDeInit( void )
GregCr 0:e6ceb13d2d05 290 {
Helmut Tschemernjak 34:07e89f23c734 291 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 292 *_antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 293 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 294 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 295 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 296 }
GregCr 0:e6ceb13d2d05 297 }
GregCr 0:e6ceb13d2d05 298
Helmut Tschemernjak 31:e50929bd3f32 299
Helmut Tschemernjak 34:07e89f23c734 300 void SX1276Generic::SetAntSw( uint8_t opMode )
GregCr 0:e6ceb13d2d05 301 {
Helmut Tschemernjak 31:e50929bd3f32 302 switch( opMode )
GregCr 0:e6ceb13d2d05 303 {
Helmut Tschemernjak 31:e50929bd3f32 304 case RFLR_OPMODE_TRANSMITTER:
Helmut Tschemernjak 34:07e89f23c734 305 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 306 *_antSwitch = 0;// Murata-RX
Helmut Tschemernjak 41:2dbc4afedf61 307 if (Read( REG_PACONFIG) & RF_PACONFIG_PASELECT_PABOOST)
Helmut Tschemernjak 41:2dbc4afedf61 308 *_antSwitchTXBoost = 1;
Helmut Tschemernjak 41:2dbc4afedf61 309 else
Helmut Tschemernjak 41:2dbc4afedf61 310 *_antSwitchTX = 1; // alternate: antSwitchTXBoost = 1
Helmut Tschemernjak 35:c278a826a8e2 311 } else {
Helmut Tschemernjak 34:07e89f23c734 312 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 313 *_antSwitch = 1;
Helmut Tschemernjak 34:07e89f23c734 314 }
Helmut Tschemernjak 31:e50929bd3f32 315 break;
Helmut Tschemernjak 31:e50929bd3f32 316 case RFLR_OPMODE_RECEIVER:
Helmut Tschemernjak 31:e50929bd3f32 317 case RFLR_OPMODE_RECEIVER_SINGLE:
Helmut Tschemernjak 31:e50929bd3f32 318 case RFLR_OPMODE_CAD:
Helmut Tschemernjak 34:07e89f23c734 319 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 320 *_antSwitch = 1; // Murata-RX
Helmut Tschemernjak 34:07e89f23c734 321 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 322 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 323 } else {
Helmut Tschemernjak 34:07e89f23c734 324 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 325 _antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 326 }
Helmut Tschemernjak 31:e50929bd3f32 327 break;
Helmut Tschemernjak 41:2dbc4afedf61 328 case RFLR_OPMODE_SLEEP:
Helmut Tschemernjak 41:2dbc4afedf61 329 case RFLR_OPMODE_STANDBY:
Helmut Tschemernjak 31:e50929bd3f32 330 default:
Helmut Tschemernjak 34:07e89f23c734 331 if (boardConnected == MURATA_SX1276) {
Helmut Tschemernjak 34:07e89f23c734 332 *_antSwitch = 0; //Murata-RX
Helmut Tschemernjak 34:07e89f23c734 333 *_antSwitchTX = 0;
Helmut Tschemernjak 34:07e89f23c734 334 *_antSwitchTXBoost = 0;
Helmut Tschemernjak 34:07e89f23c734 335 } else {
Helmut Tschemernjak 34:07e89f23c734 336 if (_antSwitch)
Helmut Tschemernjak 34:07e89f23c734 337 *_antSwitch = 0;
Helmut Tschemernjak 34:07e89f23c734 338 }
Helmut Tschemernjak 31:e50929bd3f32 339 break;
GregCr 0:e6ceb13d2d05 340 }
GregCr 0:e6ceb13d2d05 341 }
GregCr 0:e6ceb13d2d05 342
Helmut Tschemernjak 44:544add59b26d 343 void SX1276Generic::SetTimeout(TimeoutTimer_t timer, timeoutFuncPtr func, int timeout_ms)
Helmut Tschemernjak 38:d9189d958db8 344 {
Helmut Tschemernjak 42:72deced1a4c4 345 switch(timer) {
Helmut Tschemernjak 42:72deced1a4c4 346 case RXTimeoutTimer:
Helmut Tschemernjak 44:544add59b26d 347 if (func)
Helmut Tschemernjak 44:544add59b26d 348 rxTimeoutTimer.attach_us(callback(this, func), timeout_ms);
Helmut Tschemernjak 42:72deced1a4c4 349 else
Helmut Tschemernjak 42:72deced1a4c4 350 rxTimeoutTimer.detach();
Helmut Tschemernjak 42:72deced1a4c4 351 break;
Helmut Tschemernjak 42:72deced1a4c4 352 case TXTimeoutTimer:
Helmut Tschemernjak 44:544add59b26d 353 if (func)
Helmut Tschemernjak 44:544add59b26d 354 txTimeoutTimer.attach_us(callback(this, func), timeout_ms);
Helmut Tschemernjak 42:72deced1a4c4 355 else
Helmut Tschemernjak 42:72deced1a4c4 356 txTimeoutTimer.detach();
Helmut Tschemernjak 42:72deced1a4c4 357 break;
Helmut Tschemernjak 42:72deced1a4c4 358 case RXTimeoutSyncWorldTimer:
Helmut Tschemernjak 44:544add59b26d 359 if (func)
Helmut Tschemernjak 44:544add59b26d 360 rxTimeoutSyncWord.attach_us(callback(this, func), timeout_ms);
Helmut Tschemernjak 42:72deced1a4c4 361 else
Helmut Tschemernjak 42:72deced1a4c4 362 rxTimeoutSyncWord.detach();
Helmut Tschemernjak 42:72deced1a4c4 363 break;
Helmut Tschemernjak 42:72deced1a4c4 364 }
Helmut Tschemernjak 38:d9189d958db8 365 }
Helmut Tschemernjak 38:d9189d958db8 366
Helmut Tschemernjak 34:07e89f23c734 367 bool SX1276Generic::CheckRfFrequency( uint32_t frequency )
GregCr 0:e6ceb13d2d05 368 {
Helmut Tschemernjak 31:e50929bd3f32 369 // Implement check. Currently all frequencies are supported
GregCr 0:e6ceb13d2d05 370 return true;
GregCr 0:e6ceb13d2d05 371 }
GregCr 0:e6ceb13d2d05 372
Helmut Tschemernjak 34:07e89f23c734 373 void SX1276Generic::Reset( void )
GregCr 0:e6ceb13d2d05 374 {
Helmut Tschemernjak 34:07e89f23c734 375 _reset->output();
Helmut Tschemernjak 34:07e89f23c734 376 *_reset = 0;
Helmut Tschemernjak 31:e50929bd3f32 377 wait_ms( 1 );
Helmut Tschemernjak 34:07e89f23c734 378 *_reset = 1;
Helmut Tschemernjak 34:07e89f23c734 379 _reset->input(); // I don't know my input again, maybe to save power (Helmut T)
Helmut Tschemernjak 31:e50929bd3f32 380 wait_ms( 6 );
GregCr 0:e6ceb13d2d05 381 }
Helmut Tschemernjak 31:e50929bd3f32 382
Helmut Tschemernjak 34:07e89f23c734 383 void SX1276Generic::Write( uint8_t addr, uint8_t data )
GregCr 0:e6ceb13d2d05 384 {
GregCr 0:e6ceb13d2d05 385 Write( addr, &data, 1 );
GregCr 0:e6ceb13d2d05 386 }
GregCr 0:e6ceb13d2d05 387
Helmut Tschemernjak 34:07e89f23c734 388 uint8_t SX1276Generic::Read( uint8_t addr )
GregCr 0:e6ceb13d2d05 389 {
GregCr 0:e6ceb13d2d05 390 uint8_t data;
GregCr 0:e6ceb13d2d05 391 Read( addr, &data, 1 );
GregCr 0:e6ceb13d2d05 392 return data;
GregCr 0:e6ceb13d2d05 393 }
GregCr 0:e6ceb13d2d05 394
Helmut Tschemernjak 34:07e89f23c734 395 void SX1276Generic::Write( uint8_t addr, uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 396 {
GregCr 0:e6ceb13d2d05 397 uint8_t i;
GregCr 0:e6ceb13d2d05 398
Helmut Tschemernjak 34:07e89f23c734 399 *_nss = 0; // what about SPI hold/release timing on fast MCUs? Helmut
Helmut Tschemernjak 34:07e89f23c734 400 _spi->write( addr | 0x80 );
GregCr 0:e6ceb13d2d05 401 for( i = 0; i < size; i++ )
GregCr 0:e6ceb13d2d05 402 {
Helmut Tschemernjak 34:07e89f23c734 403 _spi->write( buffer[i] );
GregCr 0:e6ceb13d2d05 404 }
Helmut Tschemernjak 34:07e89f23c734 405 *_nss = 1;
GregCr 0:e6ceb13d2d05 406 }
GregCr 0:e6ceb13d2d05 407
Helmut Tschemernjak 34:07e89f23c734 408 void SX1276Generic::Read( uint8_t addr, uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 409 {
GregCr 0:e6ceb13d2d05 410 uint8_t i;
GregCr 0:e6ceb13d2d05 411
Helmut Tschemernjak 34:07e89f23c734 412 *_nss = 0; // what about SPI hold/release timing on fast MCUs? Helmut
Helmut Tschemernjak 34:07e89f23c734 413 _spi->write( addr & 0x7F );
GregCr 0:e6ceb13d2d05 414 for( i = 0; i < size; i++ )
GregCr 0:e6ceb13d2d05 415 {
Helmut Tschemernjak 34:07e89f23c734 416 buffer[i] = _spi->write( 0 );
GregCr 0:e6ceb13d2d05 417 }
Helmut Tschemernjak 34:07e89f23c734 418 *_nss = 1;
GregCr 0:e6ceb13d2d05 419 }
GregCr 0:e6ceb13d2d05 420
Helmut Tschemernjak 34:07e89f23c734 421 void SX1276Generic::WriteFifo( uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 422 {
GregCr 0:e6ceb13d2d05 423 Write( 0, buffer, size );
GregCr 0:e6ceb13d2d05 424 }
GregCr 0:e6ceb13d2d05 425
Helmut Tschemernjak 34:07e89f23c734 426 void SX1276Generic::ReadFifo( uint8_t *buffer, uint8_t size )
GregCr 0:e6ceb13d2d05 427 {
GregCr 0:e6ceb13d2d05 428 Read( 0, buffer, size );
GregCr 0:e6ceb13d2d05 429 }