Driver for the SX1280 RF Transceiver

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

Committer:
mverdy
Date:
Thu Nov 08 10:08:44 2018 +0000
Revision:
12:c4f110f3fe3e
Parent:
11:d60df50e108f
Synchronze driver on v1.3.1

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