local for mbed5

Committer:
lo
Date:
Thu Feb 11 19:17:06 2021 +0000
Revision:
7:7d021a81fe46
Parent:
4:c6ef863d0b07
initial

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 */
lo 7:7d021a81fe46 64 //typedef enum RadioCommands_e RadioCommands_t;
lo 7:7d021a81fe46 65 typedef enum RadioCommands_e
lo 7:7d021a81fe46 66 {
lo 7:7d021a81fe46 67 RADIO_GET_STATUS = 0xC0,
lo 7:7d021a81fe46 68 RADIO_WRITE_REGISTER = 0x0D,
lo 7:7d021a81fe46 69 RADIO_READ_REGISTER = 0x1D,
lo 7:7d021a81fe46 70 RADIO_WRITE_BUFFER = 0x0E,
lo 7:7d021a81fe46 71 RADIO_READ_BUFFER = 0x1E,
lo 7:7d021a81fe46 72 RADIO_SET_SLEEP = 0x84,
lo 7:7d021a81fe46 73 RADIO_SET_STANDBY = 0x80,
lo 7:7d021a81fe46 74 RADIO_SET_FS = 0xC1,
lo 7:7d021a81fe46 75 RADIO_SET_TX = 0x83,
lo 7:7d021a81fe46 76 RADIO_SET_RX = 0x82,
lo 7:7d021a81fe46 77 RADIO_SET_RXDUTYCYCLE = 0x94,
lo 7:7d021a81fe46 78 RADIO_SET_CAD = 0xC5,
lo 7:7d021a81fe46 79 RADIO_SET_TXCONTINUOUSWAVE = 0xD1,
lo 7:7d021a81fe46 80 RADIO_SET_TXCONTINUOUSPREAMBLE = 0xD2,
lo 7:7d021a81fe46 81 RADIO_SET_PACKETTYPE = 0x8A,
lo 7:7d021a81fe46 82 RADIO_GET_PACKETTYPE = 0x11,
lo 7:7d021a81fe46 83 RADIO_SET_RFFREQUENCY = 0x86,
lo 7:7d021a81fe46 84 RADIO_SET_TXPARAMS = 0x8E,
lo 7:7d021a81fe46 85 RADIO_SET_PACONFIG = 0x95,
lo 7:7d021a81fe46 86 RADIO_SET_CADPARAMS = 0x88,
lo 7:7d021a81fe46 87 RADIO_SET_BUFFERBASEADDRESS = 0x8F,
lo 7:7d021a81fe46 88 RADIO_SET_MODULATIONPARAMS = 0x8B,
lo 7:7d021a81fe46 89 RADIO_SET_PACKETPARAMS = 0x8C,
lo 7:7d021a81fe46 90 RADIO_GET_RXBUFFERSTATUS = 0x13,
lo 7:7d021a81fe46 91 RADIO_GET_PACKETSTATUS = 0x14,
lo 7:7d021a81fe46 92 RADIO_GET_RSSIINST = 0x15,
lo 7:7d021a81fe46 93 RADIO_GET_STATS = 0x10,
lo 7:7d021a81fe46 94 RADIO_RESET_STATS = 0x00,
lo 7:7d021a81fe46 95 RADIO_CFG_DIOIRQ = 0x08,
lo 7:7d021a81fe46 96 RADIO_GET_IRQSTATUS = 0x12,
lo 7:7d021a81fe46 97 RADIO_CLR_IRQSTATUS = 0x02,
lo 7:7d021a81fe46 98 RADIO_CALIBRATE = 0x89,
lo 7:7d021a81fe46 99 RADIO_CALIBRATEIMAGE = 0x98,
lo 7:7d021a81fe46 100 RADIO_SET_REGULATORMODE = 0x96,
lo 7:7d021a81fe46 101 RADIO_GET_ERROR = 0x17,
lo 7:7d021a81fe46 102 RADIO_SET_TCXOMODE = 0x97,
lo 7:7d021a81fe46 103 RADIO_SET_TXFALLBACKMODE = 0x93,
lo 7:7d021a81fe46 104 RADIO_SET_RFSWITCHMODE = 0x9D,
lo 7:7d021a81fe46 105 RADIO_SET_STOPRXTIMERONPREAMBLE = 0x9F,
lo 7:7d021a81fe46 106 RADIO_SET_LORASYMBTIMEOUT = 0xA0,
lo 7:7d021a81fe46 107 }RadioCommands_t;
GregCr 4:c6ef863d0b07 108 /*!
GregCr 4:c6ef863d0b07 109 * \brief The radio callbacks structure
GregCr 4:c6ef863d0b07 110 * Holds function pointers to be called on radio interrupts
GregCr 4:c6ef863d0b07 111 */
GregCr 4:c6ef863d0b07 112 typedef struct
GregCr 4:c6ef863d0b07 113 {
GregCr 4:c6ef863d0b07 114 void ( *txDone )( void ); //!< Pointer to a function run on successful transmission
GregCr 4:c6ef863d0b07 115 void ( *rxDone )( void ); //!< Pointer to a function run on successful reception
GregCr 4:c6ef863d0b07 116 void ( *rxPreambleDetect )( void ); //!< Pointer to a function run on successful Preamble detection
GregCr 4:c6ef863d0b07 117 void ( *rxSyncWordDone )( void ); //!< Pointer to a function run on successful SyncWord reception
GregCr 4:c6ef863d0b07 118 void ( *rxHeaderDone )( void ); //!< Pointer to a function run on successful Header reception
GregCr 4:c6ef863d0b07 119 void ( *txTimeout )( void ); //!< Pointer to a function run on transmission timeout
GregCr 4:c6ef863d0b07 120 void ( *rxTimeout )( void ); //!< Pointer to a function run on reception timeout
GregCr 4:c6ef863d0b07 121 void ( *rxError )( IrqErrorCode_t errCode ); //!< Pointer to a function run on reception error
GregCr 4:c6ef863d0b07 122 void ( *cadDone )( bool cadFlag ); //!< Pointer to a function run on channel activity detected
GregCr 4:c6ef863d0b07 123 }RadioCallbacks_t;
GregCr 0:deaafdfde3bb 124
GregCr 0:deaafdfde3bb 125 /*!
GregCr 0:deaafdfde3bb 126 * \brief Class holding the basic communications with a radio
GregCr 0:deaafdfde3bb 127 *
GregCr 0:deaafdfde3bb 128 * It sets the functions to read/write registers, send commands and read/write
GregCr 0:deaafdfde3bb 129 * payload.
GregCr 0:deaafdfde3bb 130 * It also provides functions to run callback functions depending on the
GregCr 0:deaafdfde3bb 131 * interrupts generated from the radio.
GregCr 0:deaafdfde3bb 132 */
GregCr 0:deaafdfde3bb 133 class Radio
GregCr 0:deaafdfde3bb 134 {
GregCr 0:deaafdfde3bb 135 protected:
GregCr 0:deaafdfde3bb 136 /*!
GregCr 0:deaafdfde3bb 137 * \brief Callback on Tx done interrupt
GregCr 0:deaafdfde3bb 138 */
GregCr 4:c6ef863d0b07 139 void ( *txDone )( void );
GregCr 0:deaafdfde3bb 140
GregCr 0:deaafdfde3bb 141 /*!
GregCr 0:deaafdfde3bb 142 * \brief Callback on Rx done interrupt
GregCr 0:deaafdfde3bb 143 */
GregCr 4:c6ef863d0b07 144 void ( *rxDone )( void );
GregCr 4:c6ef863d0b07 145
GregCr 4:c6ef863d0b07 146 /*!
GregCr 4:c6ef863d0b07 147 * \brief Callback on Rx preamble detection interrupt
GregCr 4:c6ef863d0b07 148 */
GregCr 4:c6ef863d0b07 149 void ( *rxPreambleDetect )( void );
GregCr 4:c6ef863d0b07 150
GregCr 4:c6ef863d0b07 151 /*!
GregCr 4:c6ef863d0b07 152 * \brief Callback on Rx SyncWord interrupt
GregCr 4:c6ef863d0b07 153 */
GregCr 4:c6ef863d0b07 154 void ( *rxSyncWordDone )( void );
GregCr 0:deaafdfde3bb 155
GregCr 0:deaafdfde3bb 156 /*!
GregCr 4:c6ef863d0b07 157 * \brief Callback on Rx header received interrupt
GregCr 0:deaafdfde3bb 158 */
GregCr 4:c6ef863d0b07 159 void ( *rxHeaderDone )( void );
GregCr 0:deaafdfde3bb 160
GregCr 0:deaafdfde3bb 161 /*!
GregCr 4:c6ef863d0b07 162 * \brief Callback on Tx timeout interrupt
GregCr 0:deaafdfde3bb 163 */
GregCr 4:c6ef863d0b07 164 void ( *txTimeout )( void );
GregCr 4:c6ef863d0b07 165
GregCr 4:c6ef863d0b07 166 /*!
GregCr 4:c6ef863d0b07 167 * \brief Callback on Rx timeout interrupt
GregCr 4:c6ef863d0b07 168 */
GregCr 4:c6ef863d0b07 169 void ( *rxTimeout )( void );
GregCr 0:deaafdfde3bb 170
GregCr 0:deaafdfde3bb 171 /*!
GregCr 0:deaafdfde3bb 172 * \brief Callback on Rx error interrupt
GregCr 0:deaafdfde3bb 173 *
GregCr 4:c6ef863d0b07 174 * \param [out] errCode A code indicating the type of interrupt (SyncWord error or CRC error)
GregCr 0:deaafdfde3bb 175 */
GregCr 0:deaafdfde3bb 176 void ( *rxError )( IrqErrorCode_t errCode );
GregCr 0:deaafdfde3bb 177
GregCr 0:deaafdfde3bb 178 /*!
GregCr 0:deaafdfde3bb 179 * \brief Callback on Channel Activity Detection done interrupt
GregCr 0:deaafdfde3bb 180 *
GregCr 0:deaafdfde3bb 181 * \param [out] cadFlag Flag for channel activity detected or not
GregCr 0:deaafdfde3bb 182 */
GregCr 0:deaafdfde3bb 183 void ( *cadDone )( bool cadFlag );
GregCr 0:deaafdfde3bb 184
GregCr 0:deaafdfde3bb 185 public:
GregCr 0:deaafdfde3bb 186 /*!
GregCr 0:deaafdfde3bb 187 * \brief Constructor for radio class
GregCr 4:c6ef863d0b07 188 * Sets the callbacks functions pointers
GregCr 0:deaafdfde3bb 189 *
GregCr 4:c6ef863d0b07 190 * \param [in] callbacks The structure of callbacks function pointers
GregCr 4:c6ef863d0b07 191 * to be called on radio interrupts
GregCr 4:c6ef863d0b07 192 *
GregCr 0:deaafdfde3bb 193 */
GregCr 4:c6ef863d0b07 194 Radio( RadioCallbacks_t *callbacks )
GregCr 0:deaafdfde3bb 195 {
GregCr 4:c6ef863d0b07 196 this->txDone = callbacks->txDone;
GregCr 4:c6ef863d0b07 197 this->rxDone = callbacks->rxDone;
GregCr 4:c6ef863d0b07 198 this->rxPreambleDetect = callbacks->rxPreambleDetect;
GregCr 4:c6ef863d0b07 199 this->rxSyncWordDone = callbacks->rxSyncWordDone;
GregCr 4:c6ef863d0b07 200 this->rxHeaderDone = callbacks->rxHeaderDone;
GregCr 4:c6ef863d0b07 201 this->txTimeout = callbacks->txTimeout;
GregCr 4:c6ef863d0b07 202 this->rxTimeout = callbacks->rxTimeout;
GregCr 4:c6ef863d0b07 203 this->rxError = callbacks->rxError;
GregCr 4:c6ef863d0b07 204 this->cadDone = callbacks->cadDone;
GregCr 0:deaafdfde3bb 205 }
GregCr 4:c6ef863d0b07 206 virtual ~Radio( void ){ };
GregCr 0:deaafdfde3bb 207
GregCr 0:deaafdfde3bb 208 /*!
GregCr 0:deaafdfde3bb 209 * \brief Resets the radio
GregCr 0:deaafdfde3bb 210 */
GregCr 0:deaafdfde3bb 211 virtual void Reset( void ) = 0;
GregCr 0:deaafdfde3bb 212
GregCr 0:deaafdfde3bb 213 /*!
GregCr 0:deaafdfde3bb 214 * \brief Gets the current radio status
GregCr 0:deaafdfde3bb 215 *
GregCr 0:deaafdfde3bb 216 * \retval status Radio status
GregCr 0:deaafdfde3bb 217 */
GregCr 0:deaafdfde3bb 218 virtual RadioStatus_t GetStatus( void ) = 0;
GregCr 0:deaafdfde3bb 219
GregCr 0:deaafdfde3bb 220 /*!
GregCr 0:deaafdfde3bb 221 * \brief Writes the given command to the radio
GregCr 0:deaafdfde3bb 222 *
GregCr 0:deaafdfde3bb 223 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 224 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 225 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 226 */
GregCr 0:deaafdfde3bb 227 virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 228
GregCr 0:deaafdfde3bb 229 /*!
GregCr 0:deaafdfde3bb 230 * \brief Reads the given command from the radio
GregCr 0:deaafdfde3bb 231 *
GregCr 0:deaafdfde3bb 232 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 233 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 234 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 235 */
GregCr 0:deaafdfde3bb 236 virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 237
GregCr 0:deaafdfde3bb 238 /*!
GregCr 0:deaafdfde3bb 239 * \brief Writes multiple radio registers starting at address
GregCr 0:deaafdfde3bb 240 *
GregCr 0:deaafdfde3bb 241 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 242 * \param [in] buffer Buffer containing the new register's values
GregCr 0:deaafdfde3bb 243 * \param [in] size Number of registers to be written
GregCr 0:deaafdfde3bb 244 */
GregCr 0:deaafdfde3bb 245 virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 246
GregCr 0:deaafdfde3bb 247 /*!
GregCr 0:deaafdfde3bb 248 * \brief Writes the radio register at the specified address
GregCr 0:deaafdfde3bb 249 *
GregCr 0:deaafdfde3bb 250 * \param [in] address Register address
GregCr 0:deaafdfde3bb 251 * \param [in] value New register value
GregCr 0:deaafdfde3bb 252 */
GregCr 4:c6ef863d0b07 253 virtual void WriteReg( uint16_t address, uint8_t value ) = 0;
GregCr 0:deaafdfde3bb 254
GregCr 0:deaafdfde3bb 255 /*!
GregCr 0:deaafdfde3bb 256 * \brief Reads multiple radio registers starting at address
GregCr 0:deaafdfde3bb 257 *
GregCr 0:deaafdfde3bb 258 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 259 * \param [out] buffer Buffer where to copy the registers data
GregCr 0:deaafdfde3bb 260 * \param [in] size Number of registers to be read
GregCr 0:deaafdfde3bb 261 */
GregCr 0:deaafdfde3bb 262 virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 263
GregCr 0:deaafdfde3bb 264 /*!
GregCr 0:deaafdfde3bb 265 * \brief Reads the radio register at the specified address
GregCr 0:deaafdfde3bb 266 *
GregCr 0:deaafdfde3bb 267 * \param [in] address Register address
GregCr 0:deaafdfde3bb 268 *
GregCr 0:deaafdfde3bb 269 * \retval value The register value
GregCr 0:deaafdfde3bb 270 */
GregCr 4:c6ef863d0b07 271 virtual uint8_t ReadReg( uint16_t address ) = 0;
GregCr 0:deaafdfde3bb 272
GregCr 0:deaafdfde3bb 273 /*!
GregCr 0:deaafdfde3bb 274 * \brief Writes Radio Data Buffer with buffer of size starting at offset.
GregCr 0:deaafdfde3bb 275 *
GregCr 0:deaafdfde3bb 276 * \param [in] offset Offset where to start writing
GregCr 0:deaafdfde3bb 277 * \param [in] buffer Buffer pointer
GregCr 0:deaafdfde3bb 278 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 279 */
GregCr 0:deaafdfde3bb 280 virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 281
GregCr 0:deaafdfde3bb 282 /*!
GregCr 0:deaafdfde3bb 283 * \brief Reads Radio Data Buffer at offset to buffer of size
GregCr 0:deaafdfde3bb 284 *
GregCr 0:deaafdfde3bb 285 * \param [in] offset Offset where to start reading
GregCr 0:deaafdfde3bb 286 * \param [out] buffer Buffer pointer
GregCr 0:deaafdfde3bb 287 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 288 */
GregCr 0:deaafdfde3bb 289 virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 290 };
GregCr 0:deaafdfde3bb 291
GregCr 0:deaafdfde3bb 292 #endif // __RADIO_H__
GregCr 0:deaafdfde3bb 293