SX1261 and sx1262 common library

Dependents:   SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more

Fork of SX126xLib by Gregory Cristian

Committer:
GregCr
Date:
Wed Jul 18 13:33:42 2018 +0000
Revision:
6:1e2345700991
Parent:
4:c6ef863d0b07
added support for sx1268

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:deaafdfde3bb 1 /*
GregCr 4:c6ef863d0b07 2 ______ _
GregCr 0:deaafdfde3bb 3 / _____) _ | |
GregCr 0:deaafdfde3bb 4 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:deaafdfde3bb 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:deaafdfde3bb 6 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:deaafdfde3bb 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
GregCr 0:deaafdfde3bb 8 (C)2016 Semtech
GregCr 0:deaafdfde3bb 9
GregCr 0:deaafdfde3bb 10 Description: Handling of the node configuration protocol
GregCr 0:deaafdfde3bb 11
GregCr 0:deaafdfde3bb 12 License: Revised BSD License, see LICENSE.TXT file include in the project
GregCr 0:deaafdfde3bb 13
GregCr 0:deaafdfde3bb 14 Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy
GregCr 0:deaafdfde3bb 15 */
GregCr 0:deaafdfde3bb 16 #ifndef __RADIO_H__
GregCr 0:deaafdfde3bb 17 #define __RADIO_H__
GregCr 0:deaafdfde3bb 18
GregCr 0:deaafdfde3bb 19 #include "mbed.h"
GregCr 0:deaafdfde3bb 20
GregCr 0:deaafdfde3bb 21 /*!
GregCr 0:deaafdfde3bb 22 * \brief Structure describing the radio status
GregCr 0:deaafdfde3bb 23 */
GregCr 0:deaafdfde3bb 24 typedef union RadioStatus_u
GregCr 0:deaafdfde3bb 25 {
GregCr 0:deaafdfde3bb 26 uint8_t Value;
GregCr 0:deaafdfde3bb 27 struct
GregCr 0:deaafdfde3bb 28 { //bit order is lsb -> msb
GregCr 0:deaafdfde3bb 29 uint8_t Reserved : 1; //!< Reserved
GregCr 0:deaafdfde3bb 30 uint8_t CmdStatus : 3; //!< Command status
GregCr 0:deaafdfde3bb 31 uint8_t ChipMode : 3; //!< Chip mode
GregCr 0:deaafdfde3bb 32 uint8_t CpuBusy : 1; //!< Flag for CPU radio busy
GregCr 0:deaafdfde3bb 33 }Fields;
GregCr 0:deaafdfde3bb 34 }RadioStatus_t;
GregCr 0:deaafdfde3bb 35
GregCr 0:deaafdfde3bb 36 /*!
GregCr 0:deaafdfde3bb 37 * \brief Structure describing the error codes for callback functions
GregCr 0:deaafdfde3bb 38 */
GregCr 4:c6ef863d0b07 39 typedef enum
GregCr 0:deaafdfde3bb 40 {
GregCr 4:c6ef863d0b07 41 IRQ_HEADER_ERROR_CODE = 0x01,
GregCr 4:c6ef863d0b07 42 IRQ_SYNCWORD_ERROR_CODE = 0x02,
GregCr 4:c6ef863d0b07 43 IRQ_CRC_ERROR_CODE = 0x04,
GregCr 4:c6ef863d0b07 44 }IrqErrorCode_t;
GregCr 0:deaafdfde3bb 45
GregCr 0:deaafdfde3bb 46
GregCr 0:deaafdfde3bb 47 enum IrqPblSyncHeaderCode_t
GregCr 0:deaafdfde3bb 48 {
GregCr 4:c6ef863d0b07 49 IRQ_PBL_DETECT_CODE = 0x01,
GregCr 4:c6ef863d0b07 50 IRQ_SYNCWORD_VALID_CODE = 0x02,
GregCr 4:c6ef863d0b07 51 IRQ_HEADER_VALID_CODE = 0x04,
GregCr 3:7e3595a9ebe0 52 };
GregCr 3:7e3595a9ebe0 53
GregCr 3:7e3595a9ebe0 54 enum IrqTimeoutCode_t
GregCr 3:7e3595a9ebe0 55 {
GregCr 4:c6ef863d0b07 56 IRQ_RX_TIMEOUT = 0x00,
GregCr 4:c6ef863d0b07 57 IRQ_TX_TIMEOUT = 0x01,
GregCr 4:c6ef863d0b07 58 IRQ_XYZ = 0xFF,
GregCr 0:deaafdfde3bb 59 };
GregCr 0:deaafdfde3bb 60
GregCr 0:deaafdfde3bb 61 /*!
GregCr 0:deaafdfde3bb 62 * \brief The radio command opcodes
GregCr 0:deaafdfde3bb 63 */
GregCr 4:c6ef863d0b07 64 typedef enum RadioCommands_e RadioCommands_t;
GregCr 4:c6ef863d0b07 65
GregCr 4:c6ef863d0b07 66 /*!
GregCr 4:c6ef863d0b07 67 * \brief The radio callbacks structure
GregCr 4:c6ef863d0b07 68 * Holds function pointers to be called on radio interrupts
GregCr 4:c6ef863d0b07 69 */
GregCr 4:c6ef863d0b07 70 typedef struct
GregCr 4:c6ef863d0b07 71 {
GregCr 4:c6ef863d0b07 72 void ( *txDone )( void ); //!< Pointer to a function run on successful transmission
GregCr 4:c6ef863d0b07 73 void ( *rxDone )( void ); //!< Pointer to a function run on successful reception
GregCr 4:c6ef863d0b07 74 void ( *rxPreambleDetect )( void ); //!< Pointer to a function run on successful Preamble detection
GregCr 4:c6ef863d0b07 75 void ( *rxSyncWordDone )( void ); //!< Pointer to a function run on successful SyncWord reception
GregCr 4:c6ef863d0b07 76 void ( *rxHeaderDone )( void ); //!< Pointer to a function run on successful Header reception
GregCr 4:c6ef863d0b07 77 void ( *txTimeout )( void ); //!< Pointer to a function run on transmission timeout
GregCr 4:c6ef863d0b07 78 void ( *rxTimeout )( void ); //!< Pointer to a function run on reception timeout
GregCr 4:c6ef863d0b07 79 void ( *rxError )( IrqErrorCode_t errCode ); //!< Pointer to a function run on reception error
GregCr 4:c6ef863d0b07 80 void ( *cadDone )( bool cadFlag ); //!< Pointer to a function run on channel activity detected
GregCr 4:c6ef863d0b07 81 }RadioCallbacks_t;
GregCr 0:deaafdfde3bb 82
GregCr 0:deaafdfde3bb 83 /*!
GregCr 0:deaafdfde3bb 84 * \brief Class holding the basic communications with a radio
GregCr 0:deaafdfde3bb 85 *
GregCr 0:deaafdfde3bb 86 * It sets the functions to read/write registers, send commands and read/write
GregCr 0:deaafdfde3bb 87 * payload.
GregCr 0:deaafdfde3bb 88 * It also provides functions to run callback functions depending on the
GregCr 0:deaafdfde3bb 89 * interrupts generated from the radio.
GregCr 0:deaafdfde3bb 90 */
GregCr 0:deaafdfde3bb 91 class Radio
GregCr 0:deaafdfde3bb 92 {
GregCr 0:deaafdfde3bb 93 protected:
GregCr 0:deaafdfde3bb 94 /*!
GregCr 0:deaafdfde3bb 95 * \brief Callback on Tx done interrupt
GregCr 0:deaafdfde3bb 96 */
GregCr 4:c6ef863d0b07 97 void ( *txDone )( void );
GregCr 0:deaafdfde3bb 98
GregCr 0:deaafdfde3bb 99 /*!
GregCr 0:deaafdfde3bb 100 * \brief Callback on Rx done interrupt
GregCr 0:deaafdfde3bb 101 */
GregCr 4:c6ef863d0b07 102 void ( *rxDone )( void );
GregCr 4:c6ef863d0b07 103
GregCr 4:c6ef863d0b07 104 /*!
GregCr 4:c6ef863d0b07 105 * \brief Callback on Rx preamble detection interrupt
GregCr 4:c6ef863d0b07 106 */
GregCr 4:c6ef863d0b07 107 void ( *rxPreambleDetect )( void );
GregCr 4:c6ef863d0b07 108
GregCr 4:c6ef863d0b07 109 /*!
GregCr 4:c6ef863d0b07 110 * \brief Callback on Rx SyncWord interrupt
GregCr 4:c6ef863d0b07 111 */
GregCr 4:c6ef863d0b07 112 void ( *rxSyncWordDone )( void );
GregCr 0:deaafdfde3bb 113
GregCr 0:deaafdfde3bb 114 /*!
GregCr 4:c6ef863d0b07 115 * \brief Callback on Rx header received interrupt
GregCr 0:deaafdfde3bb 116 */
GregCr 4:c6ef863d0b07 117 void ( *rxHeaderDone )( void );
GregCr 0:deaafdfde3bb 118
GregCr 0:deaafdfde3bb 119 /*!
GregCr 4:c6ef863d0b07 120 * \brief Callback on Tx timeout interrupt
GregCr 0:deaafdfde3bb 121 */
GregCr 4:c6ef863d0b07 122 void ( *txTimeout )( void );
GregCr 4:c6ef863d0b07 123
GregCr 4:c6ef863d0b07 124 /*!
GregCr 4:c6ef863d0b07 125 * \brief Callback on Rx timeout interrupt
GregCr 4:c6ef863d0b07 126 */
GregCr 4:c6ef863d0b07 127 void ( *rxTimeout )( void );
GregCr 0:deaafdfde3bb 128
GregCr 0:deaafdfde3bb 129 /*!
GregCr 0:deaafdfde3bb 130 * \brief Callback on Rx error interrupt
GregCr 0:deaafdfde3bb 131 *
GregCr 4:c6ef863d0b07 132 * \param [out] errCode A code indicating the type of interrupt (SyncWord error or CRC error)
GregCr 0:deaafdfde3bb 133 */
GregCr 0:deaafdfde3bb 134 void ( *rxError )( IrqErrorCode_t errCode );
GregCr 0:deaafdfde3bb 135
GregCr 0:deaafdfde3bb 136 /*!
GregCr 0:deaafdfde3bb 137 * \brief Callback on Channel Activity Detection done interrupt
GregCr 0:deaafdfde3bb 138 *
GregCr 0:deaafdfde3bb 139 * \param [out] cadFlag Flag for channel activity detected or not
GregCr 0:deaafdfde3bb 140 */
GregCr 0:deaafdfde3bb 141 void ( *cadDone )( bool cadFlag );
GregCr 0:deaafdfde3bb 142
GregCr 0:deaafdfde3bb 143 public:
GregCr 0:deaafdfde3bb 144 /*!
GregCr 0:deaafdfde3bb 145 * \brief Constructor for radio class
GregCr 4:c6ef863d0b07 146 * Sets the callbacks functions pointers
GregCr 0:deaafdfde3bb 147 *
GregCr 4:c6ef863d0b07 148 * \param [in] callbacks The structure of callbacks function pointers
GregCr 4:c6ef863d0b07 149 * to be called on radio interrupts
GregCr 4:c6ef863d0b07 150 *
GregCr 0:deaafdfde3bb 151 */
GregCr 4:c6ef863d0b07 152 Radio( RadioCallbacks_t *callbacks )
GregCr 0:deaafdfde3bb 153 {
GregCr 4:c6ef863d0b07 154 this->txDone = callbacks->txDone;
GregCr 4:c6ef863d0b07 155 this->rxDone = callbacks->rxDone;
GregCr 4:c6ef863d0b07 156 this->rxPreambleDetect = callbacks->rxPreambleDetect;
GregCr 4:c6ef863d0b07 157 this->rxSyncWordDone = callbacks->rxSyncWordDone;
GregCr 4:c6ef863d0b07 158 this->rxHeaderDone = callbacks->rxHeaderDone;
GregCr 4:c6ef863d0b07 159 this->txTimeout = callbacks->txTimeout;
GregCr 4:c6ef863d0b07 160 this->rxTimeout = callbacks->rxTimeout;
GregCr 4:c6ef863d0b07 161 this->rxError = callbacks->rxError;
GregCr 4:c6ef863d0b07 162 this->cadDone = callbacks->cadDone;
GregCr 0:deaafdfde3bb 163 }
GregCr 4:c6ef863d0b07 164 virtual ~Radio( void ){ };
GregCr 0:deaafdfde3bb 165
GregCr 0:deaafdfde3bb 166 /*!
GregCr 0:deaafdfde3bb 167 * \brief Resets the radio
GregCr 0:deaafdfde3bb 168 */
GregCr 0:deaafdfde3bb 169 virtual void Reset( void ) = 0;
GregCr 0:deaafdfde3bb 170
GregCr 0:deaafdfde3bb 171 /*!
GregCr 0:deaafdfde3bb 172 * \brief Gets the current radio status
GregCr 0:deaafdfde3bb 173 *
GregCr 0:deaafdfde3bb 174 * \retval status Radio status
GregCr 0:deaafdfde3bb 175 */
GregCr 0:deaafdfde3bb 176 virtual RadioStatus_t GetStatus( void ) = 0;
GregCr 0:deaafdfde3bb 177
GregCr 0:deaafdfde3bb 178 /*!
GregCr 0:deaafdfde3bb 179 * \brief Writes the given command to the radio
GregCr 0:deaafdfde3bb 180 *
GregCr 0:deaafdfde3bb 181 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 182 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 183 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 184 */
GregCr 0:deaafdfde3bb 185 virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 186
GregCr 0:deaafdfde3bb 187 /*!
GregCr 0:deaafdfde3bb 188 * \brief Reads the given command from the radio
GregCr 0:deaafdfde3bb 189 *
GregCr 0:deaafdfde3bb 190 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 191 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 192 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 193 */
GregCr 0:deaafdfde3bb 194 virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 195
GregCr 0:deaafdfde3bb 196 /*!
GregCr 0:deaafdfde3bb 197 * \brief Writes multiple radio registers starting at address
GregCr 0:deaafdfde3bb 198 *
GregCr 0:deaafdfde3bb 199 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 200 * \param [in] buffer Buffer containing the new register's values
GregCr 0:deaafdfde3bb 201 * \param [in] size Number of registers to be written
GregCr 0:deaafdfde3bb 202 */
GregCr 0:deaafdfde3bb 203 virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 204
GregCr 0:deaafdfde3bb 205 /*!
GregCr 0:deaafdfde3bb 206 * \brief Writes the radio register at the specified address
GregCr 0:deaafdfde3bb 207 *
GregCr 0:deaafdfde3bb 208 * \param [in] address Register address
GregCr 0:deaafdfde3bb 209 * \param [in] value New register value
GregCr 0:deaafdfde3bb 210 */
GregCr 4:c6ef863d0b07 211 virtual void WriteReg( uint16_t address, uint8_t value ) = 0;
GregCr 0:deaafdfde3bb 212
GregCr 0:deaafdfde3bb 213 /*!
GregCr 0:deaafdfde3bb 214 * \brief Reads multiple radio registers starting at address
GregCr 0:deaafdfde3bb 215 *
GregCr 0:deaafdfde3bb 216 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 217 * \param [out] buffer Buffer where to copy the registers data
GregCr 0:deaafdfde3bb 218 * \param [in] size Number of registers to be read
GregCr 0:deaafdfde3bb 219 */
GregCr 0:deaafdfde3bb 220 virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 221
GregCr 0:deaafdfde3bb 222 /*!
GregCr 0:deaafdfde3bb 223 * \brief Reads the radio register at the specified address
GregCr 0:deaafdfde3bb 224 *
GregCr 0:deaafdfde3bb 225 * \param [in] address Register address
GregCr 0:deaafdfde3bb 226 *
GregCr 0:deaafdfde3bb 227 * \retval value The register value
GregCr 0:deaafdfde3bb 228 */
GregCr 4:c6ef863d0b07 229 virtual uint8_t ReadReg( uint16_t address ) = 0;
GregCr 0:deaafdfde3bb 230
GregCr 0:deaafdfde3bb 231 /*!
GregCr 0:deaafdfde3bb 232 * \brief Writes Radio Data Buffer with buffer of size starting at offset.
GregCr 0:deaafdfde3bb 233 *
GregCr 0:deaafdfde3bb 234 * \param [in] offset Offset where to start writing
GregCr 0:deaafdfde3bb 235 * \param [in] buffer Buffer pointer
GregCr 0:deaafdfde3bb 236 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 237 */
GregCr 0:deaafdfde3bb 238 virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 239
GregCr 0:deaafdfde3bb 240 /*!
GregCr 0:deaafdfde3bb 241 * \brief Reads Radio Data Buffer at offset to buffer of size
GregCr 0:deaafdfde3bb 242 *
GregCr 0:deaafdfde3bb 243 * \param [in] offset Offset where to start reading
GregCr 0:deaafdfde3bb 244 * \param [out] buffer Buffer pointer
GregCr 0:deaafdfde3bb 245 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 246 */
GregCr 0:deaafdfde3bb 247 virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 248 };
GregCr 0:deaafdfde3bb 249
GregCr 0:deaafdfde3bb 250 #endif // __RADIO_H__
GregCr 0:deaafdfde3bb 251