Modtronix inAir9 driver based on SX1276 standard driver

Dependents:   SX1276PingPong_inAir Sensors LoRaTerminal

Fork of SX1276Lib by Semtech

Committer:
rba90
Date:
Sat May 28 23:07:55 2016 +0000
Revision:
26:bc0732f29f43
Modtronix inAir9 LoRa transceiver driver based on SX1276

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rba90 26:bc0732f29f43 1 #include "sx1276-inAir.h"
rba90 26:bc0732f29f43 2
rba90 26:bc0732f29f43 3 const RadioRegisters_t SX1276inAir::RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE;
rba90 26:bc0732f29f43 4
rba90 26:bc0732f29f43 5 SX1276inAir::SX1276inAir( RadioEvents_t *events,
rba90 26:bc0732f29f43 6 PinName mosi, PinName miso, PinName sclk, PinName nss, PinName reset,
rba90 26:bc0732f29f43 7 PinName dio0, PinName dio1, PinName dio2, PinName dio3,
rba90 26:bc0732f29f43 8 PinName antSwitch )
rba90 26:bc0732f29f43 9 : SX1276( events, mosi, miso, sclk, nss, reset, dio0, dio1, dio2, dio3, NC, NC),
rba90 26:bc0732f29f43 10 antSwitch( NC ),
rba90 26:bc0732f29f43 11 fake( NC )
rba90 26:bc0732f29f43 12 {
rba90 26:bc0732f29f43 13 this->RadioEvents = events;
rba90 26:bc0732f29f43 14
rba90 26:bc0732f29f43 15 Reset();
rba90 26:bc0732f29f43 16
rba90 26:bc0732f29f43 17 RxChainCalibration( );
rba90 26:bc0732f29f43 18
rba90 26:bc0732f29f43 19 IoInit( );
rba90 26:bc0732f29f43 20
rba90 26:bc0732f29f43 21 SetOpMode( RF_OPMODE_SLEEP );
rba90 26:bc0732f29f43 22
rba90 26:bc0732f29f43 23 IoIrqInit( dioIrq );
rba90 26:bc0732f29f43 24
rba90 26:bc0732f29f43 25 RadioRegistersInit( );
rba90 26:bc0732f29f43 26
rba90 26:bc0732f29f43 27 SetModem( MODEM_FSK );
rba90 26:bc0732f29f43 28
rba90 26:bc0732f29f43 29 this->settings.State = RF_IDLE ;
rba90 26:bc0732f29f43 30 }
rba90 26:bc0732f29f43 31
rba90 26:bc0732f29f43 32 SX1276inAir::SX1276inAir( RadioEvents_t *events )
rba90 26:bc0732f29f43 33 : SX1276( events, D11/*MOSI*/, D12/*MISO*/, D13/*SCLK*/, D7/*CS*/, A5/*RST*/, D2/*DIO0*/, D8, D4, A4, NC, NC ), // For NUCLEO L152RE dio4 is on port A3
rba90 26:bc0732f29f43 34 antSwitch( A4 ),
rba90 26:bc0732f29f43 35 fake( D8 )
rba90 26:bc0732f29f43 36 {
rba90 26:bc0732f29f43 37 this->RadioEvents = events;
rba90 26:bc0732f29f43 38
rba90 26:bc0732f29f43 39 Reset();
rba90 26:bc0732f29f43 40
rba90 26:bc0732f29f43 41 boardConnected = BOARD_UNKNOWN;
rba90 26:bc0732f29f43 42
rba90 26:bc0732f29f43 43 DetectBoardType();
rba90 26:bc0732f29f43 44
rba90 26:bc0732f29f43 45 RxChainCalibration( );
rba90 26:bc0732f29f43 46
rba90 26:bc0732f29f43 47 IoInit( );
rba90 26:bc0732f29f43 48
rba90 26:bc0732f29f43 49 SetOpMode( RF_OPMODE_SLEEP );
rba90 26:bc0732f29f43 50
rba90 26:bc0732f29f43 51 IoIrqInit( dioIrq );
rba90 26:bc0732f29f43 52
rba90 26:bc0732f29f43 53 RadioRegistersInit( );
rba90 26:bc0732f29f43 54
rba90 26:bc0732f29f43 55 SetModem( MODEM_FSK );
rba90 26:bc0732f29f43 56
rba90 26:bc0732f29f43 57 this->settings.State = RF_IDLE ;
rba90 26:bc0732f29f43 58 }
rba90 26:bc0732f29f43 59
rba90 26:bc0732f29f43 60 //-------------------------------------------------------------------------
rba90 26:bc0732f29f43 61 // Board relative functions
rba90 26:bc0732f29f43 62 //-------------------------------------------------------------------------
rba90 26:bc0732f29f43 63 uint8_t SX1276inAir::DetectBoardType( void )
rba90 26:bc0732f29f43 64 {
rba90 26:bc0732f29f43 65 //Detect board type NOT possible with inAir4, inAir9 and inAir9B boards. User has to call
rba90 26:bc0732f29f43 66 //the SetBoardType() function to set the board type!
rba90 26:bc0732f29f43 67 return ( boardConnected );
rba90 26:bc0732f29f43 68 }
rba90 26:bc0732f29f43 69
rba90 26:bc0732f29f43 70 void SX1276inAir::IoInit( void )
rba90 26:bc0732f29f43 71 {
rba90 26:bc0732f29f43 72 AntSwInit( );
rba90 26:bc0732f29f43 73 SpiInit( );
rba90 26:bc0732f29f43 74 }
rba90 26:bc0732f29f43 75
rba90 26:bc0732f29f43 76 void SX1276inAir::RadioRegistersInit( ){
rba90 26:bc0732f29f43 77 uint8_t i = 0;
rba90 26:bc0732f29f43 78 for( i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ )
rba90 26:bc0732f29f43 79 {
rba90 26:bc0732f29f43 80 SetModem( RadioRegsInit[i].Modem );
rba90 26:bc0732f29f43 81 Write( RadioRegsInit[i].Addr, RadioRegsInit[i].Value );
rba90 26:bc0732f29f43 82 }
rba90 26:bc0732f29f43 83 }
rba90 26:bc0732f29f43 84
rba90 26:bc0732f29f43 85 void SX1276inAir::SpiInit( void )
rba90 26:bc0732f29f43 86 {
rba90 26:bc0732f29f43 87 nss = 1;
rba90 26:bc0732f29f43 88 spi.format( 8,0 );
rba90 26:bc0732f29f43 89 uint32_t frequencyToSet = 8000000;
rba90 26:bc0732f29f43 90 #if( defined (TARGET_NUCLEO_F446RE) || defined ( TARGET_NUCLEO_L152RE ) || defined (TARGET_NUCLEO_F401RE) || defined ( TARGET_LPC11U6X ) || defined (TARGET_K64F) || defined ( TARGET_NZ32ST1L ) || defined(TARGET_NZ32SC151) )
rba90 26:bc0732f29f43 91 spi.frequency( frequencyToSet );
rba90 26:bc0732f29f43 92 #elif( defined ( TARGET_KL25Z ) ) //busclock frequency is halved -> double the spi frequency to compensate
rba90 26:bc0732f29f43 93 spi.frequency( frequencyToSet * 2 );
rba90 26:bc0732f29f43 94 #else
rba90 26:bc0732f29f43 95 #warning "Check the board's SPI frequency"
rba90 26:bc0732f29f43 96 #endif
rba90 26:bc0732f29f43 97 wait(0.1);
rba90 26:bc0732f29f43 98 }
rba90 26:bc0732f29f43 99
rba90 26:bc0732f29f43 100 void SX1276inAir::IoIrqInit( DioIrqHandler *irqHandlers )
rba90 26:bc0732f29f43 101 {
rba90 26:bc0732f29f43 102 //TARGET_KL25Z board does not have pulldown resistors, seems like TARGET_K64F does have them
rba90 26:bc0732f29f43 103 #if( defined (TARGET_NUCLEO_F446RE) || defined ( TARGET_NUCLEO_L152RE ) || defined (TARGET_NUCLEO_F401RE) || defined ( TARGET_LPC11U6X ) || defined (TARGET_K64F) || defined ( TARGET_NZ32ST1L ) || defined(TARGET_NZ32SC151))
rba90 26:bc0732f29f43 104 dio0.mode(PullDown);
rba90 26:bc0732f29f43 105 dio1.mode(PullDown);
rba90 26:bc0732f29f43 106 dio2.mode(PullDown);
rba90 26:bc0732f29f43 107 dio3.mode(PullDown);
rba90 26:bc0732f29f43 108 //dio4.mode(PullDown);
rba90 26:bc0732f29f43 109 #endif
rba90 26:bc0732f29f43 110 dio0.rise( this, static_cast< TriggerInAir > ( irqHandlers[0] ) );
rba90 26:bc0732f29f43 111 dio1.rise( this, static_cast< TriggerInAir > ( irqHandlers[1] ) );
rba90 26:bc0732f29f43 112 dio2.rise( this, static_cast< TriggerInAir > ( irqHandlers[2] ) );
rba90 26:bc0732f29f43 113 //For SHD3I with BOARD_INAIR4 in imod3, on FRDM-KL25Z board. It uses A4 on FRDM-KL25Z board, which does not have interrupt
rba90 26:bc0732f29f43 114 #if( defined ( TARGET_KL25Z ) && defined(SHIELD_SHD3I_INAIR9) )
rba90 26:bc0732f29f43 115 //Nothing to be done
rba90 26:bc0732f29f43 116 #else
rba90 26:bc0732f29f43 117 dio3.rise( this, static_cast< TriggerInAir > ( irqHandlers[3] ) );
rba90 26:bc0732f29f43 118 #endif
rba90 26:bc0732f29f43 119 //dio4.rise( this, static_cast< TriggerInAir > ( irqHandlers[4] ) );
rba90 26:bc0732f29f43 120 }
rba90 26:bc0732f29f43 121
rba90 26:bc0732f29f43 122 void SX1276inAir::IoDeInit( void )
rba90 26:bc0732f29f43 123 {
rba90 26:bc0732f29f43 124 //nothing
rba90 26:bc0732f29f43 125 }
rba90 26:bc0732f29f43 126
rba90 26:bc0732f29f43 127 uint8_t SX1276inAir::GetPaSelect( uint32_t channel )
rba90 26:bc0732f29f43 128 {
rba90 26:bc0732f29f43 129 if(boardConnected == BOARD_INAIR9B) {
rba90 26:bc0732f29f43 130 return RF_PACONFIG_PASELECT_PABOOST;
rba90 26:bc0732f29f43 131 }
rba90 26:bc0732f29f43 132 else {
rba90 26:bc0732f29f43 133 return RF_PACONFIG_PASELECT_RFO;
rba90 26:bc0732f29f43 134 }
rba90 26:bc0732f29f43 135 }
rba90 26:bc0732f29f43 136
rba90 26:bc0732f29f43 137 void SX1276inAir::SetAntSwLowPower( bool status )
rba90 26:bc0732f29f43 138 {
rba90 26:bc0732f29f43 139 if( isRadioActive != status )
rba90 26:bc0732f29f43 140 {
rba90 26:bc0732f29f43 141 isRadioActive = status;
rba90 26:bc0732f29f43 142
rba90 26:bc0732f29f43 143 if( status == false )
rba90 26:bc0732f29f43 144 {
rba90 26:bc0732f29f43 145 AntSwInit( );
rba90 26:bc0732f29f43 146 }
rba90 26:bc0732f29f43 147 else
rba90 26:bc0732f29f43 148 {
rba90 26:bc0732f29f43 149 AntSwDeInit( );
rba90 26:bc0732f29f43 150 }
rba90 26:bc0732f29f43 151 }
rba90 26:bc0732f29f43 152 }
rba90 26:bc0732f29f43 153
rba90 26:bc0732f29f43 154 void SX1276inAir::AntSwInit( void )
rba90 26:bc0732f29f43 155 {
rba90 26:bc0732f29f43 156 //antSwitch = 0;
rba90 26:bc0732f29f43 157 }
rba90 26:bc0732f29f43 158
rba90 26:bc0732f29f43 159 void SX1276inAir::AntSwDeInit( void )
rba90 26:bc0732f29f43 160 {
rba90 26:bc0732f29f43 161 //antSwitch = 0;
rba90 26:bc0732f29f43 162 }
rba90 26:bc0732f29f43 163
rba90 26:bc0732f29f43 164 void SX1276inAir::SetAntSw( uint8_t rxTx )
rba90 26:bc0732f29f43 165 {
rba90 26:bc0732f29f43 166 if( this->rxTx == rxTx )
rba90 26:bc0732f29f43 167 {
rba90 26:bc0732f29f43 168 //no need to go further
rba90 26:bc0732f29f43 169 return;
rba90 26:bc0732f29f43 170 }
rba90 26:bc0732f29f43 171
rba90 26:bc0732f29f43 172 this->rxTx = rxTx;
rba90 26:bc0732f29f43 173
rba90 26:bc0732f29f43 174 // if( rxTx != 0 )
rba90 26:bc0732f29f43 175 // {
rba90 26:bc0732f29f43 176 // antSwitch = 1;
rba90 26:bc0732f29f43 177 // }
rba90 26:bc0732f29f43 178 // else
rba90 26:bc0732f29f43 179 // {
rba90 26:bc0732f29f43 180 // antSwitch = 0;
rba90 26:bc0732f29f43 181 // }
rba90 26:bc0732f29f43 182 }
rba90 26:bc0732f29f43 183
rba90 26:bc0732f29f43 184 bool SX1276inAir::CheckRfFrequency( uint32_t frequency )
rba90 26:bc0732f29f43 185 {
rba90 26:bc0732f29f43 186 //TODO: Implement check, currently all frequencies are supported
rba90 26:bc0732f29f43 187 return true;
rba90 26:bc0732f29f43 188 }
rba90 26:bc0732f29f43 189
rba90 26:bc0732f29f43 190
rba90 26:bc0732f29f43 191 void SX1276inAir::Reset( void )
rba90 26:bc0732f29f43 192 {
rba90 26:bc0732f29f43 193 reset.output();
rba90 26:bc0732f29f43 194 reset = 0;
rba90 26:bc0732f29f43 195 wait_ms( 1 );
rba90 26:bc0732f29f43 196 reset.input();
rba90 26:bc0732f29f43 197 wait_ms( 6 );
rba90 26:bc0732f29f43 198 }
rba90 26:bc0732f29f43 199
rba90 26:bc0732f29f43 200 void SX1276inAir::Write( uint8_t addr, uint8_t data )
rba90 26:bc0732f29f43 201 {
rba90 26:bc0732f29f43 202 Write( addr, &data, 1 );
rba90 26:bc0732f29f43 203 }
rba90 26:bc0732f29f43 204
rba90 26:bc0732f29f43 205 uint8_t SX1276inAir::Read( uint8_t addr )
rba90 26:bc0732f29f43 206 {
rba90 26:bc0732f29f43 207 uint8_t data;
rba90 26:bc0732f29f43 208 Read( addr, &data, 1 );
rba90 26:bc0732f29f43 209 return data;
rba90 26:bc0732f29f43 210 }
rba90 26:bc0732f29f43 211
rba90 26:bc0732f29f43 212 void SX1276inAir::Write( uint8_t addr, uint8_t *buffer, uint8_t size )
rba90 26:bc0732f29f43 213 {
rba90 26:bc0732f29f43 214 uint8_t i;
rba90 26:bc0732f29f43 215
rba90 26:bc0732f29f43 216 nss = 0;
rba90 26:bc0732f29f43 217 spi.write( addr | 0x80 );
rba90 26:bc0732f29f43 218 for( i = 0; i < size; i++ )
rba90 26:bc0732f29f43 219 {
rba90 26:bc0732f29f43 220 spi.write( buffer[i] );
rba90 26:bc0732f29f43 221 }
rba90 26:bc0732f29f43 222 nss = 1;
rba90 26:bc0732f29f43 223 }
rba90 26:bc0732f29f43 224
rba90 26:bc0732f29f43 225 void SX1276inAir::Read( uint8_t addr, uint8_t *buffer, uint8_t size )
rba90 26:bc0732f29f43 226 {
rba90 26:bc0732f29f43 227 uint8_t i;
rba90 26:bc0732f29f43 228
rba90 26:bc0732f29f43 229 nss = 0;
rba90 26:bc0732f29f43 230 spi.write( addr & 0x7F );
rba90 26:bc0732f29f43 231 for( i = 0; i < size; i++ )
rba90 26:bc0732f29f43 232 {
rba90 26:bc0732f29f43 233 buffer[i] = spi.write( 0 );
rba90 26:bc0732f29f43 234 }
rba90 26:bc0732f29f43 235 nss = 1;
rba90 26:bc0732f29f43 236 }
rba90 26:bc0732f29f43 237
rba90 26:bc0732f29f43 238 void SX1276inAir::WriteFifo( uint8_t *buffer, uint8_t size )
rba90 26:bc0732f29f43 239 {
rba90 26:bc0732f29f43 240 Write( 0, buffer, size );
rba90 26:bc0732f29f43 241 }
rba90 26:bc0732f29f43 242
rba90 26:bc0732f29f43 243 void SX1276inAir::ReadFifo( uint8_t *buffer, uint8_t size )
rba90 26:bc0732f29f43 244 {
rba90 26:bc0732f29f43 245 Read( 0, buffer, size );
rba90 26:bc0732f29f43 246 }