Port of lowpowerlab RFM69 Packet radio library for HopeRF RFM69H with hacks from debugging with a FRDM-KL25Z

Dependents:   chuk

Fork of RFM69 by B Rey

Committer:
eisd
Date:
Mon Jun 27 21:50:55 2016 +0000
Revision:
7:ad10455a9b7b
Parent:
6:34009020999c
IRQ for receive; no IRQ for send

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;
eisd 6:34009020999c 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