Port of lowpowerlab RFM69 Packet radio library for HopeRF RFM69H

Dependents:   Recep_spi_lib Recep_spi_lib

Fork of RFM69 by B Rey

Committer:
geekylou
Date:
Sun Dec 03 18:10:02 2017 +0000
Revision:
1:cedfa200eaeb
Parent:
0:db6e4ce9dc02
Call the interrupt handler at read time so we can handle the case of the IRQ pin already being high.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
br549 0:db6e4ce9dc02 1 // **********************************************************************************
br549 0:db6e4ce9dc02 2 // Driver definition for HopeRF RFM69W/RFM69HW/RFM69CW/RFM69HCW, Semtech SX1231/1231H
br549 0:db6e4ce9dc02 3 // **********************************************************************************
br549 0:db6e4ce9dc02 4 // Copyright Felix Rusu (2014), felix@lowpowerlab.com
br549 0:db6e4ce9dc02 5 // http://lowpowerlab.com/
br549 0:db6e4ce9dc02 6 // **********************************************************************************
br549 0:db6e4ce9dc02 7 // License
br549 0:db6e4ce9dc02 8 // **********************************************************************************
br549 0:db6e4ce9dc02 9 // This program is free software; you can redistribute it
br549 0:db6e4ce9dc02 10 // and/or modify it under the terms of the GNU General
br549 0:db6e4ce9dc02 11 // Public License as published by the Free Software
br549 0:db6e4ce9dc02 12 // Foundation; either version 3 of the License, or
br549 0:db6e4ce9dc02 13 // (at your option) any later version.
br549 0:db6e4ce9dc02 14 //
br549 0:db6e4ce9dc02 15 // This program is distributed in the hope that it will
br549 0:db6e4ce9dc02 16 // be useful, but WITHOUT ANY WARRANTY; without even the
br549 0:db6e4ce9dc02 17 // implied warranty of MERCHANTABILITY or FITNESS FOR A
br549 0:db6e4ce9dc02 18 // PARTICULAR PURPOSE. See the GNU General Public
br549 0:db6e4ce9dc02 19 // License for more details.
br549 0:db6e4ce9dc02 20 //
br549 0:db6e4ce9dc02 21 // You should have received a copy of the GNU General
br549 0:db6e4ce9dc02 22 // Public License along with this program.
br549 0:db6e4ce9dc02 23 // If not, see <http://www.gnu.org/licenses/>.
br549 0:db6e4ce9dc02 24 //
br549 0:db6e4ce9dc02 25 // Licence can be viewed at
br549 0:db6e4ce9dc02 26 // http://www.gnu.org/licenses/gpl-3.0.txt
br549 0:db6e4ce9dc02 27 //
br549 0:db6e4ce9dc02 28 // Please maintain this license information along with authorship
br549 0:db6e4ce9dc02 29 // and copyright notices in any redistribution of this code
br549 0:db6e4ce9dc02 30 // **********************************************************************************
br549 0:db6e4ce9dc02 31 #ifndef RFM69_h
br549 0:db6e4ce9dc02 32 #define RFM69_h
br549 0:db6e4ce9dc02 33 #include <mbed.h> // assumes Arduino IDE v1.0 or greater
br549 0:db6e4ce9dc02 34
br549 0:db6e4ce9dc02 35 #define RF69_MAX_DATA_LEN 61 // to take advantage of the built in AES/CRC we want to limit the frame size to the internal FIFO size (66 bytes - 3 bytes overhead - 2 bytes crc)
br549 0:db6e4ce9dc02 36 //#define RF69_SPI_CS SS // SS is the SPI slave select pin, for instance D10 on ATmega328
br549 0:db6e4ce9dc02 37
br549 0:db6e4ce9dc02 38 #define CSMA_LIMIT -90 // upper RX signal sensitivity threshold in dBm for carrier sense access
br549 0:db6e4ce9dc02 39 #define RF69_MODE_SLEEP 0 // XTAL OFF
br549 0:db6e4ce9dc02 40 #define RF69_MODE_STANDBY 1 // XTAL ON
br549 0:db6e4ce9dc02 41 #define RF69_MODE_SYNTH 2 // PLL ON
br549 0:db6e4ce9dc02 42 #define RF69_MODE_RX 3 // RX MODE
br549 0:db6e4ce9dc02 43 #define RF69_MODE_TX 4 // TX MODE
br549 0:db6e4ce9dc02 44
br549 0:db6e4ce9dc02 45 // available frequency bands
br549 0:db6e4ce9dc02 46 #define RF69_315MHZ 31 // non trivial values to avoid misconfiguration
br549 0:db6e4ce9dc02 47 #define RF69_433MHZ 43
br549 0:db6e4ce9dc02 48 #define RF69_868MHZ 86
br549 0:db6e4ce9dc02 49 #define RF69_915MHZ 91
br549 0:db6e4ce9dc02 50
br549 0:db6e4ce9dc02 51 #define null 0
br549 0:db6e4ce9dc02 52 #define COURSE_TEMP_COEF -90 // puts the temperature reading in the ballpark, user can fine tune the returned value
br549 0:db6e4ce9dc02 53 #define RF69_BROADCAST_ADDR 255
br549 0:db6e4ce9dc02 54 #define RF69_CSMA_LIMIT_MS 1000
br549 0:db6e4ce9dc02 55 #define RF69_TX_LIMIT_MS 1000
br549 0:db6e4ce9dc02 56 #define RF69_FSTEP 61.03515625 // == FXOSC / 2^19 = 32MHz / 2^19 (p13 in datasheet)
br549 0:db6e4ce9dc02 57
br549 0:db6e4ce9dc02 58 class RFM69 {
br549 0:db6e4ce9dc02 59 public:
br549 0:db6e4ce9dc02 60 static volatile uint8_t DATA[RF69_MAX_DATA_LEN]; // recv/xmit buf, including header & crc bytes
br549 0:db6e4ce9dc02 61 static volatile uint8_t DATALEN;
br549 0:db6e4ce9dc02 62 static volatile uint8_t SENDERID;
br549 0:db6e4ce9dc02 63 static volatile uint8_t TARGETID; // should match _address
br549 0:db6e4ce9dc02 64 static volatile uint8_t PAYLOADLEN;
br549 0:db6e4ce9dc02 65 static volatile uint8_t ACK_REQUESTED;
br549 0:db6e4ce9dc02 66 static volatile uint8_t ACK_RECEIVED; // should be polled immediately after sending a packet with ACK request
br549 0:db6e4ce9dc02 67 static volatile int16_t RSSI; // most accurate RSSI during reception (closest to the reception)
br549 0:db6e4ce9dc02 68 static volatile uint8_t _mode; // should be protected?
br549 0:db6e4ce9dc02 69
br549 0:db6e4ce9dc02 70 RFM69(PinName mosi, PinName miso, PinName sclk, PinName slaveSelectPin, PinName interrupt);
br549 0:db6e4ce9dc02 71
br549 0:db6e4ce9dc02 72 bool initialize(uint8_t freqBand, uint8_t ID, uint8_t networkID=1);
br549 0:db6e4ce9dc02 73 void setAddress(uint8_t addr);
br549 0:db6e4ce9dc02 74 void setNetwork(uint8_t networkID);
br549 0:db6e4ce9dc02 75 bool canSend();
br549 0:db6e4ce9dc02 76 void send(uint8_t toAddress, const void* buffer, uint8_t bufferSize, bool requestACK=false);
br549 0:db6e4ce9dc02 77 bool sendWithRetry(uint8_t toAddress, const void* buffer, uint8_t bufferSize, uint8_t retries=2, uint8_t retryWaitTime=40); // 40ms roundtrip req for 61byte packets
br549 0:db6e4ce9dc02 78 bool receiveDone();
br549 0:db6e4ce9dc02 79 bool ACKReceived(uint8_t fromNodeID);
br549 0:db6e4ce9dc02 80 bool ACKRequested();
br549 0:db6e4ce9dc02 81 void sendACK(const void* buffer = "", uint8_t bufferSize=0);
br549 0:db6e4ce9dc02 82 uint32_t getFrequency();
br549 0:db6e4ce9dc02 83 void setFrequency(uint32_t freqHz);
br549 0:db6e4ce9dc02 84 void encrypt(const char* key);
br549 0:db6e4ce9dc02 85 // void setCS(uint8_t newSPISlaveSelect);
br549 0:db6e4ce9dc02 86 int16_t readRSSI(bool forceTrigger=false);
br549 0:db6e4ce9dc02 87 void promiscuous(bool onOff=true);
br549 0:db6e4ce9dc02 88 void setHighPower(bool onOFF=true); // has to be called after initialize() for RFM69HW
br549 0:db6e4ce9dc02 89 void setPowerLevel(uint8_t level); // reduce/increase transmit power level
br549 0:db6e4ce9dc02 90 void sleep();
br549 0:db6e4ce9dc02 91 uint8_t readTemperature(int8_t calFactor=0); // get CMOS temperature (8bit)
br549 0:db6e4ce9dc02 92 void rcCalibration(); // calibrate the internal RC oscillator for use in wide temperature variations - see datasheet section [4.3.5. RC Timer Accuracy]
br549 0:db6e4ce9dc02 93
br549 0:db6e4ce9dc02 94 // allow hacking registers by making these public
br549 0:db6e4ce9dc02 95 uint8_t readReg(uint8_t addr);
br549 0:db6e4ce9dc02 96 void writeReg(uint8_t addr, uint8_t val);
br549 0:db6e4ce9dc02 97 void readAllRegs();
br549 0:db6e4ce9dc02 98
br549 0:db6e4ce9dc02 99 protected:
br549 0:db6e4ce9dc02 100 void isr0();
br549 0:db6e4ce9dc02 101 void virtual interruptHandler();
br549 0:db6e4ce9dc02 102 void sendFrame(uint8_t toAddress, const void* buffer, uint8_t size, bool requestACK=false, bool sendACK=false);
br549 0:db6e4ce9dc02 103
br549 0:db6e4ce9dc02 104 static RFM69* selfPointer;
br549 0:db6e4ce9dc02 105 DigitalOut _slaveSelectPin;
br549 0:db6e4ce9dc02 106 InterruptIn _interrupt;
br549 0:db6e4ce9dc02 107 uint8_t _address;
br549 0:db6e4ce9dc02 108 Timer t;
br549 0:db6e4ce9dc02 109 bool _promiscuousMode;
br549 0:db6e4ce9dc02 110 uint8_t _powerLevel;
br549 0:db6e4ce9dc02 111 bool _isRFM69HW;
br549 0:db6e4ce9dc02 112 SPI _spi;
br549 0:db6e4ce9dc02 113 void receiveBegin();
br549 0:db6e4ce9dc02 114 void setMode(uint8_t mode);
br549 0:db6e4ce9dc02 115 void setHighPowerRegs(bool onOff);
br549 0:db6e4ce9dc02 116 void select();
br549 0:db6e4ce9dc02 117 void unselect();
br549 0:db6e4ce9dc02 118 };
br549 0:db6e4ce9dc02 119
br549 0:db6e4ce9dc02 120 #endif