SX1261 and sx1262 common library
Dependents: SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more
Fork of SX126xLib by
sx126x.cpp@3:7e3595a9ebe0, 2016-10-12 (annotated)
- Committer:
- GregCr
- Date:
- Wed Oct 12 08:49:58 2016 +0000
- Revision:
- 3:7e3595a9ebe0
- Parent:
- 2:4ff11ea92fbe
- Child:
- 4:c6ef863d0b07
updated version with patch RAM
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
GregCr | 0:deaafdfde3bb | 1 | /* |
GregCr | 0:deaafdfde3bb | 2 | / _____) _ | | |
GregCr | 0:deaafdfde3bb | 3 | ( (____ _____ ____ _| |_ _____ ____| |__ |
GregCr | 0:deaafdfde3bb | 4 | \____ \| ___ | (_ _) ___ |/ ___) _ \ |
GregCr | 0:deaafdfde3bb | 5 | _____) ) ____| | | || |_| ____( (___| | | | |
GregCr | 0:deaafdfde3bb | 6 | (______/|_____)_|_|_| \__)_____)\____)_| |_| |
GregCr | 0:deaafdfde3bb | 7 | (C)2016 Semtech |
GregCr | 0:deaafdfde3bb | 8 | |
GregCr | 0:deaafdfde3bb | 9 | Description: Handling of the node configuration protocol |
GregCr | 0:deaafdfde3bb | 10 | |
GregCr | 0:deaafdfde3bb | 11 | License: Revised BSD License, see LICENSE.TXT file include in the project |
GregCr | 0:deaafdfde3bb | 12 | |
GregCr | 0:deaafdfde3bb | 13 | Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy |
GregCr | 0:deaafdfde3bb | 14 | */ |
GregCr | 0:deaafdfde3bb | 15 | #include "mbed.h" |
GregCr | 1:35d34672a089 | 16 | #include "sx126x.h" |
GregCr | 1:35d34672a089 | 17 | #include "sx126x-hal.h" |
GregCr | 0:deaafdfde3bb | 18 | |
GregCr | 3:7e3595a9ebe0 | 19 | #include "pram_c005.h" |
GregCr | 3:7e3595a9ebe0 | 20 | |
GregCr | 0:deaafdfde3bb | 21 | /*! |
GregCr | 0:deaafdfde3bb | 22 | * Radio registers definition |
GregCr | 0:deaafdfde3bb | 23 | * |
GregCr | 0:deaafdfde3bb | 24 | */ |
GregCr | 0:deaafdfde3bb | 25 | typedef struct |
GregCr | 0:deaafdfde3bb | 26 | { |
GregCr | 0:deaafdfde3bb | 27 | uint16_t Addr; //!< The address of the register |
GregCr | 0:deaafdfde3bb | 28 | uint8_t Value; //!< The value of the register |
GregCr | 0:deaafdfde3bb | 29 | }RadioRegisters_t; |
GregCr | 0:deaafdfde3bb | 30 | |
GregCr | 0:deaafdfde3bb | 31 | // [TODO] Is this also applicable for the V2 version of the chip |
GregCr | 0:deaafdfde3bb | 32 | /*! |
GregCr | 0:deaafdfde3bb | 33 | * \brief Radio hardware registers initialization definition |
GregCr | 0:deaafdfde3bb | 34 | */ |
GregCr | 0:deaafdfde3bb | 35 | // { Address, RegValue } |
GregCr | 3:7e3595a9ebe0 | 36 | |
GregCr | 0:deaafdfde3bb | 37 | #define RADIO_INIT_REGISTERS_VALUE \ |
GregCr | 0:deaafdfde3bb | 38 | { \ |
GregCr | 0:deaafdfde3bb | 39 | { 0x0722, 0x53 }, \ |
GregCr | 3:7e3595a9ebe0 | 40 | { 0x0889, 0x01 }, \ |
GregCr | 0:deaafdfde3bb | 41 | } |
GregCr | 0:deaafdfde3bb | 42 | |
GregCr | 0:deaafdfde3bb | 43 | /*! |
GregCr | 0:deaafdfde3bb | 44 | * \brief Radio hardware registers initialization |
GregCr | 0:deaafdfde3bb | 45 | */ |
GregCr | 0:deaafdfde3bb | 46 | const RadioRegisters_t RadioRegsInit[] = RADIO_INIT_REGISTERS_VALUE; |
GregCr | 0:deaafdfde3bb | 47 | |
GregCr | 2:4ff11ea92fbe | 48 | void SX126x::Init( void ) |
GregCr | 0:deaafdfde3bb | 49 | { |
GregCr | 0:deaafdfde3bb | 50 | Reset( ); |
GregCr | 0:deaafdfde3bb | 51 | IoIrqInit( dioIrq ); |
GregCr | 0:deaafdfde3bb | 52 | Wakeup( ); |
GregCr | 3:7e3595a9ebe0 | 53 | /****************************************************/ |
GregCr | 3:7e3595a9ebe0 | 54 | SetStandby( STDBY_RC ); |
GregCr | 3:7e3595a9ebe0 | 55 | WriteRegister( 0x610, 0x10 ); |
GregCr | 3:7e3595a9ebe0 | 56 | for( uint16_t i = 0; i < PRAM_COUNT; i++ ) |
GregCr | 3:7e3595a9ebe0 | 57 | { |
GregCr | 3:7e3595a9ebe0 | 58 | uint32_t val = pram[i]; |
GregCr | 3:7e3595a9ebe0 | 59 | WriteRegister( 0x8000 + 4 * i, 0 ); |
GregCr | 3:7e3595a9ebe0 | 60 | WriteRegister( 0x8001 + 4 * i, ( val >> 16 ) & 0xff ); |
GregCr | 3:7e3595a9ebe0 | 61 | WriteRegister( 0x8002 + 4 * i, ( val >> 8 ) & 0xff ); |
GregCr | 3:7e3595a9ebe0 | 62 | WriteRegister( 0x8003 + 4 * i, val & 0xff ); |
GregCr | 3:7e3595a9ebe0 | 63 | } |
GregCr | 3:7e3595a9ebe0 | 64 | WriteRegister( 0x610, 0x00 ); |
GregCr | 3:7e3595a9ebe0 | 65 | WriteCommand( RADIO_SET_PRAMSWAPCMD, ( uint8_t[] ) { 2 } , 1 ); // RADIO_SET_PRAMSWAPCMD = 0x8D, |
GregCr | 3:7e3595a9ebe0 | 66 | /****************************************************/ |
GregCr | 0:deaafdfde3bb | 67 | SetRegistersDefault( ); |
GregCr | 0:deaafdfde3bb | 68 | } |
GregCr | 0:deaafdfde3bb | 69 | |
GregCr | 2:4ff11ea92fbe | 70 | void SX126x::SetRegistersDefault( void ) |
GregCr | 0:deaafdfde3bb | 71 | { |
GregCr | 0:deaafdfde3bb | 72 | for( uint8_t i = 0; i < sizeof( RadioRegsInit ) / sizeof( RadioRegisters_t ); i++ ) |
GregCr | 0:deaafdfde3bb | 73 | { |
GregCr | 0:deaafdfde3bb | 74 | WriteRegister( RadioRegsInit[i].Addr, RadioRegsInit[i].Value ); |
GregCr | 0:deaafdfde3bb | 75 | } |
GregCr | 0:deaafdfde3bb | 76 | } |
GregCr | 0:deaafdfde3bb | 77 | |
GregCr | 2:4ff11ea92fbe | 78 | uint16_t SX126x::GetFirmwareVersion( void ) |
GregCr | 0:deaafdfde3bb | 79 | { |
GregCr | 0:deaafdfde3bb | 80 | return( ( ( ReadRegister( 0xA8 ) ) << 8 ) | ( ReadRegister( 0xA9 ) ) ); |
GregCr | 0:deaafdfde3bb | 81 | } |
GregCr | 0:deaafdfde3bb | 82 | |
GregCr | 2:4ff11ea92fbe | 83 | RadioStatus_t SX126x::GetStatus( void ) |
GregCr | 0:deaafdfde3bb | 84 | { |
GregCr | 0:deaafdfde3bb | 85 | uint8_t stat = 0; |
GregCr | 0:deaafdfde3bb | 86 | RadioStatus_t status; |
GregCr | 0:deaafdfde3bb | 87 | |
GregCr | 0:deaafdfde3bb | 88 | ReadCommand( RADIO_GET_STATUS, ( uint8_t * )&stat, 1 ); |
GregCr | 0:deaafdfde3bb | 89 | status.Value = stat; |
GregCr | 0:deaafdfde3bb | 90 | |
GregCr | 0:deaafdfde3bb | 91 | |
GregCr | 0:deaafdfde3bb | 92 | return( status ); |
GregCr | 0:deaafdfde3bb | 93 | } |
GregCr | 0:deaafdfde3bb | 94 | |
GregCr | 2:4ff11ea92fbe | 95 | void SX126x::SetSleep( SleepParams_t sleepConfig ) |
GregCr | 0:deaafdfde3bb | 96 | { |
GregCr | 0:deaafdfde3bb | 97 | |
GregCr | 0:deaafdfde3bb | 98 | WriteCommand( RADIO_SET_SLEEP, &sleepConfig.Value, 1 ); |
GregCr | 0:deaafdfde3bb | 99 | OperatingMode = MODE_SLEEP; |
GregCr | 0:deaafdfde3bb | 100 | } |
GregCr | 0:deaafdfde3bb | 101 | |
GregCr | 2:4ff11ea92fbe | 102 | void SX126x::SetStandby( RadioStandbyModes_t standbyConfig ) |
GregCr | 0:deaafdfde3bb | 103 | { |
GregCr | 0:deaafdfde3bb | 104 | WriteCommand( RADIO_SET_STANDBY, ( uint8_t* )&standbyConfig, 1 ); |
GregCr | 0:deaafdfde3bb | 105 | if( standbyConfig == STDBY_RC ) |
GregCr | 0:deaafdfde3bb | 106 | { |
GregCr | 0:deaafdfde3bb | 107 | OperatingMode = MODE_STDBY_RC; |
GregCr | 0:deaafdfde3bb | 108 | } |
GregCr | 0:deaafdfde3bb | 109 | else |
GregCr | 0:deaafdfde3bb | 110 | { |
GregCr | 0:deaafdfde3bb | 111 | OperatingMode = MODE_STDBY_XOSC; |
GregCr | 0:deaafdfde3bb | 112 | } |
GregCr | 0:deaafdfde3bb | 113 | } |
GregCr | 0:deaafdfde3bb | 114 | |
GregCr | 2:4ff11ea92fbe | 115 | void SX126x::SetFs( void ) |
GregCr | 0:deaafdfde3bb | 116 | { |
GregCr | 0:deaafdfde3bb | 117 | WriteCommand( RADIO_SET_FS, 0, 0 ); |
GregCr | 0:deaafdfde3bb | 118 | OperatingMode = MODE_FS; |
GregCr | 0:deaafdfde3bb | 119 | } |
GregCr | 0:deaafdfde3bb | 120 | |
GregCr | 2:4ff11ea92fbe | 121 | void SX126x::SetTx( uint32_t timeout ) |
GregCr | 0:deaafdfde3bb | 122 | { |
GregCr | 0:deaafdfde3bb | 123 | uint8_t buf[3]; |
GregCr | 0:deaafdfde3bb | 124 | buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 125 | buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 126 | buf[2] = ( uint8_t )( timeout & 0xFF ); |
GregCr | 0:deaafdfde3bb | 127 | WriteCommand( RADIO_SET_TX, buf, 3 ); |
GregCr | 0:deaafdfde3bb | 128 | OperatingMode = MODE_TX; |
GregCr | 0:deaafdfde3bb | 129 | } |
GregCr | 0:deaafdfde3bb | 130 | |
GregCr | 2:4ff11ea92fbe | 131 | void SX126x::SetRx( uint32_t timeout ) |
GregCr | 0:deaafdfde3bb | 132 | { |
GregCr | 0:deaafdfde3bb | 133 | uint8_t buf[3]; |
GregCr | 0:deaafdfde3bb | 134 | buf[0] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 135 | buf[1] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 136 | buf[2] = ( uint8_t )( timeout & 0xFF ); |
GregCr | 0:deaafdfde3bb | 137 | WriteCommand( RADIO_SET_RX, buf, 3 ); |
GregCr | 0:deaafdfde3bb | 138 | OperatingMode = MODE_RX; |
GregCr | 0:deaafdfde3bb | 139 | } |
GregCr | 0:deaafdfde3bb | 140 | |
GregCr | 2:4ff11ea92fbe | 141 | void SX126x::SetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime ) |
GregCr | 0:deaafdfde3bb | 142 | { |
GregCr | 0:deaafdfde3bb | 143 | uint8_t buf[6]; |
GregCr | 0:deaafdfde3bb | 144 | |
GregCr | 0:deaafdfde3bb | 145 | buf[0] = ( uint8_t )( ( rxTime >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 146 | buf[1] = ( uint8_t )( ( rxTime >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 147 | buf[2] = ( uint8_t )( rxTime & 0xFF ); |
GregCr | 0:deaafdfde3bb | 148 | buf[0] = ( uint8_t )( ( sleepTime >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 149 | buf[1] = ( uint8_t )( ( sleepTime >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 150 | buf[2] = ( uint8_t )( sleepTime & 0xFF ); |
GregCr | 0:deaafdfde3bb | 151 | WriteCommand( RADIO_SET_RXDUTYCYCLE, buf, 6 ); |
GregCr | 0:deaafdfde3bb | 152 | OperatingMode = MODE_RX; |
GregCr | 0:deaafdfde3bb | 153 | } |
GregCr | 0:deaafdfde3bb | 154 | |
GregCr | 2:4ff11ea92fbe | 155 | void SX126x::SetCad( void ) |
GregCr | 0:deaafdfde3bb | 156 | { |
GregCr | 0:deaafdfde3bb | 157 | WriteCommand( RADIO_SET_CAD, 0, 0 ); |
GregCr | 0:deaafdfde3bb | 158 | OperatingMode = MODE_CAD; |
GregCr | 0:deaafdfde3bb | 159 | } |
GregCr | 0:deaafdfde3bb | 160 | |
GregCr | 2:4ff11ea92fbe | 161 | void SX126x::SetAutoTxRx( uint32_t time, uint8_t intMode, uint32_t timeout ) |
GregCr | 0:deaafdfde3bb | 162 | { |
GregCr | 0:deaafdfde3bb | 163 | uint32_t compensatedTime = time - ( uint16_t )AUTO_RX_TX_OFFSET; |
GregCr | 0:deaafdfde3bb | 164 | uint8_t buf[7]; |
GregCr | 0:deaafdfde3bb | 165 | |
GregCr | 0:deaafdfde3bb | 166 | buf[0] = ( uint8_t )( ( compensatedTime >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 167 | buf[1] = ( uint8_t )( ( compensatedTime >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 168 | buf[2] = ( uint8_t )( compensatedTime & 0xFF ); |
GregCr | 0:deaafdfde3bb | 169 | buf[3] = intMode; |
GregCr | 0:deaafdfde3bb | 170 | buf[4] = ( uint8_t )( ( timeout >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 171 | buf[5] = ( uint8_t )( ( timeout >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 172 | buf[6] = ( uint8_t )( timeout & 0xFF ); |
GregCr | 0:deaafdfde3bb | 173 | WriteCommand( RADIO_SET_AUTOTXRX, buf, 7 ); |
GregCr | 0:deaafdfde3bb | 174 | } |
GregCr | 0:deaafdfde3bb | 175 | |
GregCr | 0:deaafdfde3bb | 176 | |
GregCr | 2:4ff11ea92fbe | 177 | void SX126x::SetTxContinuousWave( void ) |
GregCr | 0:deaafdfde3bb | 178 | { |
GregCr | 0:deaafdfde3bb | 179 | WriteCommand( RADIO_SET_TXCONTINUOUSWAVE, 0, 0 ); |
GregCr | 0:deaafdfde3bb | 180 | } |
GregCr | 0:deaafdfde3bb | 181 | |
GregCr | 2:4ff11ea92fbe | 182 | void SX126x::SetTxContinuousPreamble( void ) |
GregCr | 0:deaafdfde3bb | 183 | { |
GregCr | 0:deaafdfde3bb | 184 | WriteCommand( RADIO_SET_TXCONTINUOUSPREAMBLE, 0, 0 ); |
GregCr | 0:deaafdfde3bb | 185 | } |
GregCr | 0:deaafdfde3bb | 186 | |
GregCr | 2:4ff11ea92fbe | 187 | void SX126x::SetPacketType( RadioPacketType_t packetType ) |
GregCr | 0:deaafdfde3bb | 188 | { |
GregCr | 0:deaafdfde3bb | 189 | // Save packet type internally to avoid questioning the radio |
GregCr | 0:deaafdfde3bb | 190 | this->PacketType = packetType; |
GregCr | 0:deaafdfde3bb | 191 | |
GregCr | 0:deaafdfde3bb | 192 | WriteCommand( RADIO_SET_PACKETTYPE, ( uint8_t* )&packetType, 1 ); |
GregCr | 0:deaafdfde3bb | 193 | } |
GregCr | 0:deaafdfde3bb | 194 | |
GregCr | 2:4ff11ea92fbe | 195 | RadioPacketType_t SX126x::GetPacketType( void ) |
GregCr | 0:deaafdfde3bb | 196 | { |
GregCr | 0:deaafdfde3bb | 197 | return this->PacketType; |
GregCr | 0:deaafdfde3bb | 198 | } |
GregCr | 0:deaafdfde3bb | 199 | |
GregCr | 2:4ff11ea92fbe | 200 | void SX126x::SetRfFrequency( uint32_t frequency ) |
GregCr | 0:deaafdfde3bb | 201 | { |
GregCr | 0:deaafdfde3bb | 202 | uint8_t buf[4]; |
GregCr | 0:deaafdfde3bb | 203 | uint32_t freq = 0; |
GregCr | 0:deaafdfde3bb | 204 | |
GregCr | 0:deaafdfde3bb | 205 | freq = ( uint32_t )( ( double )frequency / ( double )FREQ_STEP ); |
GregCr | 0:deaafdfde3bb | 206 | buf[0] = ( uint8_t )( ( freq >> 24 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 207 | buf[1] = ( uint8_t )( ( freq >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 208 | buf[2] = ( uint8_t )( ( freq >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 209 | buf[3] = ( uint8_t )( freq & 0xFF ); |
GregCr | 0:deaafdfde3bb | 210 | WriteCommand( RADIO_SET_RFFREQUENCY, buf, 3 ); |
GregCr | 0:deaafdfde3bb | 211 | } |
GregCr | 0:deaafdfde3bb | 212 | |
GregCr | 2:4ff11ea92fbe | 213 | void SX126x::SetTxParams( int8_t power, RadioRampTimes_t rampTime ) |
GregCr | 0:deaafdfde3bb | 214 | { |
GregCr | 0:deaafdfde3bb | 215 | uint8_t buf[2]; |
GregCr | 0:deaafdfde3bb | 216 | |
GregCr | 0:deaafdfde3bb | 217 | buf[0] = power ; |
GregCr | 0:deaafdfde3bb | 218 | buf[1] = ( uint8_t )rampTime; |
GregCr | 0:deaafdfde3bb | 219 | WriteCommand( RADIO_SET_TXPARAMS, buf, 2 ); |
GregCr | 0:deaafdfde3bb | 220 | } |
GregCr | 0:deaafdfde3bb | 221 | |
GregCr | 2:4ff11ea92fbe | 222 | void SX126x::SetCadConfig( RadioLoRaCadSymbols_t cadSymbolNum , uint8_t cadExitMode, uint32_t cadRxTxTimeout) |
GregCr | 0:deaafdfde3bb | 223 | { |
GregCr | 0:deaafdfde3bb | 224 | uint8_t buf[5]; |
GregCr | 0:deaafdfde3bb | 225 | buf[0] = ( uint8_t )cadSymbolNum; |
GregCr | 0:deaafdfde3bb | 226 | buf[1] = cadExitMode; |
GregCr | 0:deaafdfde3bb | 227 | buf[2] = ( uint8_t )( ( cadRxTxTimeout >> 16 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 228 | buf[3] = ( uint8_t )( ( cadRxTxTimeout >> 8 ) & 0xFF ); |
GregCr | 0:deaafdfde3bb | 229 | buf[4] = ( uint8_t )( cadRxTxTimeout & 0xFF ); |
GregCr | 0:deaafdfde3bb | 230 | WriteCommand( RADIO_SET_CADPARAMS, buf, 5 ); |
GregCr | 0:deaafdfde3bb | 231 | OperatingMode = MODE_CAD; |
GregCr | 0:deaafdfde3bb | 232 | } |
GregCr | 0:deaafdfde3bb | 233 | |
GregCr | 2:4ff11ea92fbe | 234 | void SX126x::SetBufferBaseAddresses( uint8_t txBaseAddress, uint8_t rxBaseAddress ) |
GregCr | 0:deaafdfde3bb | 235 | { |
GregCr | 0:deaafdfde3bb | 236 | uint8_t buf[2]; |
GregCr | 0:deaafdfde3bb | 237 | |
GregCr | 0:deaafdfde3bb | 238 | buf[0] = txBaseAddress; |
GregCr | 0:deaafdfde3bb | 239 | buf[1] = rxBaseAddress; |
GregCr | 0:deaafdfde3bb | 240 | WriteCommand( RADIO_SET_BUFFERBASEADDRESS, buf, 2 ); |
GregCr | 0:deaafdfde3bb | 241 | } |
GregCr | 0:deaafdfde3bb | 242 | |
GregCr | 2:4ff11ea92fbe | 243 | void SX126x::SetModulationParams( ModulationParams_t *modulationParams ) |
GregCr | 0:deaafdfde3bb | 244 | { |
GregCr | 0:deaafdfde3bb | 245 | uint8_t n; |
GregCr | 3:7e3595a9ebe0 | 246 | uint32_t tempVal = 0; |
GregCr | 3:7e3595a9ebe0 | 247 | uint8_t buf[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
GregCr | 3:7e3595a9ebe0 | 248 | |
GregCr | 0:deaafdfde3bb | 249 | // Check if required configuration corresponds to the stored packet type |
GregCr | 0:deaafdfde3bb | 250 | // If not, silently update radio packet type |
GregCr | 0:deaafdfde3bb | 251 | if( this->PacketType != modulationParams->PacketType ) |
GregCr | 0:deaafdfde3bb | 252 | { |
GregCr | 0:deaafdfde3bb | 253 | this->SetPacketType( modulationParams->PacketType ); |
GregCr | 0:deaafdfde3bb | 254 | } |
GregCr | 0:deaafdfde3bb | 255 | |
GregCr | 0:deaafdfde3bb | 256 | switch( modulationParams->PacketType ) |
GregCr | 0:deaafdfde3bb | 257 | { |
GregCr | 0:deaafdfde3bb | 258 | case PACKET_TYPE_GFSK: |
GregCr | 3:7e3595a9ebe0 | 259 | tempVal = ( uint32_t )( ( double )XTAL_FREQ / ( double )modulationParams->Params.Gfsk.BitRate ); |
GregCr | 3:7e3595a9ebe0 | 260 | tempVal = tempVal * 32; |
GregCr | 3:7e3595a9ebe0 | 261 | buf[0] = ( tempVal >> 16 ) & 0xFF; |
GregCr | 3:7e3595a9ebe0 | 262 | buf[1] = ( tempVal >> 8 ) & 0xFF; |
GregCr | 3:7e3595a9ebe0 | 263 | buf[2] = tempVal & 0xFF; |
GregCr | 3:7e3595a9ebe0 | 264 | |
GregCr | 3:7e3595a9ebe0 | 265 | buf[3] = modulationParams->Params.Gfsk.PulseShape; |
GregCr | 3:7e3595a9ebe0 | 266 | buf[4] = modulationParams->Params.Gfsk.BW; |
GregCr | 3:7e3595a9ebe0 | 267 | |
GregCr | 3:7e3595a9ebe0 | 268 | tempVal = ( uint32_t )( ( double )FREQ_STEP * ( double )modulationParams->Params.Gfsk.Fdev ); |
GregCr | 3:7e3595a9ebe0 | 269 | buf[5] = ( tempVal >> 16 ) & 0xFF; |
GregCr | 3:7e3595a9ebe0 | 270 | buf[6] = ( tempVal >> 8 ) & 0xFF; |
GregCr | 3:7e3595a9ebe0 | 271 | buf[7] = ( tempVal& 0xFF ); |
GregCr | 0:deaafdfde3bb | 272 | n = 8; |
GregCr | 0:deaafdfde3bb | 273 | break; |
GregCr | 3:7e3595a9ebe0 | 274 | |
GregCr | 0:deaafdfde3bb | 275 | case PACKET_TYPE_LORA: |
GregCr | 0:deaafdfde3bb | 276 | n = 3; |
GregCr | 3:7e3595a9ebe0 | 277 | buf[0] = modulationParams->Params.LoRa.SpreadingFactor; |
GregCr | 3:7e3595a9ebe0 | 278 | buf[1] = modulationParams->Params.LoRa.Bandwidth; |
GregCr | 3:7e3595a9ebe0 | 279 | buf[2] = modulationParams->Params.LoRa.CodingRate; |
GregCr | 0:deaafdfde3bb | 280 | break; |
GregCr | 3:7e3595a9ebe0 | 281 | |
GregCr | 3:7e3595a9ebe0 | 282 | case PACKET_TYPE_RESERVED: |
GregCr | 0:deaafdfde3bb | 283 | return; |
GregCr | 0:deaafdfde3bb | 284 | } |
GregCr | 3:7e3595a9ebe0 | 285 | WriteCommand( RADIO_SET_MODULATIONPARAMS, buf, n ); |
GregCr | 0:deaafdfde3bb | 286 | } |
GregCr | 0:deaafdfde3bb | 287 | |
GregCr | 2:4ff11ea92fbe | 288 | void SX126x::SetPacketParams( PacketParams_t *packetParams ) |
GregCr | 0:deaafdfde3bb | 289 | { |
GregCr | 0:deaafdfde3bb | 290 | uint8_t n; |
GregCr | 0:deaafdfde3bb | 291 | |
GregCr | 0:deaafdfde3bb | 292 | // Check if required configuration corresponds to the stored packet type |
GregCr | 0:deaafdfde3bb | 293 | // If not, silently update radio packet type |
GregCr | 0:deaafdfde3bb | 294 | if( this->PacketType != packetParams->PacketType ) |
GregCr | 0:deaafdfde3bb | 295 | { |
GregCr | 0:deaafdfde3bb | 296 | this->SetPacketType( packetParams->PacketType ); |
GregCr | 0:deaafdfde3bb | 297 | } |
GregCr | 0:deaafdfde3bb | 298 | |
GregCr | 0:deaafdfde3bb | 299 | switch( packetParams->PacketType ) |
GregCr | 0:deaafdfde3bb | 300 | { |
GregCr | 0:deaafdfde3bb | 301 | case PACKET_TYPE_GFSK: |
GregCr | 0:deaafdfde3bb | 302 | n = 8; |
GregCr | 3:7e3595a9ebe0 | 303 | break; |
GregCr | 0:deaafdfde3bb | 304 | case PACKET_TYPE_LORA: |
GregCr | 0:deaafdfde3bb | 305 | n = 5; |
GregCr | 0:deaafdfde3bb | 306 | break; |
GregCr | 3:7e3595a9ebe0 | 307 | case PACKET_TYPE_RESERVED: |
GregCr | 0:deaafdfde3bb | 308 | return; |
GregCr | 0:deaafdfde3bb | 309 | } |
GregCr | 0:deaafdfde3bb | 310 | WriteCommand( RADIO_SET_PACKETPARAMS, packetParams->Params.Buffer, n ); |
GregCr | 0:deaafdfde3bb | 311 | } |
GregCr | 0:deaafdfde3bb | 312 | |
GregCr | 2:4ff11ea92fbe | 313 | void SX126x::GetRxBufferStatus( uint8_t *payloadLength, uint8_t *rxStartBufferPointer ) |
GregCr | 0:deaafdfde3bb | 314 | { |
GregCr | 0:deaafdfde3bb | 315 | uint8_t status[2]; |
GregCr | 0:deaafdfde3bb | 316 | |
GregCr | 0:deaafdfde3bb | 317 | ReadCommand( RADIO_GET_RXBUFFERSTATUS, status, 2 ); |
GregCr | 0:deaafdfde3bb | 318 | |
GregCr | 0:deaafdfde3bb | 319 | *payloadLength = status[0]; |
GregCr | 0:deaafdfde3bb | 320 | *rxStartBufferPointer = status[1]; |
GregCr | 0:deaafdfde3bb | 321 | } |
GregCr | 0:deaafdfde3bb | 322 | |
GregCr | 2:4ff11ea92fbe | 323 | void SX126x::GetPacketStatus( PacketStatus_t *pktStatus ) |
GregCr | 0:deaafdfde3bb | 324 | { |
GregCr | 0:deaafdfde3bb | 325 | uint8_t status[3]; |
GregCr | 0:deaafdfde3bb | 326 | |
GregCr | 0:deaafdfde3bb | 327 | |
GregCr | 0:deaafdfde3bb | 328 | ReadCommand( RADIO_GET_PACKETSTATUS, status, 3 ); |
GregCr | 0:deaafdfde3bb | 329 | |
GregCr | 0:deaafdfde3bb | 330 | pktStatus->packetType = this -> GetPacketType( ); |
GregCr | 0:deaafdfde3bb | 331 | switch( pktStatus->packetType ) |
GregCr | 0:deaafdfde3bb | 332 | { |
GregCr | 0:deaafdfde3bb | 333 | case PACKET_TYPE_GFSK: |
GregCr | 0:deaafdfde3bb | 334 | pktStatus->Gfsk.RxStatus = status[0]; |
GregCr | 0:deaafdfde3bb | 335 | pktStatus->Gfsk.RssiSync = -status[1] / 2; |
GregCr | 0:deaafdfde3bb | 336 | pktStatus->Gfsk.RssiAvg = -status[2] / 2; |
GregCr | 0:deaafdfde3bb | 337 | break; |
GregCr | 0:deaafdfde3bb | 338 | |
GregCr | 0:deaafdfde3bb | 339 | case PACKET_TYPE_LORA: |
GregCr | 0:deaafdfde3bb | 340 | pktStatus->LoRa.RssiPkt = -status[0] / 2; |
GregCr | 0:deaafdfde3bb | 341 | ( status[1] < 128 ) ? ( pktStatus->LoRa.SnrPkt = status[1] / 4 ) : ( pktStatus->LoRa.SnrPkt = ( ( status[1] - 256 ) /4 ) ); |
GregCr | 0:deaafdfde3bb | 342 | pktStatus->LoRa.SignalRssiPkt = -status[2] / 2; |
GregCr | 0:deaafdfde3bb | 343 | break; |
GregCr | 0:deaafdfde3bb | 344 | |
GregCr | 3:7e3595a9ebe0 | 345 | case PACKET_TYPE_RESERVED: |
GregCr | 0:deaafdfde3bb | 346 | // In that specific case, we set everything in the pktStatus to zeros |
GregCr | 0:deaafdfde3bb | 347 | // and reset the packet type accordingly |
GregCr | 0:deaafdfde3bb | 348 | memset( pktStatus, 0, sizeof( PacketStatus_t ) ); |
GregCr | 3:7e3595a9ebe0 | 349 | pktStatus->packetType = PACKET_TYPE_RESERVED; |
GregCr | 0:deaafdfde3bb | 350 | break; |
GregCr | 0:deaafdfde3bb | 351 | } |
GregCr | 0:deaafdfde3bb | 352 | } |
GregCr | 0:deaafdfde3bb | 353 | |
GregCr | 2:4ff11ea92fbe | 354 | int8_t SX126x::GetRssiInst( void ) |
GregCr | 0:deaafdfde3bb | 355 | { |
GregCr | 0:deaafdfde3bb | 356 | int8_t rssi; |
GregCr | 0:deaafdfde3bb | 357 | |
GregCr | 0:deaafdfde3bb | 358 | ReadCommand( RADIO_GET_RSSIINST, ( uint8_t* )&rssi, 1 ); |
GregCr | 0:deaafdfde3bb | 359 | return -rssi / 2; |
GregCr | 0:deaafdfde3bb | 360 | } |
GregCr | 0:deaafdfde3bb | 361 | |
GregCr | 2:4ff11ea92fbe | 362 | void SX126x::GetStats( RxCounter_t *rxCounter ) |
GregCr | 0:deaafdfde3bb | 363 | { |
GregCr | 0:deaafdfde3bb | 364 | uint8_t status[6]; |
GregCr | 0:deaafdfde3bb | 365 | |
GregCr | 0:deaafdfde3bb | 366 | |
GregCr | 0:deaafdfde3bb | 367 | rxCounter->packetType = this -> GetPacketType( ); |
GregCr | 0:deaafdfde3bb | 368 | ReadCommand( RADIO_GET_STATS, status, 6 ); |
GregCr | 0:deaafdfde3bb | 369 | rxCounter->NbPktReceived = ( status[0] << 8 ) | status[1]; |
GregCr | 0:deaafdfde3bb | 370 | rxCounter->NbPktCrcOk = ( status[2] << 8 ) | status[3]; |
GregCr | 0:deaafdfde3bb | 371 | rxCounter->NbPktLengthError = ( status[4] << 8 ) | status[4]; |
GregCr | 0:deaafdfde3bb | 372 | } |
GregCr | 0:deaafdfde3bb | 373 | |
GregCr | 2:4ff11ea92fbe | 374 | void SX126x::ResetStats( ) |
GregCr | 0:deaafdfde3bb | 375 | { |
GregCr | 0:deaafdfde3bb | 376 | uint8_t status[6]; |
GregCr | 0:deaafdfde3bb | 377 | |
GregCr | 0:deaafdfde3bb | 378 | memset( status, 0, sizeof( status ) ); |
GregCr | 0:deaafdfde3bb | 379 | WriteCommand( RADIO_RESET_STATS, status, 6 ); |
GregCr | 0:deaafdfde3bb | 380 | } |
GregCr | 0:deaafdfde3bb | 381 | |
GregCr | 2:4ff11ea92fbe | 382 | uint8_t SX126x::GetError() |
GregCr | 0:deaafdfde3bb | 383 | { |
GregCr | 0:deaafdfde3bb | 384 | uint8_t error; |
GregCr | 0:deaafdfde3bb | 385 | |
GregCr | 0:deaafdfde3bb | 386 | ReadCommand( RADIO_GET_ERROR, &error, 1 ); |
GregCr | 0:deaafdfde3bb | 387 | return error; |
GregCr | 0:deaafdfde3bb | 388 | } |
GregCr | 0:deaafdfde3bb | 389 | |
GregCr | 0:deaafdfde3bb | 390 | |
GregCr | 2:4ff11ea92fbe | 391 | void SX126x::SetDioIrqParams( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask ) |
GregCr | 0:deaafdfde3bb | 392 | { |
GregCr | 0:deaafdfde3bb | 393 | uint8_t buf[8]; |
GregCr | 0:deaafdfde3bb | 394 | |
GregCr | 0:deaafdfde3bb | 395 | buf[0] = ( uint8_t )( ( irqMask >> 8 ) & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 396 | buf[1] = ( uint8_t )( irqMask & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 397 | buf[2] = ( uint8_t )( ( dio1Mask >> 8 ) & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 398 | buf[3] = ( uint8_t )( dio1Mask & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 399 | buf[4] = ( uint8_t )( ( dio2Mask >> 8 ) & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 400 | buf[5] = ( uint8_t )( dio2Mask & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 401 | buf[6] = ( uint8_t )( ( dio3Mask >> 8 ) & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 402 | buf[7] = ( uint8_t )( dio3Mask & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 403 | WriteCommand( RADIO_CFG_DIOIRQ, buf, 8 ); |
GregCr | 0:deaafdfde3bb | 404 | } |
GregCr | 0:deaafdfde3bb | 405 | |
GregCr | 2:4ff11ea92fbe | 406 | uint16_t SX126x::GetIrqStatus( void ) |
GregCr | 0:deaafdfde3bb | 407 | { |
GregCr | 0:deaafdfde3bb | 408 | uint8_t irqStatus[2]; |
GregCr | 0:deaafdfde3bb | 409 | ReadCommand( RADIO_GET_IRQSTATUS, irqStatus, 2 ); |
GregCr | 0:deaafdfde3bb | 410 | return ( irqStatus[0] << 8 ) | irqStatus[1]; |
GregCr | 0:deaafdfde3bb | 411 | } |
GregCr | 0:deaafdfde3bb | 412 | |
GregCr | 2:4ff11ea92fbe | 413 | void SX126x::ClearIrqStatus( uint16_t irq ) |
GregCr | 0:deaafdfde3bb | 414 | { |
GregCr | 0:deaafdfde3bb | 415 | uint8_t buf[2]; |
GregCr | 0:deaafdfde3bb | 416 | |
GregCr | 0:deaafdfde3bb | 417 | buf[0] = ( uint8_t )( ( ( uint16_t )irq >> 8 ) & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 418 | buf[1] = ( uint8_t )( ( uint16_t )irq & 0x00FF ); |
GregCr | 0:deaafdfde3bb | 419 | WriteCommand( RADIO_CLR_IRQSTATUS, buf, 2 ); |
GregCr | 0:deaafdfde3bb | 420 | } |
GregCr | 0:deaafdfde3bb | 421 | |
GregCr | 2:4ff11ea92fbe | 422 | void SX126x::Calibrate( CalibrationParams_t calibParam ) |
GregCr | 0:deaafdfde3bb | 423 | { |
GregCr | 0:deaafdfde3bb | 424 | WriteCommand( RADIO_CALIBRATE, &calibParam.Value, 1 ); |
GregCr | 0:deaafdfde3bb | 425 | } |
GregCr | 0:deaafdfde3bb | 426 | |
GregCr | 2:4ff11ea92fbe | 427 | void SX126x::SetRegulatorMode( uint8_t mode ) |
GregCr | 0:deaafdfde3bb | 428 | { |
GregCr | 0:deaafdfde3bb | 429 | WriteCommand( RADIO_SET_REGULATORMODE, &mode, 1 ); |
GregCr | 0:deaafdfde3bb | 430 | } |
GregCr | 0:deaafdfde3bb | 431 | |
GregCr | 0:deaafdfde3bb | 432 | |
GregCr | 2:4ff11ea92fbe | 433 | void SX126x::SetLongPreamble( uint8_t enable ) |
GregCr | 0:deaafdfde3bb | 434 | { |
GregCr | 0:deaafdfde3bb | 435 | WriteCommand( RADIO_SET_LONGPREAMBLE, &enable, 1 ); |
GregCr | 0:deaafdfde3bb | 436 | } |
GregCr | 0:deaafdfde3bb | 437 | |
GregCr | 2:4ff11ea92fbe | 438 | void SX126x::SetPayload( uint8_t *buffer, uint8_t size ) |
GregCr | 0:deaafdfde3bb | 439 | { |
GregCr | 0:deaafdfde3bb | 440 | WriteBuffer( 0x00, buffer, size ); |
GregCr | 0:deaafdfde3bb | 441 | } |
GregCr | 0:deaafdfde3bb | 442 | |
GregCr | 2:4ff11ea92fbe | 443 | uint8_t SX126x::GetPayload( uint8_t *buffer, uint8_t *size, uint8_t maxSize ) |
GregCr | 0:deaafdfde3bb | 444 | { |
GregCr | 0:deaafdfde3bb | 445 | uint8_t offset; |
GregCr | 0:deaafdfde3bb | 446 | |
GregCr | 0:deaafdfde3bb | 447 | GetRxBufferStatus( size, &offset ); |
GregCr | 0:deaafdfde3bb | 448 | if(*size > maxSize) |
GregCr | 0:deaafdfde3bb | 449 | { |
GregCr | 0:deaafdfde3bb | 450 | return 1; |
GregCr | 0:deaafdfde3bb | 451 | } |
GregCr | 0:deaafdfde3bb | 452 | ReadBuffer( offset, buffer, *size ); |
GregCr | 0:deaafdfde3bb | 453 | return 0; |
GregCr | 0:deaafdfde3bb | 454 | } |
GregCr | 0:deaafdfde3bb | 455 | |
GregCr | 2:4ff11ea92fbe | 456 | void SX126x::SendPayload( uint8_t *payload, uint8_t size, uint32_t timeout ) |
GregCr | 0:deaafdfde3bb | 457 | { |
GregCr | 0:deaafdfde3bb | 458 | SetPayload( payload, size ); |
GregCr | 0:deaafdfde3bb | 459 | SetTx( timeout ); |
GregCr | 0:deaafdfde3bb | 460 | } |
GregCr | 0:deaafdfde3bb | 461 | |
GregCr | 2:4ff11ea92fbe | 462 | uint8_t SX126x::SetSyncWord( uint8_t *syncWord ) |
GregCr | 0:deaafdfde3bb | 463 | { |
GregCr | 3:7e3595a9ebe0 | 464 | WriteRegister( REG_LR_SYNCWORDBASEADDRESS, syncWord, 8 ); |
GregCr | 0:deaafdfde3bb | 465 | return 0; |
GregCr | 0:deaafdfde3bb | 466 | } |
GregCr | 0:deaafdfde3bb | 467 | |
GregCr | 3:7e3595a9ebe0 | 468 | void SX126x::SetCrcSeed( uint16_t seed ) |
GregCr | 0:deaafdfde3bb | 469 | { |
GregCr | 3:7e3595a9ebe0 | 470 | uint8_t buf[2]; |
GregCr | 3:7e3595a9ebe0 | 471 | buf[0] = ( uint8_t )( ( seed >> 8 ) & 0xFF ); |
GregCr | 3:7e3595a9ebe0 | 472 | buf[1] = ( uint8_t )( seed & 0xFF ); |
GregCr | 3:7e3595a9ebe0 | 473 | |
GregCr | 0:deaafdfde3bb | 474 | switch( GetPacketType( ) ) |
GregCr | 0:deaafdfde3bb | 475 | { |
GregCr | 0:deaafdfde3bb | 476 | case PACKET_TYPE_GFSK: |
GregCr | 3:7e3595a9ebe0 | 477 | WriteRegister( REG_LR_CRCSEEDBASEADDR, buf, 2 ); |
GregCr | 0:deaafdfde3bb | 478 | break; |
GregCr | 0:deaafdfde3bb | 479 | default: |
GregCr | 0:deaafdfde3bb | 480 | break; |
GregCr | 0:deaafdfde3bb | 481 | } |
GregCr | 0:deaafdfde3bb | 482 | } |
GregCr | 0:deaafdfde3bb | 483 | |
GregCr | 3:7e3595a9ebe0 | 484 | void SX126x::SetCrcPolynomial( uint16_t polynomial ) |
GregCr | 0:deaafdfde3bb | 485 | { |
GregCr | 3:7e3595a9ebe0 | 486 | uint8_t buf[2]; |
GregCr | 3:7e3595a9ebe0 | 487 | buf[0] = ( uint8_t )( ( polynomial >> 8 ) & 0xFF ); |
GregCr | 3:7e3595a9ebe0 | 488 | buf[1] = ( uint8_t )( polynomial & 0xFF ); |
GregCr | 3:7e3595a9ebe0 | 489 | |
GregCr | 0:deaafdfde3bb | 490 | switch( GetPacketType( ) ) |
GregCr | 0:deaafdfde3bb | 491 | { |
GregCr | 0:deaafdfde3bb | 492 | case PACKET_TYPE_GFSK: |
GregCr | 3:7e3595a9ebe0 | 493 | WriteRegister( REG_LR_CRCPOLYBASEADDR, buf, 2 ); |
GregCr | 0:deaafdfde3bb | 494 | break; |
GregCr | 0:deaafdfde3bb | 495 | default: |
GregCr | 0:deaafdfde3bb | 496 | break; |
GregCr | 0:deaafdfde3bb | 497 | } |
GregCr | 0:deaafdfde3bb | 498 | } |
GregCr | 0:deaafdfde3bb | 499 | |
GregCr | 2:4ff11ea92fbe | 500 | void SX126x::SetWhiteningSeed( uint8_t seed ) |
GregCr | 0:deaafdfde3bb | 501 | { |
GregCr | 0:deaafdfde3bb | 502 | switch( GetPacketType( ) ) |
GregCr | 0:deaafdfde3bb | 503 | { |
GregCr | 0:deaafdfde3bb | 504 | case PACKET_TYPE_GFSK: |
GregCr | 0:deaafdfde3bb | 505 | WriteRegister( REG_LR_WHITSEEDBASEADDR, seed ); |
GregCr | 0:deaafdfde3bb | 506 | break; |
GregCr | 0:deaafdfde3bb | 507 | default: |
GregCr | 0:deaafdfde3bb | 508 | break; |
GregCr | 0:deaafdfde3bb | 509 | } |
GregCr | 0:deaafdfde3bb | 510 | } |
GregCr | 0:deaafdfde3bb | 511 | |
GregCr | 2:4ff11ea92fbe | 512 | int8_t SX126x::ParseHexFileLine( char* line ) |
GregCr | 0:deaafdfde3bb | 513 | { |
GregCr | 0:deaafdfde3bb | 514 | uint16_t addr; |
GregCr | 0:deaafdfde3bb | 515 | uint16_t n; |
GregCr | 0:deaafdfde3bb | 516 | uint8_t code; |
GregCr | 0:deaafdfde3bb | 517 | uint8_t bytes[256]; |
GregCr | 0:deaafdfde3bb | 518 | |
GregCr | 0:deaafdfde3bb | 519 | if( GetHexFileLineFields( line, bytes, &addr, &n, &code ) != 0 ) |
GregCr | 0:deaafdfde3bb | 520 | { |
GregCr | 0:deaafdfde3bb | 521 | if( code == 0 ) |
GregCr | 0:deaafdfde3bb | 522 | { |
GregCr | 0:deaafdfde3bb | 523 | WriteRegister( addr, bytes, n ); |
GregCr | 0:deaafdfde3bb | 524 | } |
GregCr | 0:deaafdfde3bb | 525 | if( code == 1 ) |
GregCr | 0:deaafdfde3bb | 526 | { // end of file |
GregCr | 0:deaafdfde3bb | 527 | //return 2; |
GregCr | 0:deaafdfde3bb | 528 | } |
GregCr | 0:deaafdfde3bb | 529 | if( code == 2 ) |
GregCr | 0:deaafdfde3bb | 530 | { // begin of file |
GregCr | 0:deaafdfde3bb | 531 | //return 3; |
GregCr | 0:deaafdfde3bb | 532 | } |
GregCr | 0:deaafdfde3bb | 533 | } |
GregCr | 0:deaafdfde3bb | 534 | else |
GregCr | 0:deaafdfde3bb | 535 | { |
GregCr | 0:deaafdfde3bb | 536 | return 0; |
GregCr | 0:deaafdfde3bb | 537 | } |
GregCr | 0:deaafdfde3bb | 538 | return 1; |
GregCr | 0:deaafdfde3bb | 539 | } |
GregCr | 0:deaafdfde3bb | 540 | |
GregCr | 2:4ff11ea92fbe | 541 | int8_t SX126x::GetHexFileLineFields( char* line, uint8_t *bytes, uint16_t *addr, uint16_t *num, uint8_t *code ) |
GregCr | 0:deaafdfde3bb | 542 | { |
GregCr | 0:deaafdfde3bb | 543 | uint16_t sum, len, cksum; |
GregCr | 0:deaafdfde3bb | 544 | char *ptr; |
GregCr | 0:deaafdfde3bb | 545 | |
GregCr | 0:deaafdfde3bb | 546 | *num = 0; |
GregCr | 0:deaafdfde3bb | 547 | if( line[0] != ':' ) |
GregCr | 0:deaafdfde3bb | 548 | { |
GregCr | 0:deaafdfde3bb | 549 | return 0; |
GregCr | 0:deaafdfde3bb | 550 | } |
GregCr | 0:deaafdfde3bb | 551 | if( strlen( line ) < 11 ) |
GregCr | 0:deaafdfde3bb | 552 | { |
GregCr | 0:deaafdfde3bb | 553 | return 0; |
GregCr | 0:deaafdfde3bb | 554 | } |
GregCr | 0:deaafdfde3bb | 555 | ptr = line + 1; |
GregCr | 0:deaafdfde3bb | 556 | if( !sscanf( ptr, "%02hx", &len ) ) |
GregCr | 0:deaafdfde3bb | 557 | { |
GregCr | 0:deaafdfde3bb | 558 | return 0; |
GregCr | 0:deaafdfde3bb | 559 | } |
GregCr | 0:deaafdfde3bb | 560 | ptr += 2; |
GregCr | 0:deaafdfde3bb | 561 | if( strlen( line ) < ( 11 + ( len * 2 ) ) ) |
GregCr | 0:deaafdfde3bb | 562 | { |
GregCr | 0:deaafdfde3bb | 563 | return 0; |
GregCr | 0:deaafdfde3bb | 564 | } |
GregCr | 0:deaafdfde3bb | 565 | if( !sscanf( ptr, "%04hx", addr ) ) |
GregCr | 0:deaafdfde3bb | 566 | { |
GregCr | 0:deaafdfde3bb | 567 | return 0; |
GregCr | 0:deaafdfde3bb | 568 | } |
GregCr | 0:deaafdfde3bb | 569 | ptr += 4; |
GregCr | 0:deaafdfde3bb | 570 | if( !sscanf( ptr, "%02hhx", code ) ) |
GregCr | 0:deaafdfde3bb | 571 | { |
GregCr | 0:deaafdfde3bb | 572 | return 0; |
GregCr | 0:deaafdfde3bb | 573 | } |
GregCr | 0:deaafdfde3bb | 574 | ptr += 2; |
GregCr | 0:deaafdfde3bb | 575 | sum = ( len & 255 ) + ( ( *addr >> 8 ) & 255 ) + ( *addr & 255 ) + ( ( *code >> 8 ) & 255 ) + ( *code & 255 ); |
GregCr | 0:deaafdfde3bb | 576 | while( *num != len ) |
GregCr | 0:deaafdfde3bb | 577 | { |
GregCr | 0:deaafdfde3bb | 578 | if( !sscanf( ptr, "%02hhx", &bytes[*num] ) ) |
GregCr | 0:deaafdfde3bb | 579 | { |
GregCr | 0:deaafdfde3bb | 580 | return 0; |
GregCr | 0:deaafdfde3bb | 581 | } |
GregCr | 0:deaafdfde3bb | 582 | ptr += 2; |
GregCr | 0:deaafdfde3bb | 583 | sum += bytes[*num] & 255; |
GregCr | 0:deaafdfde3bb | 584 | ( *num )++; |
GregCr | 0:deaafdfde3bb | 585 | if( *num >= 256 ) |
GregCr | 0:deaafdfde3bb | 586 | { |
GregCr | 0:deaafdfde3bb | 587 | return 0; |
GregCr | 0:deaafdfde3bb | 588 | } |
GregCr | 0:deaafdfde3bb | 589 | } |
GregCr | 0:deaafdfde3bb | 590 | if( !sscanf( ptr, "%02hx", &cksum ) ) |
GregCr | 0:deaafdfde3bb | 591 | { |
GregCr | 0:deaafdfde3bb | 592 | return 0; |
GregCr | 0:deaafdfde3bb | 593 | } |
GregCr | 0:deaafdfde3bb | 594 | if( ( ( sum & 255 ) + ( cksum & 255 ) ) & 255 ) |
GregCr | 0:deaafdfde3bb | 595 | { |
GregCr | 0:deaafdfde3bb | 596 | return 0; // checksum error |
GregCr | 0:deaafdfde3bb | 597 | } |
GregCr | 0:deaafdfde3bb | 598 | |
GregCr | 0:deaafdfde3bb | 599 | return 1; |
GregCr | 0:deaafdfde3bb | 600 | } |
GregCr | 0:deaafdfde3bb | 601 | |
GregCr | 2:4ff11ea92fbe | 602 | void SX126x::OnDioIrq( void ) |
GregCr | 0:deaafdfde3bb | 603 | { |
GregCr | 3:7e3595a9ebe0 | 604 | if( onCustomDioIrq != NULL ) |
GregCr | 0:deaafdfde3bb | 605 | { |
GregCr | 0:deaafdfde3bb | 606 | onCustomDioIrq(); |
GregCr | 0:deaafdfde3bb | 607 | return; |
GregCr | 0:deaafdfde3bb | 608 | } |
GregCr | 3:7e3595a9ebe0 | 609 | |
GregCr | 0:deaafdfde3bb | 610 | uint16_t irqRegs = GetIrqStatus( ); |
GregCr | 0:deaafdfde3bb | 611 | LastIrqs = irqRegs; |
GregCr | 3:7e3595a9ebe0 | 612 | // printf("0x%04x\n\r", irqRegs ); |
GregCr | 0:deaafdfde3bb | 613 | ClearIrqStatus( IRQ_RADIO_ALL ); |
GregCr | 0:deaafdfde3bb | 614 | |
GregCr | 0:deaafdfde3bb | 615 | |
GregCr | 2:4ff11ea92fbe | 616 | #if( SX126x_DEBUG == 1 ) |
GregCr | 0:deaafdfde3bb | 617 | DigitalOut TEST_PIN_1( D14 ); |
GregCr | 0:deaafdfde3bb | 618 | DigitalOut TEST_PIN_2( D15 ); |
GregCr | 0:deaafdfde3bb | 619 | for( int i = 0x8000; i != 0; i >>= 1 ) |
GregCr | 0:deaafdfde3bb | 620 | { |
GregCr | 0:deaafdfde3bb | 621 | TEST_PIN_2 = 0; |
GregCr | 0:deaafdfde3bb | 622 | TEST_PIN_1 = ( ( irqRegs & i ) != 0 ) ? 1 : 0; |
GregCr | 0:deaafdfde3bb | 623 | TEST_PIN_2 = 1; |
GregCr | 0:deaafdfde3bb | 624 | } |
GregCr | 0:deaafdfde3bb | 625 | TEST_PIN_1 = 0; |
GregCr | 0:deaafdfde3bb | 626 | TEST_PIN_2 = 0; |
GregCr | 0:deaafdfde3bb | 627 | #endif |
GregCr | 0:deaafdfde3bb | 628 | |
GregCr | 3:7e3595a9ebe0 | 629 | if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE ) |
GregCr | 0:deaafdfde3bb | 630 | { |
GregCr | 0:deaafdfde3bb | 631 | if( txDone != NULL ) |
GregCr | 0:deaafdfde3bb | 632 | { |
GregCr | 0:deaafdfde3bb | 633 | txDone( ); |
GregCr | 0:deaafdfde3bb | 634 | } |
GregCr | 0:deaafdfde3bb | 635 | } |
GregCr | 0:deaafdfde3bb | 636 | |
GregCr | 3:7e3595a9ebe0 | 637 | if( ( irqRegs & IRQ_RX_DONE ) == IRQ_RX_DONE ) |
GregCr | 0:deaafdfde3bb | 638 | { |
GregCr | 3:7e3595a9ebe0 | 639 | if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR ) |
GregCr | 0:deaafdfde3bb | 640 | { |
GregCr | 3:7e3595a9ebe0 | 641 | if( rxError != NULL ) |
GregCr | 3:7e3595a9ebe0 | 642 | { |
GregCr | 3:7e3595a9ebe0 | 643 | rxError( IRQ_CRC_ERROR_CODE ); |
GregCr | 3:7e3595a9ebe0 | 644 | } |
GregCr | 3:7e3595a9ebe0 | 645 | } |
GregCr | 3:7e3595a9ebe0 | 646 | else |
GregCr | 3:7e3595a9ebe0 | 647 | { |
GregCr | 3:7e3595a9ebe0 | 648 | if( rxDone != NULL ) |
GregCr | 3:7e3595a9ebe0 | 649 | { |
GregCr | 3:7e3595a9ebe0 | 650 | rxDone( ); |
GregCr | 3:7e3595a9ebe0 | 651 | } |
GregCr | 0:deaafdfde3bb | 652 | } |
GregCr | 0:deaafdfde3bb | 653 | } |
GregCr | 0:deaafdfde3bb | 654 | |
GregCr | 3:7e3595a9ebe0 | 655 | if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT ) |
GregCr | 3:7e3595a9ebe0 | 656 | { |
GregCr | 3:7e3595a9ebe0 | 657 | if( ( rxTxTimeout != NULL ) && ( OperatingMode == MODE_TX ) ) |
GregCr | 3:7e3595a9ebe0 | 658 | { |
GregCr | 3:7e3595a9ebe0 | 659 | rxTxTimeout( IRQ_TX_TIMEOUT ); |
GregCr | 3:7e3595a9ebe0 | 660 | } |
GregCr | 3:7e3595a9ebe0 | 661 | else if( ( rxTxTimeout != NULL ) && ( OperatingMode == MODE_RX ) ) |
GregCr | 3:7e3595a9ebe0 | 662 | { |
GregCr | 3:7e3595a9ebe0 | 663 | rxTxTimeout( IRQ_RX_TIMEOUT ); |
GregCr | 3:7e3595a9ebe0 | 664 | } |
GregCr | 3:7e3595a9ebe0 | 665 | else |
GregCr | 3:7e3595a9ebe0 | 666 | { |
GregCr | 3:7e3595a9ebe0 | 667 | rxTxTimeout( IRQ_XYZ ); |
GregCr | 3:7e3595a9ebe0 | 668 | } |
GregCr | 3:7e3595a9ebe0 | 669 | } |
GregCr | 3:7e3595a9ebe0 | 670 | |
GregCr | 3:7e3595a9ebe0 | 671 | /* |
GregCr | 0:deaafdfde3bb | 672 | //IRQ_PREAMBLE_DETECTED = 0x0004, |
GregCr | 0:deaafdfde3bb | 673 | if( irqRegs & IRQ_PREAMBLE_DETECTED ) |
GregCr | 0:deaafdfde3bb | 674 | { |
GregCr | 0:deaafdfde3bb | 675 | if( rxPblSyncWordHeader != NULL ) |
GregCr | 0:deaafdfde3bb | 676 | { |
GregCr | 0:deaafdfde3bb | 677 | rxPblSyncWordHeader( IRQ_PBL_DETECT_CODE); |
GregCr | 3:7e3595a9ebe0 | 678 | |
GregCr | 0:deaafdfde3bb | 679 | } |
GregCr | 0:deaafdfde3bb | 680 | } |
GregCr | 0:deaafdfde3bb | 681 | |
GregCr | 0:deaafdfde3bb | 682 | //IRQ_SYNCWORD_VALID = 0x0008, |
GregCr | 0:deaafdfde3bb | 683 | if( irqRegs & IRQ_SYNCWORD_VALID ) |
GregCr | 0:deaafdfde3bb | 684 | { |
GregCr | 0:deaafdfde3bb | 685 | if( rxPblSyncWordHeader != NULL ) |
GregCr | 0:deaafdfde3bb | 686 | { |
GregCr | 0:deaafdfde3bb | 687 | rxPblSyncWordHeader( IRQ_SYNCWORD_VALID_CODE ); |
GregCr | 0:deaafdfde3bb | 688 | } |
GregCr | 0:deaafdfde3bb | 689 | } |
GregCr | 0:deaafdfde3bb | 690 | |
GregCr | 0:deaafdfde3bb | 691 | //IRQ_HEADER_VALID = 0x0010, |
GregCr | 0:deaafdfde3bb | 692 | if ( irqRegs & IRQ_HEADER_VALID ) |
GregCr | 0:deaafdfde3bb | 693 | { |
GregCr | 0:deaafdfde3bb | 694 | if( rxPblSyncWordHeader != NULL ) |
GregCr | 0:deaafdfde3bb | 695 | { |
GregCr | 3:7e3595a9ebe0 | 696 | rxPblSyncWordHeader( IRQ_HEADER_VALID_CODE ); |
GregCr | 0:deaafdfde3bb | 697 | } |
GregCr | 0:deaafdfde3bb | 698 | } |
GregCr | 0:deaafdfde3bb | 699 | |
GregCr | 0:deaafdfde3bb | 700 | //IRQ_HEADER_ERROR = 0x0020, |
GregCr | 0:deaafdfde3bb | 701 | if( irqRegs & IRQ_HEADER_ERROR ) |
GregCr | 0:deaafdfde3bb | 702 | { |
GregCr | 0:deaafdfde3bb | 703 | if( rxError != NULL ) |
GregCr | 0:deaafdfde3bb | 704 | { |
GregCr | 0:deaafdfde3bb | 705 | rxError( IRQ_HEADER_ERROR_CODE ); |
GregCr | 0:deaafdfde3bb | 706 | } |
GregCr | 0:deaafdfde3bb | 707 | } |
GregCr | 0:deaafdfde3bb | 708 | |
GregCr | 0:deaafdfde3bb | 709 | //IRQ_CAD_DONE = 0x0080, |
GregCr | 0:deaafdfde3bb | 710 | //IRQ_CAD_ACTIVITY_DETECTED = 0x0100, |
GregCr | 0:deaafdfde3bb | 711 | if( irqRegs & IRQ_CAD_DONE ) |
GregCr | 0:deaafdfde3bb | 712 | { |
GregCr | 0:deaafdfde3bb | 713 | bool detected = ( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED ); |
GregCr | 0:deaafdfde3bb | 714 | |
GregCr | 0:deaafdfde3bb | 715 | if( cadDone != NULL ) |
GregCr | 0:deaafdfde3bb | 716 | { |
GregCr | 0:deaafdfde3bb | 717 | cadDone( detected ); |
GregCr | 0:deaafdfde3bb | 718 | } |
GregCr | 0:deaafdfde3bb | 719 | |
GregCr | 3:7e3595a9ebe0 | 720 | }*/ |
GregCr | 0:deaafdfde3bb | 721 | } |
GregCr | 0:deaafdfde3bb | 722 | |
GregCr | 0:deaafdfde3bb | 723 | |
GregCr | 0:deaafdfde3bb | 724 |