SX1261 and sx1262 common library

Dependents:   SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more

Fork of SX126xLib by Gregory Cristian

Committer:
GregCr
Date:
Tue Sep 06 06:56:46 2016 +0000
Revision:
0:deaafdfde3bb
Child:
3:7e3595a9ebe0
Initial commit using Martin's version

Who changed what in which revision?

UserRevisionLine numberNew 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 #ifndef __RADIO_H__
GregCr 0:deaafdfde3bb 16 #define __RADIO_H__
GregCr 0:deaafdfde3bb 17
GregCr 0:deaafdfde3bb 18 #include "mbed.h"
GregCr 0:deaafdfde3bb 19
GregCr 0:deaafdfde3bb 20 /*!
GregCr 0:deaafdfde3bb 21 * \brief Structure describing the radio status
GregCr 0:deaafdfde3bb 22 */
GregCr 0:deaafdfde3bb 23 typedef union RadioStatus_u
GregCr 0:deaafdfde3bb 24 {
GregCr 0:deaafdfde3bb 25 uint8_t Value;
GregCr 0:deaafdfde3bb 26 struct
GregCr 0:deaafdfde3bb 27 { //bit order is lsb -> msb
GregCr 0:deaafdfde3bb 28 uint8_t Reserved : 1; //!< Reserved
GregCr 0:deaafdfde3bb 29 uint8_t CmdStatus : 3; //!< Command status
GregCr 0:deaafdfde3bb 30 uint8_t ChipMode : 3; //!< Chip mode
GregCr 0:deaafdfde3bb 31 uint8_t CpuBusy : 1; //!< Flag for CPU radio busy
GregCr 0:deaafdfde3bb 32 }Fields;
GregCr 0:deaafdfde3bb 33 }RadioStatus_t;
GregCr 0:deaafdfde3bb 34
GregCr 0:deaafdfde3bb 35 /*!
GregCr 0:deaafdfde3bb 36 * \brief Structure describing the ranging codes for callback functions
GregCr 0:deaafdfde3bb 37 */
GregCr 0:deaafdfde3bb 38 enum IrqRangingCode_t
GregCr 0:deaafdfde3bb 39 {
GregCr 0:deaafdfde3bb 40 IRQ_RANGING_SLAVE_ERROR_CODE,
GregCr 0:deaafdfde3bb 41 IRQ_RANGING_SLAVE_VALID_CODE,
GregCr 0:deaafdfde3bb 42 IRQ_RANGING_SLAVE_RESPONSE_DONE_CODE,
GregCr 0:deaafdfde3bb 43 IRQ_RANGING_MASTER_TIMEOUT_CODE,
GregCr 0:deaafdfde3bb 44 IRQ_RANGING_MASTER_VALID_CODE,
GregCr 0:deaafdfde3bb 45 };
GregCr 0:deaafdfde3bb 46
GregCr 0:deaafdfde3bb 47 /*!
GregCr 0:deaafdfde3bb 48 * \brief Structure describing the error codes for callback functions
GregCr 0:deaafdfde3bb 49 */
GregCr 0:deaafdfde3bb 50 enum IrqErrorCode_t
GregCr 0:deaafdfde3bb 51 {
GregCr 0:deaafdfde3bb 52 IRQ_HEADER_ERROR_CODE = 0x01,
GregCr 0:deaafdfde3bb 53 IRQ_SYNCWORD_ERROR_CODE = 0x02,
GregCr 0:deaafdfde3bb 54 IRQ_GFSK_ERROR_CODE = 0x04,
GregCr 0:deaafdfde3bb 55 IRQ_LORA_CRC_ERROR_CODE = 0x04,
GregCr 0:deaafdfde3bb 56 };
GregCr 0:deaafdfde3bb 57
GregCr 0:deaafdfde3bb 58
GregCr 0:deaafdfde3bb 59 enum IrqPblSyncHeaderCode_t
GregCr 0:deaafdfde3bb 60 {
GregCr 0:deaafdfde3bb 61 IRQ_PBL_DETECT_CODE = 0x01,
GregCr 0:deaafdfde3bb 62 IRQ_SYNCWORD_VALID_CODE = 0x02,
GregCr 0:deaafdfde3bb 63 IRQ_hEADER_VALID_CODE = 0x04,
GregCr 0:deaafdfde3bb 64 };
GregCr 0:deaafdfde3bb 65
GregCr 0:deaafdfde3bb 66 /*!
GregCr 0:deaafdfde3bb 67 * \brief The radio command opcodes
GregCr 0:deaafdfde3bb 68 */
GregCr 0:deaafdfde3bb 69 enum RadioCommands_t;
GregCr 0:deaafdfde3bb 70
GregCr 0:deaafdfde3bb 71 /*!
GregCr 0:deaafdfde3bb 72 * \brief Class holding the basic communications with a radio
GregCr 0:deaafdfde3bb 73 *
GregCr 0:deaafdfde3bb 74 * It sets the functions to read/write registers, send commands and read/write
GregCr 0:deaafdfde3bb 75 * payload.
GregCr 0:deaafdfde3bb 76 * It also provides functions to run callback functions depending on the
GregCr 0:deaafdfde3bb 77 * interrupts generated from the radio.
GregCr 0:deaafdfde3bb 78 */
GregCr 0:deaafdfde3bb 79 class Radio
GregCr 0:deaafdfde3bb 80 {
GregCr 0:deaafdfde3bb 81 protected:
GregCr 0:deaafdfde3bb 82 /*!
GregCr 0:deaafdfde3bb 83 * \brief Callback on Tx done interrupt
GregCr 0:deaafdfde3bb 84 */
GregCr 0:deaafdfde3bb 85 void ( *txDone )( );
GregCr 0:deaafdfde3bb 86
GregCr 0:deaafdfde3bb 87 /*!
GregCr 0:deaafdfde3bb 88 * \brief Callback on Rx done interrupt
GregCr 0:deaafdfde3bb 89 */
GregCr 0:deaafdfde3bb 90 void ( *rxDone )( );
GregCr 0:deaafdfde3bb 91
GregCr 0:deaafdfde3bb 92 /*!
GregCr 0:deaafdfde3bb 93 * \brief Callback on Rx SyncWord done interrupt
GregCr 0:deaafdfde3bb 94 */
GregCr 0:deaafdfde3bb 95 void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val );
GregCr 0:deaafdfde3bb 96
GregCr 0:deaafdfde3bb 97 /*!
GregCr 0:deaafdfde3bb 98 * \brief Callback on Rx Tx timeout interrupt
GregCr 0:deaafdfde3bb 99 */
GregCr 0:deaafdfde3bb 100 void ( *rxTxTimeout )( );
GregCr 0:deaafdfde3bb 101
GregCr 0:deaafdfde3bb 102 /*!
GregCr 0:deaafdfde3bb 103 * \brief Callback on Rx error interrupt
GregCr 0:deaafdfde3bb 104 *
GregCr 0:deaafdfde3bb 105 * \param [out] errCode A code indicating the type of interrupt ( SyncWord error or CRC error)
GregCr 0:deaafdfde3bb 106 */
GregCr 0:deaafdfde3bb 107 void ( *rxError )( IrqErrorCode_t errCode );
GregCr 0:deaafdfde3bb 108
GregCr 0:deaafdfde3bb 109 /*!
GregCr 0:deaafdfde3bb 110 * \brief Callback on ranging done interrupt
GregCr 0:deaafdfde3bb 111 *
GregCr 0:deaafdfde3bb 112 * \param [out] val A flag indicating the type of interrupt (Master/Slave and Valid/Error)
GregCr 0:deaafdfde3bb 113 */
GregCr 0:deaafdfde3bb 114 void ( *rangingDone )( IrqRangingCode_t val );
GregCr 0:deaafdfde3bb 115
GregCr 0:deaafdfde3bb 116 /*!
GregCr 0:deaafdfde3bb 117 * \brief Callback on Channel Activity Detection done interrupt
GregCr 0:deaafdfde3bb 118 *
GregCr 0:deaafdfde3bb 119 * \param [out] cadFlag Flag for channel activity detected or not
GregCr 0:deaafdfde3bb 120 */
GregCr 0:deaafdfde3bb 121 void ( *cadDone )( bool cadFlag );
GregCr 0:deaafdfde3bb 122
GregCr 0:deaafdfde3bb 123 public:
GregCr 0:deaafdfde3bb 124 /*!
GregCr 0:deaafdfde3bb 125 * \brief Constructor for radio class
GregCr 0:deaafdfde3bb 126 *
GregCr 0:deaafdfde3bb 127 * Sets the callbacks functions pointers
GregCr 0:deaafdfde3bb 128 */
GregCr 0:deaafdfde3bb 129 Radio( void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )(IrqPblSyncHeaderCode_t val ),
GregCr 0:deaafdfde3bb 130 void ( *rxTxTimeout )( ), void ( *rxError )( IrqErrorCode_t errorCode ), void ( *rangingDone )( IrqRangingCode_t val ),
GregCr 0:deaafdfde3bb 131 void ( *cadDone )( bool channelActivityDetected ) )
GregCr 0:deaafdfde3bb 132 {
GregCr 0:deaafdfde3bb 133 this->txDone = txDone;
GregCr 0:deaafdfde3bb 134 this->rxDone = rxDone;
GregCr 0:deaafdfde3bb 135 this->rxPblSyncWordHeader = rxPblSyncWordHeader;
GregCr 0:deaafdfde3bb 136 this->rxTxTimeout = rxTxTimeout;
GregCr 0:deaafdfde3bb 137 this->rxError = rxError;
GregCr 0:deaafdfde3bb 138 this->rangingDone = rangingDone;
GregCr 0:deaafdfde3bb 139 this->cadDone = cadDone;
GregCr 0:deaafdfde3bb 140 }
GregCr 0:deaafdfde3bb 141 virtual ~Radio( ){ };
GregCr 0:deaafdfde3bb 142
GregCr 0:deaafdfde3bb 143 /*!
GregCr 0:deaafdfde3bb 144 * \brief Resets the radio
GregCr 0:deaafdfde3bb 145 */
GregCr 0:deaafdfde3bb 146 virtual void Reset( void ) = 0;
GregCr 0:deaafdfde3bb 147
GregCr 0:deaafdfde3bb 148 /*!
GregCr 0:deaafdfde3bb 149 * \brief Gets the current radio status
GregCr 0:deaafdfde3bb 150 *
GregCr 0:deaafdfde3bb 151 * \retval status Radio status
GregCr 0:deaafdfde3bb 152 */
GregCr 0:deaafdfde3bb 153 virtual RadioStatus_t GetStatus( void ) = 0;
GregCr 0:deaafdfde3bb 154
GregCr 0:deaafdfde3bb 155 /*!
GregCr 0:deaafdfde3bb 156 * \brief Writes the given command to the radio
GregCr 0:deaafdfde3bb 157 *
GregCr 0:deaafdfde3bb 158 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 159 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 160 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 161 */
GregCr 0:deaafdfde3bb 162 virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 163
GregCr 0:deaafdfde3bb 164 /*!
GregCr 0:deaafdfde3bb 165 * \brief Reads the given command from the radio
GregCr 0:deaafdfde3bb 166 *
GregCr 0:deaafdfde3bb 167 * \param [in] opcode Command opcode
GregCr 0:deaafdfde3bb 168 * \param [in] buffer Command parameters byte array
GregCr 0:deaafdfde3bb 169 * \param [in] size Command parameters byte array size
GregCr 0:deaafdfde3bb 170 */
GregCr 0:deaafdfde3bb 171 virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 172
GregCr 0:deaafdfde3bb 173 /*!
GregCr 0:deaafdfde3bb 174 * \brief Writes multiple radio registers starting at address
GregCr 0:deaafdfde3bb 175 *
GregCr 0:deaafdfde3bb 176 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 177 * \param [in] buffer Buffer containing the new register's values
GregCr 0:deaafdfde3bb 178 * \param [in] size Number of registers to be written
GregCr 0:deaafdfde3bb 179 */
GregCr 0:deaafdfde3bb 180 virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 181
GregCr 0:deaafdfde3bb 182 /*!
GregCr 0:deaafdfde3bb 183 * \brief Writes the radio register at the specified address
GregCr 0:deaafdfde3bb 184 *
GregCr 0:deaafdfde3bb 185 * \param [in] address Register address
GregCr 0:deaafdfde3bb 186 * \param [in] value New register value
GregCr 0:deaafdfde3bb 187 */
GregCr 0:deaafdfde3bb 188 virtual void WriteRegister( uint16_t address, uint8_t value ) = 0;
GregCr 0:deaafdfde3bb 189
GregCr 0:deaafdfde3bb 190 /*!
GregCr 0:deaafdfde3bb 191 * \brief Reads multiple radio registers starting at address
GregCr 0:deaafdfde3bb 192 *
GregCr 0:deaafdfde3bb 193 * \param [in] address First Radio register address
GregCr 0:deaafdfde3bb 194 * \param [out] buffer Buffer where to copy the registers data
GregCr 0:deaafdfde3bb 195 * \param [in] size Number of registers to be read
GregCr 0:deaafdfde3bb 196 */
GregCr 0:deaafdfde3bb 197 virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0;
GregCr 0:deaafdfde3bb 198
GregCr 0:deaafdfde3bb 199 /*!
GregCr 0:deaafdfde3bb 200 * \brief Reads the radio register at the specified address
GregCr 0:deaafdfde3bb 201 *
GregCr 0:deaafdfde3bb 202 * \param [in] address Register address
GregCr 0:deaafdfde3bb 203 *
GregCr 0:deaafdfde3bb 204 * \retval value The register value
GregCr 0:deaafdfde3bb 205 */
GregCr 0:deaafdfde3bb 206 virtual uint8_t ReadRegister( uint16_t address ) = 0;
GregCr 0:deaafdfde3bb 207
GregCr 0:deaafdfde3bb 208 /*!
GregCr 0:deaafdfde3bb 209 * \brief Writes Radio Data Buffer with buffer of size starting at offset.
GregCr 0:deaafdfde3bb 210 *
GregCr 0:deaafdfde3bb 211 * \param [in] offset Offset where to start writing
GregCr 0:deaafdfde3bb 212 * \param [in] buffer Buffer pointer
GregCr 0:deaafdfde3bb 213 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 214 */
GregCr 0:deaafdfde3bb 215 virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 216
GregCr 0:deaafdfde3bb 217 /*!
GregCr 0:deaafdfde3bb 218 * \brief Reads Radio Data Buffer at offset to buffer of size
GregCr 0:deaafdfde3bb 219 *
GregCr 0:deaafdfde3bb 220 * \param [in] offset Offset where to start reading
GregCr 0:deaafdfde3bb 221 * \param [out] buffer Buffer pointer
GregCr 0:deaafdfde3bb 222 * \param [in] size Buffer size
GregCr 0:deaafdfde3bb 223 */
GregCr 0:deaafdfde3bb 224 virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:deaafdfde3bb 225
GregCr 0:deaafdfde3bb 226 /*!
GregCr 0:deaafdfde3bb 227 * \brief Return firmware version
GregCr 0:deaafdfde3bb 228 *
GregCr 0:deaafdfde3bb 229 * \retval firmware The firmware version
GregCr 0:deaafdfde3bb 230 */
GregCr 0:deaafdfde3bb 231 virtual uint16_t GetFirmwareVersion( void ) = 0;
GregCr 0:deaafdfde3bb 232 };
GregCr 0:deaafdfde3bb 233
GregCr 0:deaafdfde3bb 234 #endif // __RADIO_H__
GregCr 0:deaafdfde3bb 235