SX1261 and sx1262 common library
Dependents: SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more
Fork of SX126xLib by
sx126x-hal.h@2:4ff11ea92fbe, 2016-09-23 (annotated)
- Committer:
- GregCr
- Date:
- Fri Sep 23 09:38:34 2016 +0000
- Revision:
- 2:4ff11ea92fbe
- Parent:
- 1:35d34672a089
- Child:
- 3:7e3595a9ebe0
updated
Who changed what in which revision?
User | Revision | Line number | New 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)2015 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 and Gregory Cristian |
GregCr | 0:deaafdfde3bb | 14 | */ |
GregCr | 2:4ff11ea92fbe | 15 | #ifndef __SX126x_HAL_H__ |
GregCr | 2:4ff11ea92fbe | 16 | #define __SX126x_HAL_H__ |
GregCr | 0:deaafdfde3bb | 17 | |
GregCr | 1:35d34672a089 | 18 | #include "sx126x.h" |
GregCr | 0:deaafdfde3bb | 19 | |
GregCr | 0:deaafdfde3bb | 20 | /*! |
GregCr | 0:deaafdfde3bb | 21 | * \brief The default value of SPI clock |
GregCr | 0:deaafdfde3bb | 22 | */ |
GregCr | 2:4ff11ea92fbe | 23 | #define SX126x_SPI_FREQ_DEFAULT 1000000 // 16000000 |
GregCr | 0:deaafdfde3bb | 24 | |
GregCr | 0:deaafdfde3bb | 25 | /*! |
GregCr | 0:deaafdfde3bb | 26 | * \brief Actual implementation of a SX1280 radio |
GregCr | 0:deaafdfde3bb | 27 | */ |
GregCr | 2:4ff11ea92fbe | 28 | class SX126xHal : public SX126x |
GregCr | 0:deaafdfde3bb | 29 | { |
GregCr | 0:deaafdfde3bb | 30 | public: |
GregCr | 0:deaafdfde3bb | 31 | /*! |
GregCr | 2:4ff11ea92fbe | 32 | * \brief Constructor for SX126xHal with SPI support |
GregCr | 0:deaafdfde3bb | 33 | * |
GregCr | 0:deaafdfde3bb | 34 | * Represents the physical connectivity with the radio and set callback functions on radio interrupts |
GregCr | 0:deaafdfde3bb | 35 | */ |
GregCr | 2:4ff11ea92fbe | 36 | SX126xHal( PinName mosi, PinName miso, PinName sclk, PinName nss, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst, |
GregCr | 0:deaafdfde3bb | 37 | void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ), |
GregCr | 0:deaafdfde3bb | 38 | void ( *rxTxTimeout )( ),void ( *rxError )( IrqErrorCode_t errorCode ), void ( *rangingDone )( IrqRangingCode_t val ), |
GregCr | 0:deaafdfde3bb | 39 | void ( *cadDone )( bool channelActivityDetected ), |
GregCr | 0:deaafdfde3bb | 40 | void ( *onDioIrq )( ) ); |
GregCr | 0:deaafdfde3bb | 41 | |
GregCr | 0:deaafdfde3bb | 42 | /*! |
GregCr | 2:4ff11ea92fbe | 43 | * \brief Constructor for SX126xHal with UART support |
GregCr | 0:deaafdfde3bb | 44 | * |
GregCr | 0:deaafdfde3bb | 45 | * Represents the physical connectivity with the radio and set callback functions on radio interrupts |
GregCr | 0:deaafdfde3bb | 46 | */ |
GregCr | 2:4ff11ea92fbe | 47 | SX126xHal( PinName tx, PinName rx, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst, |
GregCr | 0:deaafdfde3bb | 48 | void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ), |
GregCr | 0:deaafdfde3bb | 49 | void ( *rxTxTimeout )( ), void ( *rxError )( IrqErrorCode_t errorCode ), void ( *rangingDone )( IrqRangingCode_t val ), |
GregCr | 0:deaafdfde3bb | 50 | void ( *cadDone )( bool channelActivityDetected ), |
GregCr | 0:deaafdfde3bb | 51 | void ( *onDioIrq )( ) ); |
GregCr | 0:deaafdfde3bb | 52 | |
GregCr | 0:deaafdfde3bb | 53 | /*! |
GregCr | 2:4ff11ea92fbe | 54 | * \brief Destructor for SX126xHal with UART support |
GregCr | 0:deaafdfde3bb | 55 | * |
GregCr | 0:deaafdfde3bb | 56 | * Take care of the correct destruction of the communication objects |
GregCr | 0:deaafdfde3bb | 57 | */ |
GregCr | 2:4ff11ea92fbe | 58 | virtual ~SX126xHal( ) |
GregCr | 0:deaafdfde3bb | 59 | { |
GregCr | 0:deaafdfde3bb | 60 | if( this->RadioSpi != 0 ) |
GregCr | 0:deaafdfde3bb | 61 | { |
GregCr | 0:deaafdfde3bb | 62 | delete RadioSpi; |
GregCr | 0:deaafdfde3bb | 63 | } |
GregCr | 0:deaafdfde3bb | 64 | if( this->RadioUart != 0 ) |
GregCr | 0:deaafdfde3bb | 65 | { |
GregCr | 0:deaafdfde3bb | 66 | delete RadioUart; |
GregCr | 0:deaafdfde3bb | 67 | } |
GregCr | 0:deaafdfde3bb | 68 | }; |
GregCr | 0:deaafdfde3bb | 69 | |
GregCr | 0:deaafdfde3bb | 70 | /*! |
GregCr | 0:deaafdfde3bb | 71 | * \brief Soft resets the radio |
GregCr | 0:deaafdfde3bb | 72 | */ |
GregCr | 0:deaafdfde3bb | 73 | virtual void Reset( void ); |
GregCr | 0:deaafdfde3bb | 74 | |
GregCr | 0:deaafdfde3bb | 75 | /*! |
GregCr | 0:deaafdfde3bb | 76 | * \brief Clears the instruction ram memory block |
GregCr | 0:deaafdfde3bb | 77 | */ |
GregCr | 0:deaafdfde3bb | 78 | virtual void ClearInstructionRam( void ); |
GregCr | 0:deaafdfde3bb | 79 | |
GregCr | 0:deaafdfde3bb | 80 | /*! |
GregCr | 0:deaafdfde3bb | 81 | * \brief Wakes up the radio |
GregCr | 0:deaafdfde3bb | 82 | */ |
GregCr | 0:deaafdfde3bb | 83 | virtual void Wakeup( void ); |
GregCr | 0:deaafdfde3bb | 84 | |
GregCr | 0:deaafdfde3bb | 85 | /*! |
GregCr | 0:deaafdfde3bb | 86 | * \brief Send a command that write data to the radio |
GregCr | 0:deaafdfde3bb | 87 | * |
GregCr | 0:deaafdfde3bb | 88 | * \param [in] opcode Opcode of the command |
GregCr | 0:deaafdfde3bb | 89 | * \param [in] buffer Buffer to be send to the radio |
GregCr | 0:deaafdfde3bb | 90 | * \param [in] size Size of the buffer to send |
GregCr | 0:deaafdfde3bb | 91 | */ |
GregCr | 0:deaafdfde3bb | 92 | virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ); |
GregCr | 0:deaafdfde3bb | 93 | |
GregCr | 0:deaafdfde3bb | 94 | /*! |
GregCr | 0:deaafdfde3bb | 95 | * \brief Send a command that read data from the radio |
GregCr | 0:deaafdfde3bb | 96 | * |
GregCr | 0:deaafdfde3bb | 97 | * \param [in] opcode Opcode of the command |
GregCr | 0:deaafdfde3bb | 98 | * \param [out] buffer Buffer holding data from the radio |
GregCr | 0:deaafdfde3bb | 99 | * \param [in] size Size of the buffer |
GregCr | 0:deaafdfde3bb | 100 | */ |
GregCr | 0:deaafdfde3bb | 101 | virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ); |
GregCr | 0:deaafdfde3bb | 102 | |
GregCr | 0:deaafdfde3bb | 103 | /*! |
GregCr | 0:deaafdfde3bb | 104 | * \brief Write data to the radio memory |
GregCr | 0:deaafdfde3bb | 105 | * |
GregCr | 0:deaafdfde3bb | 106 | * \param [in] address The address of the first byte to write in the radio |
GregCr | 0:deaafdfde3bb | 107 | * \param [in] buffer The data to be written in radio's memory |
GregCr | 0:deaafdfde3bb | 108 | * \param [in] size The number of bytes to write in radio's memory |
GregCr | 0:deaafdfde3bb | 109 | */ |
GregCr | 0:deaafdfde3bb | 110 | virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ); |
GregCr | 0:deaafdfde3bb | 111 | |
GregCr | 0:deaafdfde3bb | 112 | virtual void WriteRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size ); |
GregCr | 0:deaafdfde3bb | 113 | |
GregCr | 0:deaafdfde3bb | 114 | |
GregCr | 0:deaafdfde3bb | 115 | /*! |
GregCr | 0:deaafdfde3bb | 116 | * \brief Write a single byte of data to the radio memory |
GregCr | 0:deaafdfde3bb | 117 | * |
GregCr | 0:deaafdfde3bb | 118 | * \param [in] address The address of the first byte to write in the radio |
GregCr | 0:deaafdfde3bb | 119 | * \param [in] value The data to be written in radio's memory |
GregCr | 0:deaafdfde3bb | 120 | */ |
GregCr | 0:deaafdfde3bb | 121 | virtual void WriteRegister( uint16_t address, uint8_t value ); |
GregCr | 0:deaafdfde3bb | 122 | |
GregCr | 0:deaafdfde3bb | 123 | virtual void WriteRegisterNoBusy( uint16_t address, uint8_t value ); |
GregCr | 0:deaafdfde3bb | 124 | |
GregCr | 0:deaafdfde3bb | 125 | /*! |
GregCr | 0:deaafdfde3bb | 126 | * \brief Read data from the radio memory |
GregCr | 0:deaafdfde3bb | 127 | * |
GregCr | 0:deaafdfde3bb | 128 | * \param [in] address The address of the first byte to read from the radio |
GregCr | 0:deaafdfde3bb | 129 | * \param [out] buffer The buffer that holds data read from radio |
GregCr | 0:deaafdfde3bb | 130 | * \param [in] size The number of bytes to read from radio's memory |
GregCr | 0:deaafdfde3bb | 131 | */ |
GregCr | 0:deaafdfde3bb | 132 | virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ); |
GregCr | 0:deaafdfde3bb | 133 | virtual void ReadRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size ); |
GregCr | 0:deaafdfde3bb | 134 | |
GregCr | 0:deaafdfde3bb | 135 | /*! |
GregCr | 0:deaafdfde3bb | 136 | * \brief Read a single byte of data from the radio memory |
GregCr | 0:deaafdfde3bb | 137 | * |
GregCr | 0:deaafdfde3bb | 138 | * \param [in] address The address of the first byte to write in the |
GregCr | 0:deaafdfde3bb | 139 | * radio |
GregCr | 0:deaafdfde3bb | 140 | * |
GregCr | 0:deaafdfde3bb | 141 | * \retval value The value of the byte at the given address in |
GregCr | 0:deaafdfde3bb | 142 | * radio's memory |
GregCr | 0:deaafdfde3bb | 143 | */ |
GregCr | 0:deaafdfde3bb | 144 | virtual uint8_t ReadRegister( uint16_t address ); |
GregCr | 0:deaafdfde3bb | 145 | virtual uint8_t ReadRegisterNoBusy( uint16_t address ); |
GregCr | 0:deaafdfde3bb | 146 | |
GregCr | 0:deaafdfde3bb | 147 | |
GregCr | 0:deaafdfde3bb | 148 | /*! |
GregCr | 0:deaafdfde3bb | 149 | * \brief Write data to the buffer holding the payload in the radio |
GregCr | 0:deaafdfde3bb | 150 | * |
GregCr | 0:deaafdfde3bb | 151 | * \param [in] offset The offset to start writing the payload |
GregCr | 0:deaafdfde3bb | 152 | * \param [in] buffer The data to be written (aka payload) |
GregCr | 0:deaafdfde3bb | 153 | * \param [in] size The number of byte to be written |
GregCr | 0:deaafdfde3bb | 154 | */ |
GregCr | 0:deaafdfde3bb | 155 | virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); |
GregCr | 0:deaafdfde3bb | 156 | |
GregCr | 0:deaafdfde3bb | 157 | /*! |
GregCr | 0:deaafdfde3bb | 158 | * \brief Read data from the buffer holding the payload in the radio |
GregCr | 0:deaafdfde3bb | 159 | * |
GregCr | 0:deaafdfde3bb | 160 | * \param [in] offset The offset to start reading the payload |
GregCr | 0:deaafdfde3bb | 161 | * \param [out] buffer A pointer to a buffer holding the data from the radio |
GregCr | 0:deaafdfde3bb | 162 | * \param [in] size The number of byte to be read |
GregCr | 0:deaafdfde3bb | 163 | */ |
GregCr | 0:deaafdfde3bb | 164 | virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); |
GregCr | 0:deaafdfde3bb | 165 | |
GregCr | 0:deaafdfde3bb | 166 | /*! |
GregCr | 0:deaafdfde3bb | 167 | * \brief Returns the status of DIOs pins |
GregCr | 0:deaafdfde3bb | 168 | * |
GregCr | 0:deaafdfde3bb | 169 | * \retval dioStatus A byte where each bit represents a DIO state: |
GregCr | 0:deaafdfde3bb | 170 | * [ DIO3 | DIO2 | DIO1 | DIO0 ] |
GregCr | 0:deaafdfde3bb | 171 | */ |
GregCr | 0:deaafdfde3bb | 172 | virtual uint8_t GetDioStatus( void ); |
GregCr | 0:deaafdfde3bb | 173 | |
GregCr | 0:deaafdfde3bb | 174 | protected: |
GregCr | 0:deaafdfde3bb | 175 | |
GregCr | 0:deaafdfde3bb | 176 | SPI *RadioSpi; //!< The SPI object used to communicate with the radio |
GregCr | 0:deaafdfde3bb | 177 | Serial *RadioUart; //!< The UART object used to communicate with the radio |
GregCr | 0:deaafdfde3bb | 178 | DigitalOut RadioNss; //!< The pin connected to Radio chip select |
GregCr | 0:deaafdfde3bb | 179 | DigitalOut RadioReset; //!< The reset pin connected to the radio |
GregCr | 0:deaafdfde3bb | 180 | DigitalIn BUSY; //!< The pin connected to DIO0 of the radio (aka busy pin) |
GregCr | 0:deaafdfde3bb | 181 | |
GregCr | 0:deaafdfde3bb | 182 | InterruptIn DIO1; //!< The pin connected to DIO1 |
GregCr | 0:deaafdfde3bb | 183 | InterruptIn DIO2; //!< The pin connected to DIO2 |
GregCr | 0:deaafdfde3bb | 184 | InterruptIn DIO3; //!< The pin connected to DIO3 |
GregCr | 0:deaafdfde3bb | 185 | |
GregCr | 0:deaafdfde3bb | 186 | /*! |
GregCr | 0:deaafdfde3bb | 187 | * \brief Initializes SPI object used to communicate with the radio |
GregCr | 0:deaafdfde3bb | 188 | */ |
GregCr | 0:deaafdfde3bb | 189 | virtual void SpiInit( void ); |
GregCr | 0:deaafdfde3bb | 190 | |
GregCr | 0:deaafdfde3bb | 191 | /*! |
GregCr | 0:deaafdfde3bb | 192 | * \brief Initializes UART object used to communicate with the radio |
GregCr | 0:deaafdfde3bb | 193 | */ |
GregCr | 0:deaafdfde3bb | 194 | virtual void UartInit( void ); |
GregCr | 0:deaafdfde3bb | 195 | |
GregCr | 0:deaafdfde3bb | 196 | /*! |
GregCr | 0:deaafdfde3bb | 197 | * \brief Sets the callback functions to be run on DIO1..3 interrupt |
GregCr | 0:deaafdfde3bb | 198 | * |
GregCr | 0:deaafdfde3bb | 199 | * \param [in] irqHandler A function pointer of the function to be run on every DIO interrupt |
GregCr | 0:deaafdfde3bb | 200 | */ |
GregCr | 0:deaafdfde3bb | 201 | virtual void IoIrqInit( DioIrqHandler irqHandler ); |
GregCr | 0:deaafdfde3bb | 202 | }; |
GregCr | 0:deaafdfde3bb | 203 | |
GregCr | 2:4ff11ea92fbe | 204 | #endif // __SX126x_HAL_H__ |