Fork of this for my stuff.

Committer:
Helmut Tschemernjak
Date:
Thu May 25 21:56:39 2017 +0200
Revision:
58:113d2ef978d2
Parent:
53:6d3adad59633
Child:
60:75426c142f6e
Removed duplicate timer definitions (left over from previous cleanup)
zapping the receive buffer makes no sense, keeping the content is better
and allows coping the data while we are receiving the next packet.
The State = RF_IDLE is already done in the sx1276 constructor,
no need to do it in the HAL layer.

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