1*cb5466b0SMatthias Ringwald /* 2*cb5466b0SMatthias Ringwald ______ _ 3*cb5466b0SMatthias Ringwald / _____) _ | | 4*cb5466b0SMatthias Ringwald ( (____ _____ ____ _| |_ _____ ____| |__ 5*cb5466b0SMatthias Ringwald \____ \| ___ | (_ _) ___ |/ ___) _ \ 6*cb5466b0SMatthias Ringwald _____) ) ____| | | || |_| ____( (___| | | | 7*cb5466b0SMatthias Ringwald (______/|_____)_|_|_| \__)_____)\____)_| |_| 8*cb5466b0SMatthias Ringwald (C)2016 Semtech 9*cb5466b0SMatthias Ringwald 10*cb5466b0SMatthias Ringwald Description: Handling of the node configuration protocol 11*cb5466b0SMatthias Ringwald 12*cb5466b0SMatthias Ringwald License: Revised BSD License, see LICENSE.TXT file include in the project 13*cb5466b0SMatthias Ringwald 14*cb5466b0SMatthias Ringwald Maintainer: Miguel Luis, Matthieu Verdy and Benjamin Boulet 15*cb5466b0SMatthias Ringwald */ 16*cb5466b0SMatthias Ringwald #ifndef __RADIO_H__ 17*cb5466b0SMatthias Ringwald #define __RADIO_H__ 18*cb5466b0SMatthias Ringwald 19*cb5466b0SMatthias Ringwald /*! 20*cb5466b0SMatthias Ringwald * \brief Class holding the basic communications with a radio 21*cb5466b0SMatthias Ringwald * 22*cb5466b0SMatthias Ringwald * It sets the functions to read/write registers, send commands and read/write 23*cb5466b0SMatthias Ringwald * payload. 24*cb5466b0SMatthias Ringwald * It also provides functions to run callback functions depending on the 25*cb5466b0SMatthias Ringwald * interrupts generated from the radio. 26*cb5466b0SMatthias Ringwald */ 27*cb5466b0SMatthias Ringwald struct Radio_s 28*cb5466b0SMatthias Ringwald { 29*cb5466b0SMatthias Ringwald /*! 30*cb5466b0SMatthias Ringwald * \brief Initializes the radio 31*cb5466b0SMatthias Ringwald * 32*cb5466b0SMatthias Ringwald * \param [IN] callbacks Structure containing the driver callback functions 33*cb5466b0SMatthias Ringwald */ 34*cb5466b0SMatthias Ringwald void ( *Init )( RadioCallbacks_t *callbacks ); 35*cb5466b0SMatthias Ringwald 36*cb5466b0SMatthias Ringwald /*! 37*cb5466b0SMatthias Ringwald * \brief Resets the radio 38*cb5466b0SMatthias Ringwald */ 39*cb5466b0SMatthias Ringwald void ( *Reset )( void ); 40*cb5466b0SMatthias Ringwald 41*cb5466b0SMatthias Ringwald /*! 42*cb5466b0SMatthias Ringwald * \brief Gets the current radio status 43*cb5466b0SMatthias Ringwald * 44*cb5466b0SMatthias Ringwald * \retval status Radio status 45*cb5466b0SMatthias Ringwald */ 46*cb5466b0SMatthias Ringwald RadioStatus_t ( *GetStatus )( void ); 47*cb5466b0SMatthias Ringwald 48*cb5466b0SMatthias Ringwald /*! 49*cb5466b0SMatthias Ringwald * \brief Writes the given command to the radio 50*cb5466b0SMatthias Ringwald * 51*cb5466b0SMatthias Ringwald * \param [in] opcode Command opcode 52*cb5466b0SMatthias Ringwald * \param [in] buffer Command parameters byte array 53*cb5466b0SMatthias Ringwald * \param [in] size Command parameters byte array size 54*cb5466b0SMatthias Ringwald */ 55*cb5466b0SMatthias Ringwald void ( *WriteCommand )( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ); 56*cb5466b0SMatthias Ringwald 57*cb5466b0SMatthias Ringwald /*! 58*cb5466b0SMatthias Ringwald * \brief Reads the given command from the radio 59*cb5466b0SMatthias Ringwald * 60*cb5466b0SMatthias Ringwald * \param [in] opcode Command opcode 61*cb5466b0SMatthias Ringwald * \param [in] buffer Command parameters byte array 62*cb5466b0SMatthias Ringwald * \param [in] size Command parameters byte array size 63*cb5466b0SMatthias Ringwald */ 64*cb5466b0SMatthias Ringwald void ( *ReadCommand )( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ); 65*cb5466b0SMatthias Ringwald 66*cb5466b0SMatthias Ringwald /*! 67*cb5466b0SMatthias Ringwald * \brief Writes multiple radio registers starting at address 68*cb5466b0SMatthias Ringwald * 69*cb5466b0SMatthias Ringwald * \param [in] address First Radio register address 70*cb5466b0SMatthias Ringwald * \param [in] buffer Buffer containing the new register's values 71*cb5466b0SMatthias Ringwald * \param [in] size Number of registers to be written 72*cb5466b0SMatthias Ringwald */ 73*cb5466b0SMatthias Ringwald void ( *WriteRegisters )( uint16_t address, uint8_t *buffer, uint16_t size ); 74*cb5466b0SMatthias Ringwald 75*cb5466b0SMatthias Ringwald /*! 76*cb5466b0SMatthias Ringwald * \brief Writes the radio register at the specified address 77*cb5466b0SMatthias Ringwald * 78*cb5466b0SMatthias Ringwald * \param [in] address Register address 79*cb5466b0SMatthias Ringwald * \param [in] value New register value 80*cb5466b0SMatthias Ringwald */ 81*cb5466b0SMatthias Ringwald void ( *WriteRegister )( uint16_t address, uint8_t value ); 82*cb5466b0SMatthias Ringwald 83*cb5466b0SMatthias Ringwald /*! 84*cb5466b0SMatthias Ringwald * \brief Reads multiple radio registers starting at address 85*cb5466b0SMatthias Ringwald * 86*cb5466b0SMatthias Ringwald * \param [in] address First Radio register address 87*cb5466b0SMatthias Ringwald * \param [out] buffer Buffer where to copy the registers data 88*cb5466b0SMatthias Ringwald * \param [in] size Number of registers to be read 89*cb5466b0SMatthias Ringwald */ 90*cb5466b0SMatthias Ringwald void ( *ReadRegisters )( uint16_t address, uint8_t *buffer, uint16_t size ); 91*cb5466b0SMatthias Ringwald 92*cb5466b0SMatthias Ringwald /*! 93*cb5466b0SMatthias Ringwald * \brief Reads the radio register at the specified address 94*cb5466b0SMatthias Ringwald * 95*cb5466b0SMatthias Ringwald * \param [in] address Register address 96*cb5466b0SMatthias Ringwald * 97*cb5466b0SMatthias Ringwald * \retval value The register value 98*cb5466b0SMatthias Ringwald */ 99*cb5466b0SMatthias Ringwald uint8_t ( *ReadRegister )( uint16_t address ); 100*cb5466b0SMatthias Ringwald 101*cb5466b0SMatthias Ringwald /*! 102*cb5466b0SMatthias Ringwald * \brief Writes Radio Data Buffer with buffer of size starting at offset. 103*cb5466b0SMatthias Ringwald * 104*cb5466b0SMatthias Ringwald * \param [in] offset Offset where to start writing 105*cb5466b0SMatthias Ringwald * \param [in] buffer Buffer pointer 106*cb5466b0SMatthias Ringwald * \param [in] size Buffer size 107*cb5466b0SMatthias Ringwald */ 108*cb5466b0SMatthias Ringwald void ( *WriteBuffer )( uint8_t offset, uint8_t *buffer, uint8_t size ); 109*cb5466b0SMatthias Ringwald 110*cb5466b0SMatthias Ringwald /*! 111*cb5466b0SMatthias Ringwald * \brief Reads Radio Data Buffer at offset to buffer of size 112*cb5466b0SMatthias Ringwald * 113*cb5466b0SMatthias Ringwald * \param [in] offset Offset where to start reading 114*cb5466b0SMatthias Ringwald * \param [out] buffer Buffer pointer 115*cb5466b0SMatthias Ringwald * \param [in] size Buffer size 116*cb5466b0SMatthias Ringwald */ 117*cb5466b0SMatthias Ringwald void ( *ReadBuffer )( uint8_t offset, uint8_t *buffer, uint8_t size ); 118*cb5466b0SMatthias Ringwald 119*cb5466b0SMatthias Ringwald /*! 120*cb5466b0SMatthias Ringwald * \brief Gets the current status of the radio DIOs 121*cb5466b0SMatthias Ringwald * 122*cb5466b0SMatthias Ringwald * \retval status [Bit #3: DIO3, Bit #2: DIO2, 123*cb5466b0SMatthias Ringwald * Bit #1: DIO1, Bit #0: BUSY] 124*cb5466b0SMatthias Ringwald */ 125*cb5466b0SMatthias Ringwald uint8_t ( *GetDioStatus )( void ); 126*cb5466b0SMatthias Ringwald 127*cb5466b0SMatthias Ringwald /*! 128*cb5466b0SMatthias Ringwald * \brief Return firmware version 129*cb5466b0SMatthias Ringwald * 130*cb5466b0SMatthias Ringwald * \retval firmware The firmware version 131*cb5466b0SMatthias Ringwald */ 132*cb5466b0SMatthias Ringwald uint16_t ( *GetFirmwareVersion )( void ); 133*cb5466b0SMatthias Ringwald 134*cb5466b0SMatthias Ringwald /*! 135*cb5466b0SMatthias Ringwald * \brief Sets the power regulators operating mode 136*cb5466b0SMatthias Ringwald * 137*cb5466b0SMatthias Ringwald * \param [in] mode [0: LDO, 1:DC_DC] 138*cb5466b0SMatthias Ringwald */ 139*cb5466b0SMatthias Ringwald void ( *SetRegulatorMode )( RadioRegulatorModes_t mode ); 140*cb5466b0SMatthias Ringwald 141*cb5466b0SMatthias Ringwald /*! 142*cb5466b0SMatthias Ringwald * \brief Sets the radio in configuration mode 143*cb5466b0SMatthias Ringwald * 144*cb5466b0SMatthias Ringwald * \param [in] mode The standby mode to put the radio into 145*cb5466b0SMatthias Ringwald */ 146*cb5466b0SMatthias Ringwald void ( *SetStandby )( RadioStandbyModes_t mode ); 147*cb5466b0SMatthias Ringwald 148*cb5466b0SMatthias Ringwald /*! 149*cb5466b0SMatthias Ringwald * \brief Sets the radio for the given protocol 150*cb5466b0SMatthias Ringwald * 151*cb5466b0SMatthias Ringwald * \param [in] packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA, 152*cb5466b0SMatthias Ringwald * PACKET_TYPE_RANGING, PACKET_TYPE_FLRC, 153*cb5466b0SMatthias Ringwald * PACKET_TYPE_BLE] 154*cb5466b0SMatthias Ringwald * 155*cb5466b0SMatthias Ringwald * \remark This method has to be called before SetRfFrequency, 156*cb5466b0SMatthias Ringwald * SetModulationParams and SetPacketParams 157*cb5466b0SMatthias Ringwald */ 158*cb5466b0SMatthias Ringwald void ( *SetPacketType )( RadioPacketTypes_t packetType ); 159*cb5466b0SMatthias Ringwald 160*cb5466b0SMatthias Ringwald /*! 161*cb5466b0SMatthias Ringwald * \brief Set the modulation parameters 162*cb5466b0SMatthias Ringwald * 163*cb5466b0SMatthias Ringwald * \param [in] modParams A structure describing the modulation parameters 164*cb5466b0SMatthias Ringwald */ 165*cb5466b0SMatthias Ringwald void ( *SetModulationParams )( ModulationParams_t *modParams ); 166*cb5466b0SMatthias Ringwald 167*cb5466b0SMatthias Ringwald /*! 168*cb5466b0SMatthias Ringwald * \brief Sets the packet parameters 169*cb5466b0SMatthias Ringwald * 170*cb5466b0SMatthias Ringwald * \param [in] packetParams A structure describing the packet parameters 171*cb5466b0SMatthias Ringwald */ 172*cb5466b0SMatthias Ringwald void ( *SetPacketParams )( PacketParams_t *packetParams ); 173*cb5466b0SMatthias Ringwald 174*cb5466b0SMatthias Ringwald /*! 175*cb5466b0SMatthias Ringwald * \brief Sets the RF frequency 176*cb5466b0SMatthias Ringwald * 177*cb5466b0SMatthias Ringwald * \param [in] frequency RF frequency [Hz] 178*cb5466b0SMatthias Ringwald */ 179*cb5466b0SMatthias Ringwald void ( *SetRfFrequency )( uint32_t frequency ); 180*cb5466b0SMatthias Ringwald 181*cb5466b0SMatthias Ringwald /*! 182*cb5466b0SMatthias Ringwald * \brief Sets the data buffer base address for transmission and reception 183*cb5466b0SMatthias Ringwald * 184*cb5466b0SMatthias Ringwald * \param [in] txBaseAddress Transmission base address 185*cb5466b0SMatthias Ringwald * \param [in] rxBaseAddress Reception base address 186*cb5466b0SMatthias Ringwald */ 187*cb5466b0SMatthias Ringwald void ( *SetBufferBaseAddresses )( uint8_t txBaseAddress, uint8_t rxBaseAddress ); 188*cb5466b0SMatthias Ringwald 189*cb5466b0SMatthias Ringwald /*! 190*cb5466b0SMatthias Ringwald * \brief Sets the transmission parameters 191*cb5466b0SMatthias Ringwald * 192*cb5466b0SMatthias Ringwald * \param [in] power RF output power [-18..13] dBm 193*cb5466b0SMatthias Ringwald * \param [in] rampTime Transmission ramp up time 194*cb5466b0SMatthias Ringwald */ 195*cb5466b0SMatthias Ringwald void ( *SetTxParams )( int8_t power, RadioRampTimes_t rampTime ); 196*cb5466b0SMatthias Ringwald 197*cb5466b0SMatthias Ringwald /*! 198*cb5466b0SMatthias Ringwald * \brief Sets the IRQ mask and DIO masks 199*cb5466b0SMatthias Ringwald * 200*cb5466b0SMatthias Ringwald * \param [in] irqMask General IRQ mask 201*cb5466b0SMatthias Ringwald * \param [in] dio1Mask DIO1 mask 202*cb5466b0SMatthias Ringwald * \param [in] dio2Mask DIO2 mask 203*cb5466b0SMatthias Ringwald * \param [in] dio3Mask DIO3 mask 204*cb5466b0SMatthias Ringwald */ 205*cb5466b0SMatthias Ringwald void ( *SetDioIrqParams )( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask ); 206*cb5466b0SMatthias Ringwald 207*cb5466b0SMatthias Ringwald /*! 208*cb5466b0SMatthias Ringwald * \brief Sets the Sync Word given by index used in GFSK, FLRC and BLE protocols 209*cb5466b0SMatthias Ringwald * 210*cb5466b0SMatthias Ringwald * \remark 5th byte isn't used in FLRC and BLE protocols 211*cb5466b0SMatthias Ringwald * 212*cb5466b0SMatthias Ringwald * \param [in] syncWordIdx Index of SyncWord to be set [1..3] 213*cb5466b0SMatthias Ringwald * \param [in] syncWord SyncWord bytes ( 5 bytes ) 214*cb5466b0SMatthias Ringwald * 215*cb5466b0SMatthias Ringwald * \retval status [0: OK, 1: NOK] 216*cb5466b0SMatthias Ringwald */ 217*cb5466b0SMatthias Ringwald uint8_t ( *SetSyncWord )( uint8_t syncWordIdx, uint8_t *syncWord ); 218*cb5466b0SMatthias Ringwald 219*cb5466b0SMatthias Ringwald /*! 220*cb5466b0SMatthias Ringwald * \brief Sets the radio in reception mode 221*cb5466b0SMatthias Ringwald * 222*cb5466b0SMatthias Ringwald * \param [in] timeout Structure describing the reception timeout value 223*cb5466b0SMatthias Ringwald */ 224*cb5466b0SMatthias Ringwald void ( *SetRx )( TickTime_t timeout ); 225*cb5466b0SMatthias Ringwald 226*cb5466b0SMatthias Ringwald /*! 227*cb5466b0SMatthias Ringwald * \brief Reads the payload received. If the received payload is longer 228*cb5466b0SMatthias Ringwald * than maxSize, then the method returns 1 and do not set size and payload. 229*cb5466b0SMatthias Ringwald * 230*cb5466b0SMatthias Ringwald * \param [out] payload A pointer to a buffer into which the payload will be copied 231*cb5466b0SMatthias Ringwald * \param [out] size A pointer to the size of the payload received 232*cb5466b0SMatthias Ringwald * \param [in] maxSize The maximal size allowed to copy into the buffer 233*cb5466b0SMatthias Ringwald */ 234*cb5466b0SMatthias Ringwald uint8_t ( *GetPayload )( uint8_t *payload, uint8_t *size, uint8_t maxSize ); 235*cb5466b0SMatthias Ringwald 236*cb5466b0SMatthias Ringwald /*! 237*cb5466b0SMatthias Ringwald * \brief Sends a payload 238*cb5466b0SMatthias Ringwald * 239*cb5466b0SMatthias Ringwald * \param [in] payload A pointer to the payload to send 240*cb5466b0SMatthias Ringwald * \param [in] size The size of the payload to send 241*cb5466b0SMatthias Ringwald * \param [in] timeout The timeout for Tx operation 242*cb5466b0SMatthias Ringwald */ 243*cb5466b0SMatthias Ringwald void ( *SendPayload )( uint8_t *payload, uint8_t size, TickTime_t timeout ); 244*cb5466b0SMatthias Ringwald 245*cb5466b0SMatthias Ringwald /*! 246*cb5466b0SMatthias Ringwald * \brief Set the role of the radio during ranging operations 247*cb5466b0SMatthias Ringwald * 248*cb5466b0SMatthias Ringwald * \param [in] role Role of the radio 249*cb5466b0SMatthias Ringwald */ 250*cb5466b0SMatthias Ringwald void ( *SetRangingRole )( RadioRangingRoles_t role ); 251*cb5466b0SMatthias Ringwald 252*cb5466b0SMatthias Ringwald /*! 253*cb5466b0SMatthias Ringwald * \brief Set the driver in polling mode. 254*cb5466b0SMatthias Ringwald * 255*cb5466b0SMatthias Ringwald * In polling mode the application is responsible to call ProcessIrqs( ) to 256*cb5466b0SMatthias Ringwald * execute callbacks functions. 257*cb5466b0SMatthias Ringwald * The default mode is Interrupt Mode. 258*cb5466b0SMatthias Ringwald * @code 259*cb5466b0SMatthias Ringwald * // Initializations and callbacks declaration/definition 260*cb5466b0SMatthias Ringwald * radio = SX1280( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks ); 261*cb5466b0SMatthias Ringwald * radio.Init( ); 262*cb5466b0SMatthias Ringwald * radio.SetPollingMode( ); 263*cb5466b0SMatthias Ringwald * 264*cb5466b0SMatthias Ringwald * while( true ) 265*cb5466b0SMatthias Ringwald * { 266*cb5466b0SMatthias Ringwald * // IRQ processing is automatically done 267*cb5466b0SMatthias Ringwald * radio.ProcessIrqs( ); // <-- here, as well as callback functions 268*cb5466b0SMatthias Ringwald * // calls 269*cb5466b0SMatthias Ringwald * // Do some applicative work 270*cb5466b0SMatthias Ringwald * } 271*cb5466b0SMatthias Ringwald * @endcode 272*cb5466b0SMatthias Ringwald * 273*cb5466b0SMatthias Ringwald * \see SX1280SetInterruptMode 274*cb5466b0SMatthias Ringwald */ 275*cb5466b0SMatthias Ringwald void ( *SetPollingMode )( void ); 276*cb5466b0SMatthias Ringwald 277*cb5466b0SMatthias Ringwald /*! 278*cb5466b0SMatthias Ringwald * \brief Set the driver in interrupt mode. 279*cb5466b0SMatthias Ringwald * 280*cb5466b0SMatthias Ringwald * In interrupt mode, the driver communicate with the radio during the 281*cb5466b0SMatthias Ringwald * interruption by direct calls to ProcessIrqs( ). The main advantage is 282*cb5466b0SMatthias Ringwald * the possibility to have low power application architecture. 283*cb5466b0SMatthias Ringwald * This is the default mode. 284*cb5466b0SMatthias Ringwald * @code 285*cb5466b0SMatthias Ringwald * // Initializations and callbacks declaration/definition 286*cb5466b0SMatthias Ringwald * radio = SX1280( mosi, miso, sclk, nss, busy, int1, int2, int3, rst, &callbacks ); 287*cb5466b0SMatthias Ringwald * radio.Init( ); 288*cb5466b0SMatthias Ringwald * radio.SetInterruptMode( ); // Optionnal. Driver default behavior 289*cb5466b0SMatthias Ringwald * 290*cb5466b0SMatthias Ringwald * while( true ) 291*cb5466b0SMatthias Ringwald * { 292*cb5466b0SMatthias Ringwald * // Do some applicative work 293*cb5466b0SMatthias Ringwald * } 294*cb5466b0SMatthias Ringwald * @endcode 295*cb5466b0SMatthias Ringwald * 296*cb5466b0SMatthias Ringwald * \see SX1280SetPollingMode 297*cb5466b0SMatthias Ringwald */ 298*cb5466b0SMatthias Ringwald void ( *SetInterruptMode )( void ); 299*cb5466b0SMatthias Ringwald 300*cb5466b0SMatthias Ringwald /*! 301*cb5466b0SMatthias Ringwald * \brief Initializes the radio registers to the recommended default values 302*cb5466b0SMatthias Ringwald */ 303*cb5466b0SMatthias Ringwald void ( *SetRegistersDefault )( void ); 304*cb5466b0SMatthias Ringwald 305*cb5466b0SMatthias Ringwald /*! 306*cb5466b0SMatthias Ringwald * \brief Gets the current Operation Mode of the Radio 307*cb5466b0SMatthias Ringwald * 308*cb5466b0SMatthias Ringwald * \retval RadioOperatingModes_t last operating mode 309*cb5466b0SMatthias Ringwald */ 310*cb5466b0SMatthias Ringwald RadioOperatingModes_t ( *GetOpMode )( void ); 311*cb5466b0SMatthias Ringwald 312*cb5466b0SMatthias Ringwald /*! 313*cb5466b0SMatthias Ringwald * \brief Sets the radio in sleep mode 314*cb5466b0SMatthias Ringwald * 315*cb5466b0SMatthias Ringwald * \param [in] sleepConfig The sleep configuration describing data 316*cb5466b0SMatthias Ringwald * retention and RTC wake-up 317*cb5466b0SMatthias Ringwald */ 318*cb5466b0SMatthias Ringwald void ( *SetSleep )( SleepParams_t sleepConfig ); 319*cb5466b0SMatthias Ringwald 320*cb5466b0SMatthias Ringwald /*! 321*cb5466b0SMatthias Ringwald * \brief Sets the radio in FS mode 322*cb5466b0SMatthias Ringwald */ 323*cb5466b0SMatthias Ringwald void ( *SetFs )( void ); 324*cb5466b0SMatthias Ringwald 325*cb5466b0SMatthias Ringwald /*! 326*cb5466b0SMatthias Ringwald * \brief Sets the radio in transmission mode 327*cb5466b0SMatthias Ringwald * 328*cb5466b0SMatthias Ringwald * \param [in] timeout Structure describing the transmission timeout value 329*cb5466b0SMatthias Ringwald */ 330*cb5466b0SMatthias Ringwald void ( *SetTx )( TickTime_t timeout ); 331*cb5466b0SMatthias Ringwald 332*cb5466b0SMatthias Ringwald /*! 333*cb5466b0SMatthias Ringwald * \brief Sets the Rx duty cycle management parameters 334*cb5466b0SMatthias Ringwald * 335*cb5466b0SMatthias Ringwald * \param [in] rxTime Structure describing reception timeout value 336*cb5466b0SMatthias Ringwald * \param [in] sleepTime Structure describing sleep timeout value 337*cb5466b0SMatthias Ringwald */ 338*cb5466b0SMatthias Ringwald void ( *SetRxDutyCycle )( RadioTickSizes_t Step, uint16_t NbStepRx, uint16_t RxNbStepSleep ); 339*cb5466b0SMatthias Ringwald 340*cb5466b0SMatthias Ringwald /*! 341*cb5466b0SMatthias Ringwald * \brief Sets the radio in CAD mode 342*cb5466b0SMatthias Ringwald * 343*cb5466b0SMatthias Ringwald * \see SX1280::SetCadParams 344*cb5466b0SMatthias Ringwald */ 345*cb5466b0SMatthias Ringwald void ( *SetCad )( void ); 346*cb5466b0SMatthias Ringwald 347*cb5466b0SMatthias Ringwald /*! 348*cb5466b0SMatthias Ringwald * \brief Sets the radio in continuous wave transmission mode 349*cb5466b0SMatthias Ringwald */ 350*cb5466b0SMatthias Ringwald void ( *SetTxContinuousWave )( void ); 351*cb5466b0SMatthias Ringwald 352*cb5466b0SMatthias Ringwald /*! 353*cb5466b0SMatthias Ringwald * \brief Sets the radio in continuous preamble transmission mode 354*cb5466b0SMatthias Ringwald */ 355*cb5466b0SMatthias Ringwald void ( *SetTxContinuousPreamble )( void ); 356*cb5466b0SMatthias Ringwald 357*cb5466b0SMatthias Ringwald /*! 358*cb5466b0SMatthias Ringwald * \brief Gets the current radio protocol 359*cb5466b0SMatthias Ringwald * 360*cb5466b0SMatthias Ringwald * \retval packetType [PACKET_TYPE_GFSK, PACKET_TYPE_LORA, 361*cb5466b0SMatthias Ringwald * PACKET_TYPE_RANGING, PACKET_TYPE_FLRC, 362*cb5466b0SMatthias Ringwald * PACKET_TYPE_BLE, PACKET_TYPE_NONE] 363*cb5466b0SMatthias Ringwald */ 364*cb5466b0SMatthias Ringwald RadioPacketTypes_t ( *GetPacketType )( void ); 365*cb5466b0SMatthias Ringwald 366*cb5466b0SMatthias Ringwald /*! 367*cb5466b0SMatthias Ringwald * \brief Sets the number of symbols to be used for Channel Activity 368*cb5466b0SMatthias Ringwald * Detection operation 369*cb5466b0SMatthias Ringwald * 370*cb5466b0SMatthias Ringwald * \param [in] cadSymbolNum The number of symbol to use for Channel Activity 371*cb5466b0SMatthias Ringwald * Detection operations [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL, 372*cb5466b0SMatthias Ringwald * LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL, LORA_CAD_16_SYMBOL] 373*cb5466b0SMatthias Ringwald */ 374*cb5466b0SMatthias Ringwald void ( *SetCadParams )( RadioLoRaCadSymbols_t cadSymbolNum ); 375*cb5466b0SMatthias Ringwald 376*cb5466b0SMatthias Ringwald /*! 377*cb5466b0SMatthias Ringwald * \brief Gets the last received packet buffer status 378*cb5466b0SMatthias Ringwald * 379*cb5466b0SMatthias Ringwald * \param [out] payloadLength Last received packet payload length 380*cb5466b0SMatthias Ringwald * \param [out] rxStartBuffer Last received packet buffer address pointer 381*cb5466b0SMatthias Ringwald */ 382*cb5466b0SMatthias Ringwald void ( *GetRxBufferStatus )( uint8_t *payloadLength, uint8_t *rxStartBuffer ); 383*cb5466b0SMatthias Ringwald 384*cb5466b0SMatthias Ringwald /*! 385*cb5466b0SMatthias Ringwald * \brief Gets the last received packet payload length 386*cb5466b0SMatthias Ringwald * 387*cb5466b0SMatthias Ringwald * \param [out] pktStatus A structure of packet status 388*cb5466b0SMatthias Ringwald */ 389*cb5466b0SMatthias Ringwald void ( *GetPacketStatus )( PacketStatus_t *pktStatus ); 390*cb5466b0SMatthias Ringwald 391*cb5466b0SMatthias Ringwald /*! 392*cb5466b0SMatthias Ringwald * \brief Returns the instantaneous RSSI value for the last packet received 393*cb5466b0SMatthias Ringwald * 394*cb5466b0SMatthias Ringwald * \retval rssiInst Instantaneous RSSI 395*cb5466b0SMatthias Ringwald */ 396*cb5466b0SMatthias Ringwald int8_t ( *GetRssiInst )( void ); 397*cb5466b0SMatthias Ringwald 398*cb5466b0SMatthias Ringwald /*! 399*cb5466b0SMatthias Ringwald * \brief Returns the current IRQ status 400*cb5466b0SMatthias Ringwald * 401*cb5466b0SMatthias Ringwald * \retval irqStatus IRQ status 402*cb5466b0SMatthias Ringwald */ 403*cb5466b0SMatthias Ringwald uint16_t ( *GetIrqStatus )( void ); 404*cb5466b0SMatthias Ringwald 405*cb5466b0SMatthias Ringwald /*! 406*cb5466b0SMatthias Ringwald * \brief Clears the IRQs 407*cb5466b0SMatthias Ringwald * 408*cb5466b0SMatthias Ringwald * \param [in] irq IRQ(s) to be cleared 409*cb5466b0SMatthias Ringwald */ 410*cb5466b0SMatthias Ringwald void ( *ClearIrqStatus )( uint16_t irq ); 411*cb5466b0SMatthias Ringwald 412*cb5466b0SMatthias Ringwald /*! 413*cb5466b0SMatthias Ringwald * \brief Calibrates the given radio block 414*cb5466b0SMatthias Ringwald * 415*cb5466b0SMatthias Ringwald * \param [in] calibParam The description of blocks to be calibrated 416*cb5466b0SMatthias Ringwald */ 417*cb5466b0SMatthias Ringwald void ( *Calibrate )( CalibrationParams_t calibParam ); 418*cb5466b0SMatthias Ringwald 419*cb5466b0SMatthias Ringwald /*! 420*cb5466b0SMatthias Ringwald * \brief Saves the current selected modem configuration into data RAM 421*cb5466b0SMatthias Ringwald */ 422*cb5466b0SMatthias Ringwald void ( *SetSaveContext )( void ); 423*cb5466b0SMatthias Ringwald 424*cb5466b0SMatthias Ringwald /*! 425*cb5466b0SMatthias Ringwald * \brief Sets the chip to automatically send a packet after the end of a packet reception 426*cb5466b0SMatthias Ringwald * 427*cb5466b0SMatthias Ringwald * \remark The offset is automatically compensated inside the function 428*cb5466b0SMatthias Ringwald * 429*cb5466b0SMatthias Ringwald * \param [in] time The delay in us after which a Tx is done 430*cb5466b0SMatthias Ringwald */ 431*cb5466b0SMatthias Ringwald void ( *SetAutoTx )( uint16_t time ); 432*cb5466b0SMatthias Ringwald 433*cb5466b0SMatthias Ringwald /*! 434*cb5466b0SMatthias Ringwald * \brief Stop the chip from automatically sending a packet after the end of a packet reception 435*cb5466b0SMatthias Ringwald * if previously activated with SX1280::SetAutoTx command 436*cb5466b0SMatthias Ringwald * 437*cb5466b0SMatthias Ringwald * \see SX1280::SetAutoTx 438*cb5466b0SMatthias Ringwald */ 439*cb5466b0SMatthias Ringwald void ( *StopAutoTx )(); 440*cb5466b0SMatthias Ringwald /*! 441*cb5466b0SMatthias Ringwald * \brief Sets the chip to automatically receive a packet after the end of a packet transmission 442*cb5466b0SMatthias Ringwald * 443*cb5466b0SMatthias Ringwald * \remark The offset is automatically compensated inside the function 444*cb5466b0SMatthias Ringwald * 445*cb5466b0SMatthias Ringwald * \param [in] time The delay in us after which a Rx is done 446*cb5466b0SMatthias Ringwald */ 447*cb5466b0SMatthias Ringwald void ( *SetAutoFS )( uint8_t enable ); 448*cb5466b0SMatthias Ringwald 449*cb5466b0SMatthias Ringwald /*! 450*cb5466b0SMatthias Ringwald * \brief Enables or disables long preamble detection mode 451*cb5466b0SMatthias Ringwald * 452*cb5466b0SMatthias Ringwald * \param [in] enable [0: Disable, 1: Enable] 453*cb5466b0SMatthias Ringwald */ 454*cb5466b0SMatthias Ringwald void ( *SetLongPreamble )( uint8_t enable ); 455*cb5466b0SMatthias Ringwald 456*cb5466b0SMatthias Ringwald /*! 457*cb5466b0SMatthias Ringwald * \brief Saves the payload to be send in the radio buffer 458*cb5466b0SMatthias Ringwald * 459*cb5466b0SMatthias Ringwald * \param [in] payload A pointer to the payload 460*cb5466b0SMatthias Ringwald * \param [in] size The size of the payload 461*cb5466b0SMatthias Ringwald */ 462*cb5466b0SMatthias Ringwald void ( *SetPayload )( uint8_t *payload, uint8_t size ); 463*cb5466b0SMatthias Ringwald 464*cb5466b0SMatthias Ringwald /*! 465*cb5466b0SMatthias Ringwald * \brief Sets the Sync Word given by index used in GFSK, FLRC and BLE protocols 466*cb5466b0SMatthias Ringwald * 467*cb5466b0SMatthias Ringwald * \remark 5th byte isn't used in FLRC and BLE protocols 468*cb5466b0SMatthias Ringwald * 469*cb5466b0SMatthias Ringwald * \param [in] syncWordIdx Index of SyncWord to be set [1..3] 470*cb5466b0SMatthias Ringwald * \param [in] syncWord SyncWord bytes ( 5 bytes ) 471*cb5466b0SMatthias Ringwald * 472*cb5466b0SMatthias Ringwald * \retval status [0: OK, 1: NOK] 473*cb5466b0SMatthias Ringwald */ 474*cb5466b0SMatthias Ringwald void ( *SetSyncWordErrorTolerance )( uint8_t errorBits ); 475*cb5466b0SMatthias Ringwald 476*cb5466b0SMatthias Ringwald /*! 477*cb5466b0SMatthias Ringwald * \brief Sets the Initial value for the LFSR used for the CRC calculation 478*cb5466b0SMatthias Ringwald * 479*cb5466b0SMatthias Ringwald * \param [in] seed Initial LFSR value ( 4 bytes ) 480*cb5466b0SMatthias Ringwald * 481*cb5466b0SMatthias Ringwald */ 482*cb5466b0SMatthias Ringwald void ( *SetCrcSeed )( uint16_t seed ); 483*cb5466b0SMatthias Ringwald 484*cb5466b0SMatthias Ringwald /*! 485*cb5466b0SMatthias Ringwald * \brief Set the Access Address field of BLE packet 486*cb5466b0SMatthias Ringwald * 487*cb5466b0SMatthias Ringwald * \param [in] accessAddress The access address to be used for next BLE packet sent 488*cb5466b0SMatthias Ringwald * 489*cb5466b0SMatthias Ringwald * \see SX1280::SetBleAdvertizerAccessAddress 490*cb5466b0SMatthias Ringwald */ 491*cb5466b0SMatthias Ringwald void ( *SetBleAccessAddress )( uint32_t accessAddress ); 492*cb5466b0SMatthias Ringwald 493*cb5466b0SMatthias Ringwald /*! 494*cb5466b0SMatthias Ringwald * \brief Set the Access Address for Advertizer BLE packets 495*cb5466b0SMatthias Ringwald * 496*cb5466b0SMatthias Ringwald * All advertizer BLE packets must use a particular value for Access 497*cb5466b0SMatthias Ringwald * Address field. This method sets it. 498*cb5466b0SMatthias Ringwald * 499*cb5466b0SMatthias Ringwald * \see SX1280::SetBleAccessAddress 500*cb5466b0SMatthias Ringwald */ 501*cb5466b0SMatthias Ringwald void ( *SetBleAdvertizerAccessAddress )( void ); 502*cb5466b0SMatthias Ringwald 503*cb5466b0SMatthias Ringwald 504*cb5466b0SMatthias Ringwald /*! 505*cb5466b0SMatthias Ringwald * \brief Sets the seed used for the CRC calculation 506*cb5466b0SMatthias Ringwald * 507*cb5466b0SMatthias Ringwald * \param [in] seed The seed value 508*cb5466b0SMatthias Ringwald * 509*cb5466b0SMatthias Ringwald */ 510*cb5466b0SMatthias Ringwald void ( *SetCrcPolynomial )( uint16_t seed ); 511*cb5466b0SMatthias Ringwald 512*cb5466b0SMatthias Ringwald /*! 513*cb5466b0SMatthias Ringwald * \brief Sets the Initial value of the LFSR used for the whitening in GFSK, FLRC and BLE protocols 514*cb5466b0SMatthias Ringwald * 515*cb5466b0SMatthias Ringwald * \param [in] seed Initial LFSR value 516*cb5466b0SMatthias Ringwald */ 517*cb5466b0SMatthias Ringwald void ( *SetWhiteningSeed )( uint8_t seed ); 518*cb5466b0SMatthias Ringwald 519*cb5466b0SMatthias Ringwald /*! 520*cb5466b0SMatthias Ringwald * \brief Enable manual gain and disable AGC 521*cb5466b0SMatthias Ringwald * 522*cb5466b0SMatthias Ringwald * \see SetManualGainValue, DisableManualGain 523*cb5466b0SMatthias Ringwald */ 524*cb5466b0SMatthias Ringwald void ( *EnableManualGain )( void ); 525*cb5466b0SMatthias Ringwald 526*cb5466b0SMatthias Ringwald /*! 527*cb5466b0SMatthias Ringwald * \brief Disable the manual gain control and enable AGC 528*cb5466b0SMatthias Ringwald * 529*cb5466b0SMatthias Ringwald * \see EnableManualGain 530*cb5466b0SMatthias Ringwald */ 531*cb5466b0SMatthias Ringwald void ( *DisableManualGain )( void ); 532*cb5466b0SMatthias Ringwald 533*cb5466b0SMatthias Ringwald /*! 534*cb5466b0SMatthias Ringwald * \brief Set the gain for LNA 535*cb5466b0SMatthias Ringwald * 536*cb5466b0SMatthias Ringwald * EnableManualGain must be call before using this function 537*cb5466b0SMatthias Ringwald * 538*cb5466b0SMatthias Ringwald * \param [in] gain The value of gain to set, refer to datasheet for value meaning 539*cb5466b0SMatthias Ringwald * 540*cb5466b0SMatthias Ringwald * \see EnableManualGain, DisableManualGain 541*cb5466b0SMatthias Ringwald */ 542*cb5466b0SMatthias Ringwald void ( *SetManualGainValue )( uint8_t gain ); 543*cb5466b0SMatthias Ringwald 544*cb5466b0SMatthias Ringwald /*! 545*cb5466b0SMatthias Ringwald * \brief Configure the LNA regime of operation 546*cb5466b0SMatthias Ringwald * 547*cb5466b0SMatthias Ringwald * \param [in] lnaSetting The LNA setting. Possible values are 548*cb5466b0SMatthias Ringwald * LNA_LOW_POWER_MODE and 549*cb5466b0SMatthias Ringwald * LNA_HIGH_SENSITIVITY_MODE 550*cb5466b0SMatthias Ringwald */ 551*cb5466b0SMatthias Ringwald void ( *SetLNAGainSetting )( RadioLnaSettings_t lnaSetting ); 552*cb5466b0SMatthias Ringwald 553*cb5466b0SMatthias Ringwald /*! 554*cb5466b0SMatthias Ringwald * \brief Sets the number of bits used to check that ranging request match ranging ID 555*cb5466b0SMatthias Ringwald * 556*cb5466b0SMatthias Ringwald * \param [in] length [0: 8 bits, 1: 16 bits, 557*cb5466b0SMatthias Ringwald * 2: 24 bits, 3: 32 bits] 558*cb5466b0SMatthias Ringwald */ 559*cb5466b0SMatthias Ringwald void ( *SetRangingIdLength )( RadioRangingIdCheckLengths_t length ); 560*cb5466b0SMatthias Ringwald 561*cb5466b0SMatthias Ringwald /*! 562*cb5466b0SMatthias Ringwald * \brief Sets ranging device id 563*cb5466b0SMatthias Ringwald * 564*cb5466b0SMatthias Ringwald * \param [in] address Device address 565*cb5466b0SMatthias Ringwald */ 566*cb5466b0SMatthias Ringwald void ( *SetDeviceRangingAddress )( uint32_t address ); 567*cb5466b0SMatthias Ringwald 568*cb5466b0SMatthias Ringwald /*! 569*cb5466b0SMatthias Ringwald * \brief Sets the device id to ping in a ranging request 570*cb5466b0SMatthias Ringwald * 571*cb5466b0SMatthias Ringwald * \param [in] address Address of the device to ping 572*cb5466b0SMatthias Ringwald */ 573*cb5466b0SMatthias Ringwald void ( *SetRangingRequestAddress )( uint32_t address ); 574*cb5466b0SMatthias Ringwald 575*cb5466b0SMatthias Ringwald /*! 576*cb5466b0SMatthias Ringwald * \brief Return the ranging result value 577*cb5466b0SMatthias Ringwald * 578*cb5466b0SMatthias Ringwald * \param [in] resultType Specifies the type of result. 579*cb5466b0SMatthias Ringwald * [0: RAW, 1: Averaged, 580*cb5466b0SMatthias Ringwald * 2: De-biased, 3:Filtered] 581*cb5466b0SMatthias Ringwald * 582*cb5466b0SMatthias Ringwald * \retval ranging The ranging measure filtered according to resultType [m] 583*cb5466b0SMatthias Ringwald */ 584*cb5466b0SMatthias Ringwald double ( *GetRangingResult )( RadioRangingResultTypes_t resultType ); 585*cb5466b0SMatthias Ringwald 586*cb5466b0SMatthias Ringwald /*! 587*cb5466b0SMatthias Ringwald * \brief Sets the standard processing delay between Master and Slave 588*cb5466b0SMatthias Ringwald * 589*cb5466b0SMatthias Ringwald * \param [in] cal RxTx delay offset for correcting ranging bias. 590*cb5466b0SMatthias Ringwald * 591*cb5466b0SMatthias Ringwald * The calibration value reflects the group delay of the radio front end and 592*cb5466b0SMatthias Ringwald * must be re-performed for each new SX1280 PCB design. The value is obtained 593*cb5466b0SMatthias Ringwald * empirically by either conducted measurement in a known electrical length 594*cb5466b0SMatthias Ringwald * coaxial RF cable (where the design is connectorised) or by radiated 595*cb5466b0SMatthias Ringwald * measurement, at a known distance, where an antenna is present. 596*cb5466b0SMatthias Ringwald * The result of the calibration process is that the SX1280 ranging result 597*cb5466b0SMatthias Ringwald * accurately reflects the physical range, the calibration procedure therefore 598*cb5466b0SMatthias Ringwald * removes the average timing error from the time-of-flight measurement for a 599*cb5466b0SMatthias Ringwald * given design. 600*cb5466b0SMatthias Ringwald * 601*cb5466b0SMatthias Ringwald * The values are Spreading Factor dependents, and depend also of the board 602*cb5466b0SMatthias Ringwald * design. Some typical values are provided in the next table. 603*cb5466b0SMatthias Ringwald * 604*cb5466b0SMatthias Ringwald * Spreading Factor | Calibration Value 605*cb5466b0SMatthias Ringwald * ---------------- | ----------------- 606*cb5466b0SMatthias Ringwald * SF5 | 12200 607*cb5466b0SMatthias Ringwald * SF6 | 12200 608*cb5466b0SMatthias Ringwald * SF7 | 12400 609*cb5466b0SMatthias Ringwald * SF8 | 12650 610*cb5466b0SMatthias Ringwald * SF9 | 12940 611*cb5466b0SMatthias Ringwald * SF10 | 13000 612*cb5466b0SMatthias Ringwald * SF11 | 13060 613*cb5466b0SMatthias Ringwald * SF12 | 13120 614*cb5466b0SMatthias Ringwald */ 615*cb5466b0SMatthias Ringwald void ( *SetRangingCalibration )( uint16_t cal ); 616*cb5466b0SMatthias Ringwald 617*cb5466b0SMatthias Ringwald /*! 618*cb5466b0SMatthias Ringwald * \brief Return the last ranging result power indicator 619*cb5466b0SMatthias Ringwald * 620*cb5466b0SMatthias Ringwald * The value returned is not an absolute power measurement. It is 621*cb5466b0SMatthias Ringwald * a relative power measurement. 622*cb5466b0SMatthias Ringwald * 623*cb5466b0SMatthias Ringwald * \retval deltaThreshold A relative power indicator 624*cb5466b0SMatthias Ringwald */ 625*cb5466b0SMatthias Ringwald uint8_t ( *GetRangingPowerDeltaThresholdIndicator)( void ); 626*cb5466b0SMatthias Ringwald 627*cb5466b0SMatthias Ringwald /*! 628*cb5466b0SMatthias Ringwald * \brief Clears the ranging filter 629*cb5466b0SMatthias Ringwald */ 630*cb5466b0SMatthias Ringwald void ( *RangingClearFilterResult )( void ); 631*cb5466b0SMatthias Ringwald 632*cb5466b0SMatthias Ringwald /*! 633*cb5466b0SMatthias Ringwald * \brief Set the number of samples considered in the built-in filter 634*cb5466b0SMatthias Ringwald * 635*cb5466b0SMatthias Ringwald * \param [in] numSample The number of samples to use built-in filter 636*cb5466b0SMatthias Ringwald * [8..255] 637*cb5466b0SMatthias Ringwald * 638*cb5466b0SMatthias Ringwald * \remark Value inferior to 8 will be silently set to 8 639*cb5466b0SMatthias Ringwald */ 640*cb5466b0SMatthias Ringwald void ( *RangingSetFilterNumSamples )( uint8_t numSample ); 641*cb5466b0SMatthias Ringwald 642*cb5466b0SMatthias Ringwald /*! 643*cb5466b0SMatthias Ringwald * \brief Return the Estimated Frequency Error in LORA and RANGING operations 644*cb5466b0SMatthias Ringwald * 645*cb5466b0SMatthias Ringwald * \retval efe The estimated frequency error [Hz] 646*cb5466b0SMatthias Ringwald */ 647*cb5466b0SMatthias Ringwald double ( *GetFrequencyError )( void ); 648*cb5466b0SMatthias Ringwald }; 649*cb5466b0SMatthias Ringwald 650*cb5466b0SMatthias Ringwald /*! 651*cb5466b0SMatthias Ringwald * \brief Radio driver 652*cb5466b0SMatthias Ringwald * 653*cb5466b0SMatthias Ringwald * \remark This variable is defined and initialized in the specific radio 654*cb5466b0SMatthias Ringwald * board implementation 655*cb5466b0SMatthias Ringwald */ 656*cb5466b0SMatthias Ringwald extern const struct Radio_s Radio; 657*cb5466b0SMatthias Ringwald 658*cb5466b0SMatthias Ringwald #endif // __RADIO_H__ 659