/ RNode_Firmware_CE_G2 / sx126x.h
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