SX1261 and sx1262 common library

Dependents:   SX126xDevKit SX1262PingPong SX126X_TXonly SX126X_PingPong_Demo ... more

Fork of SX126xLib by Gregory Cristian

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__