Driver for the SX1280 RF Transceiver

Dependents:   SX1280PingPong RangignMaster RangingSlave MSNV2-Terminal_V1-6 ... more

Committer:
GregCr
Date:
Mon Mar 13 14:16:00 2017 +0000
Revision:
0:03ec2f3bde8c
Child:
11:d60df50e108f
alpha version

Who changed what in which revision?

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