sx126x.h
  1  // Copyright Sandeep Mistry, Mark Qvist and Jacob Eva.
  2  // Licensed under the MIT license.
  3  
  4  #ifndef SX126X_H
  5  #define SX126X_H
  6  
  7  #include <Arduino.h>
  8  #include <SPI.h>
  9  #include "Modem.h"
 10  
 11  #define LORA_DEFAULT_SS_PIN    10
 12  #define LORA_DEFAULT_RESET_PIN 9
 13  #define LORA_DEFAULT_DIO0_PIN  2
 14  #define LORA_DEFAULT_RXEN_PIN  -1
 15  #define LORA_DEFAULT_TXEN_PIN  -1
 16  #define LORA_DEFAULT_BUSY_PIN  -1
 17  #define LORA_MODEM_TIMEOUT_MS 20E3
 18  
 19  #define PA_OUTPUT_RFO_PIN      0
 20  #define PA_OUTPUT_PA_BOOST_PIN 1
 21  
 22  #define RSSI_OFFSET 157
 23  
 24  class sx126x : public Stream {
 25  public:
 26    sx126x();
 27  
 28    int begin(long frequency);
 29    void end();
 30  
 31    int beginPacket(int implicitHeader = false);
 32    int endPacket();
 33  
 34    int parsePacket(int size = 0);
 35    int packetRssi();
 36    int packetRssi(uint8_t pkt_snr_raw);
 37    int currentRssi();
 38    uint8_t packetRssiRaw();
 39    uint8_t currentRssiRaw();
 40    uint8_t packetSnrRaw();
 41    float packetSnr();
 42    long packetFrequencyError();
 43  
 44    // from Print
 45    virtual size_t write(uint8_t byte);
 46    virtual size_t write(const uint8_t *buffer, size_t size);
 47  
 48    // from Stream
 49    virtual int available();
 50    virtual int read();
 51    virtual int peek();
 52    virtual void flush();
 53  
 54    void onReceive(void(*callback)(int));
 55  
 56    void receive(int size = 0);
 57    void standby();
 58    void sleep();
 59    void reset(void);
 60  
 61    bool preInit();
 62    uint8_t getTxPower();
 63    void setTxPower(int level, int outputPin = PA_OUTPUT_PA_BOOST_PIN);
 64    uint32_t getFrequency();
 65    void setFrequency(long frequency);
 66    void setSpreadingFactor(int sf);
 67    long getSignalBandwidth();
 68    void setSignalBandwidth(long sbw);
 69    void setCodingRate4(int denominator);
 70    void setPreambleLength(long preamble_symbols);
 71    void setSyncWord(uint16_t sw);
 72    bool dcd();
 73    void enableCrc();
 74    void disableCrc();
 75    void enableTCXO();
 76    void disableTCXO();
 77  
 78    void rxAntEnable();
 79    void loraMode();
 80    void waitOnBusy();
 81    void executeOpcode(uint8_t opcode, uint8_t *buffer, uint8_t size);
 82    void executeOpcodeRead(uint8_t opcode, uint8_t *buffer, uint8_t size);
 83    void writeBuffer(const uint8_t* buffer, size_t size);
 84    void readBuffer(uint8_t* buffer, size_t size);
 85    void setPacketParams(long preamble_symbols, uint8_t headermode, uint8_t payload_length, uint8_t crc);
 86  
 87    void setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, int ldro);
 88  
 89    // deprecated
 90    void crc() { enableCrc(); }
 91    void noCrc() { disableCrc(); }
 92  
 93    byte random();
 94  
 95    void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN, int busy = LORA_DEFAULT_BUSY_PIN, int rxen = LORA_DEFAULT_RXEN_PIN);
 96    void setSPIFrequency(uint32_t frequency);
 97  
 98    void dumpRegisters(Stream& out);
 99  
100  private:
101    void explicitHeaderMode();
102    void implicitHeaderMode();
103  
104    void handleDio0Rise();
105  
106    uint8_t readRegister(uint16_t address);
107    void writeRegister(uint16_t address, uint8_t value);
108    uint8_t singleTransfer(uint8_t opcode, uint16_t address, uint8_t value);
109  
110    static void onDio0Rise();
111  
112    void handleLowDataRate();
113    void optimizeModemSensitivity();
114  
115    void calibrate(void);
116    void calibrate_image(long frequency);
117  
118  private:
119    SPISettings _spiSettings;
120    int _ss;
121    int _reset;
122    int _dio0;
123    int _rxen;
124    int _busy;
125    long _frequency;
126    int _txp;
127    uint8_t _sf;
128    uint8_t _bw;
129    uint8_t _cr;
130    uint8_t _ldro;
131    int _packetIndex;
132    int _preambleLength;
133    int _implicitHeaderMode;
134    int _payloadLength;
135    int _crcMode;
136    int _fifo_tx_addr_ptr;
137    int _fifo_rx_addr_ptr;
138    uint8_t _packet[255];
139    bool _preinit_done;
140    void (*_onReceive)(int);
141  };
142  
143  extern sx126x sx126x_modem;
144  
145  #endif