test

Dependents:   Telemetria_RX_SD_GPS_copy Telemetria_RX_SD_GPS Telemetria_TX Telemetria_TX ... more

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