123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- /*
- / _____) _ | |
- ( (____ _____ ____ _| |_ _____ ____| |__
- \____ \| ___ | (_ _) ___ |/ ___) _ \
- _____) ) ____| | | || |_| ____( (___| | | |
- (______/|_____)_|_|_| \__)_____)\____)_| |_|
- (C)2013 Semtech
- Description: Generic SX1276 driver implementation
- License: Revised BSD License, see LICENSE.TXT file include in the project
- Maintainer: Miguel Luis and Gregory Cristian
- */
- #ifndef __SX1276_H__
- #define __SX1276_H__
- #include "sx1276Regs-Fsk.h"
- #include "sx1276Regs-LoRa.h"
- #include "radio.h"
- /*!
- * Radio wakeup time from SLEEP mode
- */
- #define RADIO_OSC_STARTUP 1 // [ms]
- /*!
- * Radio PLL lock and Mode Ready delay which can vary with the temperature
- */
- #define RADIO_SLEEP_TO_RX 2 // [ms]
- /*!
- * Radio complete Wake-up Time with margin for temperature compensation
- */
- #define RADIO_WAKEUP_TIME ( RADIO_OSC_STARTUP + RADIO_SLEEP_TO_RX )
- /*!
- * Radio FSK modem parameters
- */
- typedef struct
- {
- int8_t Power;
- uint32_t Fdev;
- uint32_t Bandwidth;
- uint32_t BandwidthAfc;
- uint32_t Datarate;
- uint16_t PreambleLen;
- bool FixLen;
- uint8_t PayloadLen;
- bool CrcOn;
- bool IqInverted;
- bool RxContinuous;
- uint32_t TxTimeout;
- }RadioFskSettings_t;
- /*!
- * Radio FSK packet handler state
- */
- typedef struct
- {
- uint8_t PreambleDetected;
- uint8_t SyncWordDetected;
- int8_t RssiValue;
- int32_t AfcValue;
- uint8_t RxGain;
- uint16_t Size;
- uint16_t NbBytes;
- uint8_t FifoThresh;
- uint8_t ChunkSize;
- }RadioFskPacketHandler_t;
- /*!
- * Radio LoRa modem parameters
- */
- typedef struct
- {
- int8_t Power;
- uint32_t Bandwidth;
- uint32_t Datarate;
- bool LowDatarateOptimize;
- uint8_t Coderate;
- uint16_t PreambleLen;
- bool FixLen;
- uint8_t PayloadLen;
- bool CrcOn;
- bool FreqHopOn;
- uint8_t HopPeriod;
- bool IqInverted;
- bool RxContinuous;
- uint32_t TxTimeout;
- }RadioLoRaSettings_t;
- /*!
- * Radio LoRa packet handler state
- */
- typedef struct
- {
- int8_t SnrValue;
- int16_t RssiValue;
- uint8_t Size;
- }RadioLoRaPacketHandler_t;
- /*!
- * Radio Settings
- */
- typedef struct
- {
- RadioState_t State;
- RadioModems_t Modem;
- uint32_t Channel;
- RadioFskSettings_t Fsk;
- RadioFskPacketHandler_t FskPacketHandler;
- RadioLoRaSettings_t LoRa;
- RadioLoRaPacketHandler_t LoRaPacketHandler;
- }RadioSettings_t;
- /*!
- * Radio hardware and global parameters
- */
- typedef struct SX1276_s
- {
- /* GPIO和硬件相关,移植到 sx1276-board.c 中了
- Gpio_t Reset;
- Gpio_t DIO0;
- Gpio_t DIO1;
- Gpio_t DIO2;
- Gpio_t DIO3;
- Gpio_t DIO4;
- Gpio_t DIO5;
- Spi_t Spi;*/
- RadioSettings_t Settings;
- }SX1276_t;
- /*!
- * Hardware IO IRQ callback function definition
- */
- typedef void ( DioIrqHandler )( void );
- /*!
- * SX1276 definitions
- */
- #define XTAL_FREQ 32000000
- #define FREQ_STEP 61.03515625
- #define RX_BUFFER_SIZE 256
- /*!
- * ============================================================================
- * Public functions prototypes
- * ============================================================================
- */
- /*!
- * \brief Initializes the radio
- *
- * \param [IN] events Structure containing the driver callback functions
- */
- void SX1276Init( RadioEvents_t *events );
- /*!
- * Return current radio status
- *
- * \param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING]
- */
- RadioState_t SX1276GetStatus( void );
- /*!
- * \brief Configures the radio with the given modem
- *
- * \param [IN] modem Modem to be used [0: FSK, 1: LoRa]
- */
- void SX1276SetModem( RadioModems_t modem );
- /*!
- * \brief Sets the channels configuration
- *
- * \param [IN] freq Channel RF frequency
- */
- void SX1276SetChannel( uint32_t freq );
- /*!
- * \brief Sets the channels configuration
- *
- * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
- * \param [IN] freq Channel RF frequency
- * \param [IN] rssiThresh RSSI threshold
- *
- * \retval isFree [true: Channel is free, false: Channel is not free]
- */
- bool SX1276IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh );
- /*!
- * \brief Generates a 32 bits random value based on the RSSI readings
- *
- * \remark This function sets the radio in LoRa modem mode and disables
- * all interrupts.
- * After calling this function either SX1276SetRxConfig or
- * SX1276SetTxConfig functions must be called.
- *
- * \retval randomValue 32 bits random value
- */
- uint32_t SX1276Random( void );
- /*!
- * \brief Sets the reception parameters
- *
- * \remark When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
- *
- * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
- * \param [IN] bandwidth Sets the bandwidth
- * FSK : >= 2600 and <= 250000 Hz
- * LoRa: [0: 125 kHz, 1: 250 kHz,
- * 2: 500 kHz, 3: Reserved]
- * \param [IN] datarate Sets the Datarate
- * FSK : 600..300000 bits/s
- * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
- * 10: 1024, 11: 2048, 12: 4096 chips]
- * \param [IN] coderate Sets the coding rate (LoRa only)
- * FSK : N/A ( set to 0 )
- * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
- * \param [IN] bandwidthAfc Sets the AFC Bandwidth (FSK only)
- * FSK : >= 2600 and <= 250000 Hz
- * LoRa: N/A ( set to 0 )
- * \param [IN] preambleLen Sets the Preamble length
- * FSK : Number of bytes
- * LoRa: Length in symbols (the hardware adds 4 more symbols)
- * \param [IN] symbTimeout Sets the RxSingle timeout value (LoRa only)
- * FSK : N/A ( set to 0 )
- * LoRa: timeout in symbols
- * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
- * \param [IN] payloadLen Sets payload length when fixed lenght is used
- * \param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON]
- * \param [IN] FreqHopOn Enables disables the intra-packet frequency hopping
- * FSK : N/A ( set to 0 )
- * LoRa: [0: OFF, 1: ON]
- * \param [IN] HopPeriod Number of symbols bewteen each hop
- * FSK : N/A ( set to 0 )
- * LoRa: Number of symbols
- * \param [IN] iqInverted Inverts IQ signals (LoRa only)
- * FSK : N/A ( set to 0 )
- * LoRa: [0: not inverted, 1: inverted]
- * \param [IN] rxContinuous Sets the reception in continuous mode
- * [false: single mode, true: continuous mode]
- */
- void SX1276SetRxConfig( RadioModems_t modem, uint32_t bandwidth,
- uint32_t datarate, uint8_t coderate,
- uint32_t bandwidthAfc, uint16_t preambleLen,
- uint16_t symbTimeout, bool fixLen,
- uint8_t payloadLen,
- bool crcOn, bool FreqHopOn, uint8_t HopPeriod,
- bool iqInverted, bool rxContinuous );
- /*!
- * \brief Sets the transmission parameters
- *
- * \remark When using LoRa modem only bandwidths 125, 250 and 500 kHz are supported
- *
- * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
- * \param [IN] power Sets the output power [dBm]
- * \param [IN] fdev Sets the frequency deviation (FSK only)
- * FSK : [Hz]
- * LoRa: 0
- * \param [IN] bandwidth Sets the bandwidth (LoRa only)
- * FSK : 0
- * LoRa: [0: 125 kHz, 1: 250 kHz,
- * 2: 500 kHz, 3: Reserved]
- * \param [IN] datarate Sets the Datarate
- * FSK : 600..300000 bits/s
- * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
- * 10: 1024, 11: 2048, 12: 4096 chips]
- * \param [IN] coderate Sets the coding rate (LoRa only)
- * FSK : N/A ( set to 0 )
- * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
- * \param [IN] preambleLen Sets the preamble length
- * FSK : Number of bytes
- * LoRa: Length in symbols (the hardware adds 4 more symbols)
- * \param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
- * \param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON]
- * \param [IN] FreqHopOn Enables disables the intra-packet frequency hopping
- * FSK : N/A ( set to 0 )
- * LoRa: [0: OFF, 1: ON]
- * \param [IN] HopPeriod Number of symbols bewteen each hop
- * FSK : N/A ( set to 0 )
- * LoRa: Number of symbols
- * \param [IN] iqInverted Inverts IQ signals (LoRa only)
- * FSK : N/A ( set to 0 )
- * LoRa: [0: not inverted, 1: inverted]
- * \param [IN] timeout Transmission timeout [ms]
- */
- void SX1276SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
- uint32_t bandwidth, uint32_t datarate,
- uint8_t coderate, uint16_t preambleLen,
- bool fixLen, bool crcOn, bool FreqHopOn,
- uint8_t HopPeriod, bool iqInverted, uint32_t timeout );
- /*!
- * \brief Computes the packet time on air in us for the given payload
- *
- * \Remark Can only be called once SetRxConfig or SetTxConfig have been called
- *
- * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
- * \param [IN] pktLen Packet payload length
- *
- * \retval airTime Computed airTime (us) for the given packet payload length
- */
- uint32_t SX1276GetTimeOnAir( RadioModems_t modem, uint8_t pktLen );
- /*!
- * \brief Sends the buffer of size. Prepares the packet to be sent and sets
- * the radio in transmission
- *
- * \param [IN]: buffer Buffer pointer
- * \param [IN]: size Buffer size
- */
- void SX1276Send( uint8_t *buffer, uint8_t size );
-
- /*!
- * \brief Sets the radio in sleep mode
- */
- void SX1276SetSleep( void );
- /*!
- * \brief Sets the radio in standby mode
- */
- void SX1276SetStby( void );
- /*!
- * \brief Sets the radio in reception mode for the given time
- * \param [IN] timeout Reception timeout [ms] [0: continuous, others timeout]
- */
- void SX1276SetRx( uint32_t timeout );
- /*!
- * \brief Start a Channel Activity Detection
- */
- void SX1276StartCad( void );
- /*!
- * \brief Reads the current RSSI value
- *
- * \retval rssiValue Current RSSI value in [dBm]
- */
- int16_t SX1276ReadRssi( RadioModems_t modem );
- /*!
- * \brief Writes the radio register at the specified address
- *
- * \param [IN]: addr Register address
- * \param [IN]: data New register value
- */
- void SX1276Write( uint8_t addr, uint8_t data );
- /*!
- * \brief Reads the radio register at the specified address
- *
- * \param [IN]: addr Register address
- * \retval data Register value
- */
- uint8_t SX1276Read( uint8_t addr );
- /*!
- * \brief Writes multiple radio registers starting at address
- *
- * \param [IN] addr First Radio register address
- * \param [IN] buffer Buffer containing the new register's values
- * \param [IN] size Number of registers to be written
- */
- void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size );
- /*!
- * \brief Reads multiple radio registers starting at address
- *
- * \param [IN] addr First Radio register address
- * \param [OUT] buffer Buffer where to copy the registers data
- * \param [IN] size Number of registers to be read
- */
- void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size );
- /*!
- * \brief Sets the maximum payload length.
- *
- * \param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
- * \param [IN] max Maximum payload length in bytes
- */
- void SX1276SetMaxPayloadLength( RadioModems_t modem, uint8_t max );
- /*!
- * \brief Set the RF Switch I/Os pins in Low Power mode
- *
- * \param [IN] status enable or disable
- */
- void SX1276SetAntSwLowPower( bool status );
- void SX1276OnTimeoutIrq( void );
- #endif // __SX1276_H__
|