SX1261 and sx1262 common library
Dependents: SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more
Fork of SX126xLib by
Diff: sx126x-hal.h
- Revision:
- 0:deaafdfde3bb
- Child:
- 1:35d34672a089
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sx126x-hal.h Tue Sep 06 06:56:46 2016 +0000 @@ -0,0 +1,204 @@ +/* + / _____) _ | | +( (____ _____ ____ _| |_ _____ ____| |__ + \____ \| ___ | (_ _) ___ |/ ___) _ \ + _____) ) ____| | | || |_| ____( (___| | | | +(______/|_____)_|_|_| \__)_____)\____)_| |_| + (C)2015 Semtech + +Description: Handling of the node configuration protocol + +License: Revised BSD License, see LICENSE.TXT file include in the project + +Maintainer: Miguel Luis and Gregory Cristian +*/ +#ifndef __SX1261_HAL_H__ +#define __SX1261_HAL_H__ + +#include "sx1261.h" + +/*! + * \brief The default value of SPI clock + */ +#define SX1261_SPI_FREQ_DEFAULT 1000000 // 16000000 + +/*! + * \brief Actual implementation of a SX1280 radio + */ +class SX1261Hal : public SX1261 +{ +public: + /*! + * \brief Constructor for SX1261Hal with SPI support + * + * Represents the physical connectivity with the radio and set callback functions on radio interrupts + */ + SX1261Hal( PinName mosi, PinName miso, PinName sclk, PinName nss, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst, + void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ), + void ( *rxTxTimeout )( ),void ( *rxError )( IrqErrorCode_t errorCode ), void ( *rangingDone )( IrqRangingCode_t val ), + void ( *cadDone )( bool channelActivityDetected ), + void ( *onDioIrq )( ) ); + + /*! + * \brief Constructor for SX1261Hal with UART support + * + * Represents the physical connectivity with the radio and set callback functions on radio interrupts + */ + SX1261Hal( PinName tx, PinName rx, PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst, + void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ), + void ( *rxTxTimeout )( ), void ( *rxError )( IrqErrorCode_t errorCode ), void ( *rangingDone )( IrqRangingCode_t val ), + void ( *cadDone )( bool channelActivityDetected ), + void ( *onDioIrq )( ) ); + + /*! + * \brief Destructor for SX1261Hal with UART support + * + * Take care of the correct destruction of the communication objects + */ + virtual ~SX1261Hal( ) + { + if( this->RadioSpi != 0 ) + { + delete RadioSpi; + } + if( this->RadioUart != 0 ) + { + delete RadioUart; + } + }; + + /*! + * \brief Soft resets the radio + */ + virtual void Reset( void ); + + /*! + * \brief Clears the instruction ram memory block + */ + virtual void ClearInstructionRam( void ); + + /*! + * \brief Wakes up the radio + */ + virtual void Wakeup( void ); + + /*! + * \brief Send a command that write data to the radio + * + * \param [in] opcode Opcode of the command + * \param [in] buffer Buffer to be send to the radio + * \param [in] size Size of the buffer to send + */ + virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ); + + /*! + * \brief Send a command that read data from the radio + * + * \param [in] opcode Opcode of the command + * \param [out] buffer Buffer holding data from the radio + * \param [in] size Size of the buffer + */ + virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ); + + /*! + * \brief Write data to the radio memory + * + * \param [in] address The address of the first byte to write in the radio + * \param [in] buffer The data to be written in radio's memory + * \param [in] size The number of bytes to write in radio's memory + */ + virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ); + + virtual void WriteRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size ); + + + /*! + * \brief Write a single byte of data to the radio memory + * + * \param [in] address The address of the first byte to write in the radio + * \param [in] value The data to be written in radio's memory + */ + virtual void WriteRegister( uint16_t address, uint8_t value ); + + virtual void WriteRegisterNoBusy( uint16_t address, uint8_t value ); + + /*! + * \brief Read data from the radio memory + * + * \param [in] address The address of the first byte to read from the radio + * \param [out] buffer The buffer that holds data read from radio + * \param [in] size The number of bytes to read from radio's memory + */ + virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ); + virtual void ReadRegisterNoBusy( uint16_t address, uint8_t *buffer, uint16_t size ); + + /*! + * \brief Read a single byte of data from the radio memory + * + * \param [in] address The address of the first byte to write in the + * radio + * + * \retval value The value of the byte at the given address in + * radio's memory + */ + virtual uint8_t ReadRegister( uint16_t address ); + virtual uint8_t ReadRegisterNoBusy( uint16_t address ); + + + /*! + * \brief Write data to the buffer holding the payload in the radio + * + * \param [in] offset The offset to start writing the payload + * \param [in] buffer The data to be written (aka payload) + * \param [in] size The number of byte to be written + */ + virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); + + /*! + * \brief Read data from the buffer holding the payload in the radio + * + * \param [in] offset The offset to start reading the payload + * \param [out] buffer A pointer to a buffer holding the data from the radio + * \param [in] size The number of byte to be read + */ + virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ); + + /*! + * \brief Returns the status of DIOs pins + * + * \retval dioStatus A byte where each bit represents a DIO state: + * [ DIO3 | DIO2 | DIO1 | DIO0 ] + */ + virtual uint8_t GetDioStatus( void ); + +protected: + + SPI *RadioSpi; //!< The SPI object used to communicate with the radio + Serial *RadioUart; //!< The UART object used to communicate with the radio + DigitalOut RadioNss; //!< The pin connected to Radio chip select + DigitalOut RadioReset; //!< The reset pin connected to the radio + DigitalIn BUSY; //!< The pin connected to DIO0 of the radio (aka busy pin) + + InterruptIn DIO1; //!< The pin connected to DIO1 + InterruptIn DIO2; //!< The pin connected to DIO2 + InterruptIn DIO3; //!< The pin connected to DIO3 + + /*! + * \brief Initializes SPI object used to communicate with the radio + */ + virtual void SpiInit( void ); + + /*! + * \brief Initializes UART object used to communicate with the radio + */ + virtual void UartInit( void ); + + /*! + * \brief Sets the callback functions to be run on DIO1..3 interrupt + * + * \param [in] irqHandler A function pointer of the function to be run on every DIO interrupt + */ + virtual void IoIrqInit( DioIrqHandler irqHandler ); +}; + +#endif // __SX1261_HAL_H__