From 130cb822e4ed624c82158f1c49f333e577c55ed5 Mon Sep 17 00:00:00 2001 From: Mihai Tudor Panu Date: Tue, 6 Dec 2016 22:39:30 -0800 Subject: [PATCH] rf22: Initial implementation for RFM22B radios, C++ only & bindings Signed-off-by: Mihai Tudor Panu --- docs/images/rf22.jpg | Bin 0 -> 161935 bytes examples/c++/CMakeLists.txt | 2 + examples/c++/rf22-client.cxx | 72 +++ examples/c++/rf22-server.cxx | 73 +++ src/rf22/CMakeLists.txt | 5 + src/rf22/javaupm_rf22.i | 24 + src/rf22/jsupm_rf22.i | 9 + src/rf22/pyupm_rf22.i | 12 + src/rf22/rf22.cxx | 766 +++++++++++++++++++++++++++ src/rf22/rf22.hpp | 987 +++++++++++++++++++++++++++++++++++ 10 files changed, 1950 insertions(+) create mode 100644 docs/images/rf22.jpg create mode 100644 examples/c++/rf22-client.cxx create mode 100644 examples/c++/rf22-server.cxx create mode 100644 src/rf22/CMakeLists.txt create mode 100644 src/rf22/javaupm_rf22.i create mode 100644 src/rf22/jsupm_rf22.i create mode 100644 src/rf22/pyupm_rf22.i create mode 100644 src/rf22/rf22.cxx create mode 100644 src/rf22/rf22.hpp diff --git a/docs/images/rf22.jpg b/docs/images/rf22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eec32cdf6a7079565026db7a58225e27a994c694 GIT binary patch literal 161935 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

I-NwUiR+3Z^|{k3g=7a&$C0;v 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 K5D0(w>;KvO{9wxf literal 0 HcmV?d00001 diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index 0732862d..e2e3a614 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -325,6 +325,8 @@ add_example (ms5803) add_example (ims) add_example (ecezo) add_example (mb704x) +add_example (rf22-server) +add_example (rf22-client) # These are special cases where you specify example binary, source file and module(s) include_directories (${PROJECT_SOURCE_DIR}/src) diff --git a/examples/c++/rf22-client.cxx b/examples/c++/rf22-client.cxx new file mode 100644 index 00000000..5522b3d2 --- /dev/null +++ b/examples/c++/rf22-client.cxx @@ -0,0 +1,72 @@ +/* + * Author: Kiveisha Yevgeniy + * Copyright (c) 2015-2016 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include "rf22.hpp" + +bool amWorking = true; + +void +sig_handler (int signo) { + if (signo == SIGINT) { + amWorking = false; + } +} +//! [Interesting] +int +main (int argc, char ** argv) { + // SPI bus 0, CS pin 10, INTR pin 2 + upm::RF22* rf22 = new upm::RF22 (0, 10, 2); + + if (!rf22->init()) { + std::cout << "RF22 init failed" << std::endl; + return 0x1; + } + + uint8_t data[] = "Hello World!"; + uint8_t buf[RF22_MAX_MESSAGE_LEN]; + uint8_t len = sizeof(buf); + + signal (SIGINT, sig_handler); + while (amWorking) { + std::cout << "Sending to rf22_server" << std::endl; + // Send a message to rf22_server + rf22->send(data, sizeof(data)); + rf22->waitPacketSent(); + // Now wait for a reply + + rf22->waitAvailableTimeout(1000000); + + if (rf22->recv(buf, &len)) { + std::cout << "got response: " << (char*)buf << std::endl; + } else { + std::cout << "!!! NO RESPONSE !!!" << std::endl; + } + } + + std::cout << "Exit 'rfm22-client'" << std::endl; + return 0; +} +//! [Interesting] diff --git a/examples/c++/rf22-server.cxx b/examples/c++/rf22-server.cxx new file mode 100644 index 00000000..eccbff5c --- /dev/null +++ b/examples/c++/rf22-server.cxx @@ -0,0 +1,73 @@ +/* + * Author: Kiveisha Yevgeniy + * Copyright (c) 2015-2016 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include "rf22.hpp" + +bool amWorking = true; + +void +sig_handler (int signo) { + if (signo == SIGINT) { + amWorking = false; + } +} +//! [Interesting] +int +main (int argc, char ** argv) { + // SPI bus 0, CS pin 10, INTR pin 2 + upm::RF22* rf22 = new upm::RF22 (0, 10, 2); + + if (!rf22->init()) { + std::cout << "RF22 init failed" << std::endl; + return 0x1; + } + + uint8_t buf[RF22_MAX_MESSAGE_LEN]; + uint8_t len = sizeof(buf); + + signal (SIGINT, sig_handler); + while (amWorking) { + // rf22->waitAvailable(); + rf22->waitAvailableTimeout (500); + + // Should be a message for us now + if (rf22->recv(buf, &len)) { + std::cout << "got request: " << (char*)buf << std::endl; + + // Send a reply + uint8_t data[] = "And hello back to you"; + rf22->send(data, sizeof(data)); + rf22->waitPacketSent(); + } else { + // Do whatever you need. + } + } + + delete rf22; + std::cout << "Exit 'rfm22-server'" << std::endl; + return 0; +} +//! [Interesting] diff --git a/src/rf22/CMakeLists.txt b/src/rf22/CMakeLists.txt new file mode 100644 index 00000000..d2d6bb1f --- /dev/null +++ b/src/rf22/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "rf22") +set (libdescription "HopeRF RFM22B ISM Band Radio Module") +set (module_src ${libname}.cxx) +set (module_hpp ${libname}.hpp) +upm_module_init() diff --git a/src/rf22/javaupm_rf22.i b/src/rf22/javaupm_rf22.i new file mode 100644 index 00000000..73efb180 --- /dev/null +++ b/src/rf22/javaupm_rf22.i @@ -0,0 +1,24 @@ +%module(directors="1") javaupm_rf22 +%include "../upm.i" +%include "arrays_java.i" +%include "typemaps.i" + +%apply uint8_t *INOUT { uint8_t* len }; +%apply signed char[] {uint8_t*}; + +%{ + #include "rf22.hpp" +%} + +%include "rf22.hpp" + +%pragma(java) jniclasscode=%{ + static { + try { + System.loadLibrary("javaupm_rf22"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. \n" + e); + System.exit(1); + } + } +%} \ No newline at end of file diff --git a/src/rf22/jsupm_rf22.i b/src/rf22/jsupm_rf22.i new file mode 100644 index 00000000..069b3b06 --- /dev/null +++ b/src/rf22/jsupm_rf22.i @@ -0,0 +1,9 @@ +%module jsupm_rf22 +%include "../upm.i" +%include "../carrays_uint8_t.i" + +%{ + #include "rf22.hpp" +%} + +%include "rf22.hpp" diff --git a/src/rf22/pyupm_rf22.i b/src/rf22/pyupm_rf22.i new file mode 100644 index 00000000..f4b3b4e0 --- /dev/null +++ b/src/rf22/pyupm_rf22.i @@ -0,0 +1,12 @@ +// Include doxygen-generated documentation +%include "pyupm_doxy2swig.i" +%module pyupm_rf22 +%include "../upm.i" +%include "../carrays_uint8_t.i" + +%feature("autodoc", "3"); + +%include "rf22.hpp" +%{ + #include "rf22.hpp" +%} diff --git a/src/rf22/rf22.cxx b/src/rf22/rf22.cxx new file mode 100644 index 00000000..e3bb9d5b --- /dev/null +++ b/src/rf22/rf22.cxx @@ -0,0 +1,766 @@ +/* + * Author: Kiveisha Yevgeniy + * Copyright (c) 2015-2016 Intel Corporation + * + * Author: Mike McCauley + * Copyright (c) 2011 Mike McCauley + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include + +using namespace upm; + +// These are indexed by the values of ModemConfigChoice +// Canned modem configurations generated with +// http://www.hoperf.com/upload/rf/RF22B%2023B%2031B%2042B%2043B%20Register%20Settings_RevB1-v5.xls +// Stored in flash (program) memory to save SRAM +static const RF22::ModemConfig MODEM_CONFIG_TABLE[] = +{ + { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x00, 0x08 }, // Unmodulated carrier + { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x33, 0x08 }, // FSK, PN9 random modulation, 2, 5 + + // All the following enable FIFO with reg 71 + // 1c, 1f, 20, 21, 22, 23, 24, 25, 2c, 2d, 2e, 58, 69, 6e, 6f, 70, 71, 72 + // FSK, No Manchester, Max Rb err <1%, Xtal Tol 20ppm + { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x22, 0x08 }, // 2, 5 + { 0x1b, 0x03, 0x41, 0x60, 0x27, 0x52, 0x00, 0x07, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x13, 0xa9, 0x2c, 0x22, 0x3a }, // 2.4, 36 + { 0x1d, 0x03, 0xa1, 0x20, 0x4e, 0xa5, 0x00, 0x13, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x27, 0x52, 0x2c, 0x22, 0x48 }, // 4.8, 45 + { 0x1e, 0x03, 0xd0, 0x00, 0x9d, 0x49, 0x00, 0x45, 0x40, 0x0a, 0x20, 0x80, 0x60, 0x4e, 0xa5, 0x2c, 0x22, 0x48 }, // 9.6, 45 + { 0x2b, 0x03, 0x34, 0x02, 0x75, 0x25, 0x07, 0xff, 0x40, 0x0a, 0x1b, 0x80, 0x60, 0x9d, 0x49, 0x2c, 0x22, 0x0f }, // 19.2, 9.6 + { 0x02, 0x03, 0x68, 0x01, 0x3a, 0x93, 0x04, 0xd5, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x09, 0xd5, 0x0c, 0x22, 0x1f }, // 38.4, 19.6 + { 0x06, 0x03, 0x45, 0x01, 0xd7, 0xdc, 0x07, 0x6e, 0x40, 0x0a, 0x2d, 0x80, 0x60, 0x0e, 0xbf, 0x0c, 0x22, 0x2e }, // 57.6. 28.8 + { 0x8a, 0x03, 0x60, 0x01, 0x55, 0x55, 0x02, 0xad, 0x40, 0x0a, 0x50, 0x80, 0x60, 0x20, 0x00, 0x0c, 0x22, 0xc8 }, // 125, 125 + + // GFSK, No Manchester, Max Rb err <1%, Xtal Tol 20ppm + // These differ from FSK only in register 71, for the modulation type + { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x23, 0x08 }, // 2, 5 + { 0x1b, 0x03, 0x41, 0x60, 0x27, 0x52, 0x00, 0x07, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x13, 0xa9, 0x2c, 0x23, 0x3a }, // 2.4, 36 + { 0x1d, 0x03, 0xa1, 0x20, 0x4e, 0xa5, 0x00, 0x13, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x27, 0x52, 0x2c, 0x23, 0x48 }, // 4.8, 45 + { 0x1e, 0x03, 0xd0, 0x00, 0x9d, 0x49, 0x00, 0x45, 0x40, 0x0a, 0x20, 0x80, 0x60, 0x4e, 0xa5, 0x2c, 0x23, 0x48 }, // 9.6, 45 + { 0x2b, 0x03, 0x34, 0x02, 0x75, 0x25, 0x07, 0xff, 0x40, 0x0a, 0x1b, 0x80, 0x60, 0x9d, 0x49, 0x2c, 0x23, 0x0f }, // 19.2, 9.6 + { 0x02, 0x03, 0x68, 0x01, 0x3a, 0x93, 0x04, 0xd5, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x09, 0xd5, 0x0c, 0x23, 0x1f }, // 38.4, 19.6 + { 0x06, 0x03, 0x45, 0x01, 0xd7, 0xdc, 0x07, 0x6e, 0x40, 0x0a, 0x2d, 0x80, 0x60, 0x0e, 0xbf, 0x0c, 0x23, 0x2e }, // 57.6. 28.8 + { 0x8a, 0x03, 0x60, 0x01, 0x55, 0x55, 0x02, 0xad, 0x40, 0x0a, 0x50, 0x80, 0x60, 0x20, 0x00, 0x0c, 0x23, 0xc8 }, // 125, 125 + + // OOK, No Manchester, Max Rb err <1%, Xtal Tol 20ppm + { 0x51, 0x03, 0x68, 0x00, 0x3a, 0x93, 0x01, 0x3d, 0x2c, 0x11, 0x28, 0x80, 0x60, 0x09, 0xd5, 0x2c, 0x21, 0x08 }, // 1.2, 75 + { 0xc8, 0x03, 0x39, 0x20, 0x68, 0xdc, 0x00, 0x6b, 0x2a, 0x08, 0x2a, 0x80, 0x60, 0x13, 0xa9, 0x2c, 0x21, 0x08 }, // 2.4, 335 + { 0xc8, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x29, 0x04, 0x29, 0x80, 0x60, 0x27, 0x52, 0x2c, 0x21, 0x08 }, // 4.8, 335 + { 0xb8, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x28, 0x82, 0x29, 0x80, 0x60, 0x4e, 0xa5, 0x2c, 0x21, 0x08 }, // 9.6, 335 + { 0xa8, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x28, 0x41, 0x29, 0x80, 0x60, 0x9d, 0x49, 0x2c, 0x21, 0x08 }, // 19.2, 335 + { 0x98, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x28, 0x20, 0x29, 0x80, 0x60, 0x09, 0xd5, 0x0c, 0x21, 0x08 }, // 38.4, 335 + { 0x98, 0x03, 0x96, 0x00, 0xda, 0x74, 0x00, 0xdc, 0x28, 0x1f, 0x29, 0x80, 0x60, 0x0a, 0x3d, 0x0c, 0x21, 0x08 }, // 40, 335 + +}; + +RF22::RF22(uint8_t spiBus, uint8_t slaveSelectPin, uint8_t interruptPin) +{ + _idleMode = RF22_XTON; // Default idle state is READY mode + _mode = RF22_MODE_IDLE; // We start up in idle mode + _rxGood = 0; + _rxBad = 0; + _txGood = 0; + + //Initialize the SPI bus and pins, MRAA will log any failures here + // start the SPI library: + // Note the RF22 wants mode 0, MSB first and default to 1 Mbps + _spi = mraa_spi_init(spiBus); + mraa_spi_mode (_spi, MRAA_SPI_MODE0); + mraa_spi_lsbmode(_spi, 0); + mraa_spi_frequency(_spi, 1000000); // 1Mhz + + _cs = mraa_gpio_init(slaveSelectPin); + mraa_gpio_dir(_cs, MRAA_GPIO_OUT); + + _irq = mraa_gpio_init(interruptPin); + mraa_gpio_dir(_irq, MRAA_GPIO_IN); + mraa_gpio_isr(_irq, MRAA_GPIO_EDGE_FALLING, &isr, (void*)this); +} + +RF22::~RF22() +{ + mraa_spi_stop(_spi); + mraa_gpio_close(_cs); + mraa_gpio_close(_irq); +} + +uint8_t RF22::init() +{ + // Wait for RF22 POR (up to 16msec) + usleep (16); + + // Initialise the slave select pin + mraa_gpio_write(_cs, 0x1); + + usleep (100); + + // Software reset the device + reset(); + + // Get the device type and check it + // This also tests whether we are really connected to a device + _deviceType = spiRead(RF22_REG_00_DEVICE_TYPE); + if ( _deviceType != RF22_DEVICE_TYPE_RX_TRX + && _deviceType != RF22_DEVICE_TYPE_TX) + return 0; + + clearTxBuf(); + clearRxBuf(); + + // Most of these are the POR default + spiWrite(RF22_REG_7D_TX_FIFO_CONTROL2, RF22_TXFFAEM_THRESHOLD); + spiWrite(RF22_REG_7E_RX_FIFO_CONTROL, RF22_RXFFAFULL_THRESHOLD); + spiWrite(RF22_REG_30_DATA_ACCESS_CONTROL, RF22_ENPACRX | RF22_ENPACTX | RF22_ENCRC | RF22_CRC_CRC_16_IBM); + // Configure the message headers + // Here we set up the standard packet format for use by the RF22 library + // 8 nibbles preamble + // 2 SYNC words 2d, d4 + // Header length 4 (to, from, id, flags) + // 1 octet of data length (0 to 255) + // 0 to 255 octets data + // 2 CRC octets as CRC16(IBM), computed on the header, length and data + // On reception the to address is check for validity against RF22_REG_3F_CHECK_HEADER3 + // or the broadcast address of 0xff + // If no changes are made after this, the transmitted + // to address will be 0xff, the from address will be 0xff + // and all such messages will be accepted. This permits the out-of the box + // RF22 config to act as an unaddresed, unreliable datagram service + spiWrite(RF22_REG_32_HEADER_CONTROL1, RF22_BCEN_HEADER3 | RF22_HDCH_HEADER3); + spiWrite(RF22_REG_33_HEADER_CONTROL2, RF22_HDLEN_4 | RF22_SYNCLEN_2); + setPreambleLength(8); + uint8_t syncwords[] = { 0x2d, 0xd4 }; + setSyncWords(syncwords, sizeof(syncwords)); + setPromiscuous(0); + // Check the TO header against RF22_DEFAULT_NODE_ADDRESS + spiWrite(RF22_REG_3F_CHECK_HEADER3, RF22_DEFAULT_NODE_ADDRESS); + // Set the default transmit header values + setHeaderTo(RF22_DEFAULT_NODE_ADDRESS); + setHeaderFrom(RF22_DEFAULT_NODE_ADDRESS); + setHeaderId(0); + setHeaderFlags(0); + + // Ensure the antenna can be switched automatically according to transmit and receive + // This assumes GPIO0(out) is connected to TX_ANT(in) to enable tx antenna during transmit + // This assumes GPIO1(out) is connected to RX_ANT(in) to enable rx antenna during receive + spiWrite (RF22_REG_0B_GPIO_CONFIGURATION0, 0x12) ; // TX state + spiWrite (RF22_REG_0C_GPIO_CONFIGURATION1, 0x15) ; // RX state + + // Enable interrupts + spiWrite(RF22_REG_05_INTERRUPT_ENABLE1, RF22_ENTXFFAEM | RF22_ENRXFFAFULL | RF22_ENPKSENT | RF22_ENPKVALID | RF22_ENCRCERROR | RF22_ENFFERR); + spiWrite(RF22_REG_06_INTERRUPT_ENABLE2, RF22_ENPREAVAL); + + // Set some defaults. An innocuous ISM frequency, and reasonable pull-in + setFrequency(434.0, 0.05); +// setFrequency(900.0); + // Some slow, reliable default speed and modulation + setModemConfig(FSK_Rb2_4Fd36); +// setModemConfig(FSK_Rb125Fd125); + // Minimum power + setTxPower(RF22_TXPOW_8DBM); +// setTxPower(RF22_TXPOW_17DBM); + + return 1; +} + +// C++ level interrupt handler for this instance +void RF22::handleInterrupt() +{ + uint8_t _lastInterruptFlags[2]; + // Read the interrupt flags which clears the interrupt + spiBurstRead(RF22_REG_03_INTERRUPT_STATUS1, _lastInterruptFlags, 2); + + if (_lastInterruptFlags[0] & RF22_IFFERROR) + { + resetFifos(); // Clears the interrupt + if (_mode == RF22_MODE_TX) + restartTransmit(); + else if (_mode == RF22_MODE_RX) + clearRxBuf(); + } + // Caution, any delay here may cause a FF underflow or overflow + if (_lastInterruptFlags[0] & RF22_ITXFFAEM) + { + // See if more data has to be loaded into the Tx FIFO + sendNextFragment(); + } + if (_lastInterruptFlags[0] & RF22_IRXFFAFULL) + { + // Caution, any delay here may cause a FF overflow + // Read some data from the Rx FIFO + readNextFragment(); + } + if (_lastInterruptFlags[0] & RF22_IEXT) + { + // This is not enabled by the base code, but users may want to enable it + handleExternalInterrupt(); + } + if (_lastInterruptFlags[1] & RF22_IWUT) + { + // This is not enabled by the base code, but users may want to enable it + handleWakeupTimerInterrupt(); + } + if (_lastInterruptFlags[0] & RF22_IPKSENT) + { + _txGood++; + // Transmission does not automatically clear the tx buffer. + // Could retransmit if we wanted + // RF22 transitions automatically to Idle + _mode = RF22_MODE_IDLE; + } + if (_lastInterruptFlags[0] & RF22_IPKVALID) + { + uint8_t len = spiRead(RF22_REG_4B_RECEIVED_PACKET_LENGTH); + + // May have already read one or more fragments + // Get any remaining unread octets, based on the expected length + // First make sure we dont overflow the buffer in the case of a stupid length + // or partial bad receives + if ( len > RF22_MAX_MESSAGE_LEN + || len < _bufLen) + { + _rxBad++; + _mode = RF22_MODE_IDLE; + clearRxBuf(); + return; // Hmmm receiver buffer overflow. + } + + spiBurstRead(RF22_REG_7F_FIFO_ACCESS, _buf + _bufLen, len - _bufLen); + _rxGood++; + _bufLen = len; + _mode = RF22_MODE_IDLE; + _rxBufValid = true; + } + if (_lastInterruptFlags[0] & RF22_ICRCERROR) + { + _rxBad++; + clearRxBuf(); + resetRxFifo(); + _mode = RF22_MODE_IDLE; + setModeRx(); // Keep trying + } + if (_lastInterruptFlags[1] & RF22_IPREAVAL) + { + _lastRssi = spiRead(RF22_REG_26_RSSI); + clearRxBuf(); + } +} + +void RF22::isr(void* args) +{ + RF22* This = (RF22*)(args); + This->handleInterrupt(); +} + +void RF22::reset() +{ + spiWrite(RF22_REG_07_OPERATING_MODE1, RF22_SWRES); + // Wait for it to settle + usleep(100); // SWReset time is nominally 100usec +} + +uint8_t RF22::spiRead(uint8_t reg) +{ + uint8_t data; + spiBurstRead (reg, &data, 1); + return data; +} + +void RF22::spiWrite(uint8_t reg, uint8_t val) +{ + spiBurstWrite (reg, &val, 1); +} + +void RF22::spiBurstRead(uint8_t reg, uint8_t* dest, uint8_t len) +{ + uint8_t *request; + uint8_t *response; + + request = (uint8_t *) malloc(sizeof(uint8_t) * (len + 1)); + response = (uint8_t *) malloc(sizeof(uint8_t) * (len + 1)); + memset(request, 0x00, len + 1); + memset(response, 0x00, len + 1); + + request[0] = reg & ~RF22_SPI_WRITE_MASK; + memcpy (&request[1], dest, len); + + mraa_gpio_write(_cs, 0x1); + mraa_gpio_write(_cs, 0x0); + usleep(100); + mraa_spi_transfer_buf(_spi, request, response, len + 1); + usleep(100); + mraa_gpio_write(_cs, 0x1); + + memcpy (dest, &response[1], len); + + free (request); + free (response); +} + +void RF22::spiBurstWrite(uint8_t reg, const uint8_t* src, uint8_t len) +{ + uint8_t *request; + uint8_t *response; + + request = (uint8_t *) malloc(sizeof(uint8_t) * (len + 1)); + response = (uint8_t *) malloc(sizeof(uint8_t) * (len + 1)); + memset(request, 0x00, len + 1); + memset(response, 0x00, len + 1); + + request[0] = reg | RF22_SPI_WRITE_MASK; + memcpy (&request[1], src, len); + + mraa_gpio_write(_cs, 0x1); + mraa_gpio_write(_cs, 0x0); + usleep(100); + mraa_spi_transfer_buf(_spi, request, response, len + 1); + usleep(100); + mraa_gpio_write(_cs, 0x1); + + free (request); + free (response); +} + +uint8_t RF22::statusRead() +{ + return spiRead(RF22_REG_02_DEVICE_STATUS); +} + +uint8_t RF22::adcRead(uint8_t adcsel, + uint8_t adcref , + uint8_t adcgain, + uint8_t adcoffs) +{ + uint8_t configuration = adcsel | adcref | (adcgain & RF22_ADCGAIN); + spiWrite(RF22_REG_0F_ADC_CONFIGURATION, configuration | RF22_ADCSTART); + spiWrite(RF22_REG_10_ADC_SENSOR_AMP_OFFSET, adcoffs); + + // Conversion time is nominally 305usec + // Wait for the DONE bit + while (!(spiRead(RF22_REG_0F_ADC_CONFIGURATION) & RF22_ADCDONE)) + ; + // Return the value + return spiRead(RF22_REG_11_ADC_VALUE); +} + +uint8_t RF22::temperatureRead(uint8_t tsrange, uint8_t tvoffs) +{ + spiWrite(RF22_REG_12_TEMPERATURE_SENSOR_CALIBRATION, tsrange | RF22_ENTSOFFS); + spiWrite(RF22_REG_13_TEMPERATURE_VALUE_OFFSET, tvoffs); + return adcRead(RF22_ADCSEL_INTERNAL_TEMPERATURE_SENSOR | RF22_ADCREF_BANDGAP_VOLTAGE); +} + +uint16_t RF22::wutRead() +{ + uint8_t buf[2]; + spiBurstRead(RF22_REG_17_WAKEUP_TIMER_VALUE1, buf, 2); + return ((uint16_t)buf[0] << 8) | buf[1]; // Dont rely on byte order +} + +// RFM-22 doc appears to be wrong: WUT for wtm = 10000, r, = 0, d = 0 is about 1 sec +void RF22::setWutPeriod(uint16_t wtm, uint8_t wtr, uint8_t wtd) +{ + uint8_t period[3]; + + period[0] = ((wtr & 0xf) << 2) | (wtd & 0x3); + period[1] = wtm >> 8; + period[2] = wtm & 0xff; + spiBurstWrite(RF22_REG_14_WAKEUP_TIMER_PERIOD1, period, sizeof(period)); +} + +// Returns true if center + (fhch * fhs) is within limits +// Caution, different versions of the RF22 support different max freq +// so YMMV +uint8_t RF22::setFrequency(float center, float afcPullInRange) +{ + uint8_t fbsel = RF22_SBSEL; + uint8_t afclimiter; + if (center < 240.0 || center > 960.0) // 930.0 for early silicon + return false; + if (center >= 480.0) + { + if (afcPullInRange < 0.0 || afcPullInRange > 0.318750) + return false; + center /= 2; + fbsel |= RF22_HBSEL; + afclimiter = afcPullInRange * 1000000.0 / 1250.0; + } + else + { + if (afcPullInRange < 0.0 || afcPullInRange > 0.159375) + return false; + afclimiter = afcPullInRange * 1000000.0 / 625.0; + } + center /= 10.0; + float integerPart = floor(center); + float fractionalPart = center - integerPart; + + uint8_t fb = (uint8_t)integerPart - 24; // Range 0 to 23 + fbsel |= fb; + uint16_t fc = fractionalPart * 64000; + spiWrite(RF22_REG_73_FREQUENCY_OFFSET1, 0); // REVISIT + spiWrite(RF22_REG_74_FREQUENCY_OFFSET2, 0); + spiWrite(RF22_REG_75_FREQUENCY_BAND_SELECT, fbsel); + spiWrite(RF22_REG_76_NOMINAL_CARRIER_FREQUENCY1, fc >> 8); + spiWrite(RF22_REG_77_NOMINAL_CARRIER_FREQUENCY0, fc & 0xff); + spiWrite(RF22_REG_2A_AFC_LIMITER, afclimiter); + return !(statusRead() & RF22_FREQERR); +} + +// Step size in 10kHz increments +// Returns true if centre + (fhch * fhs) is within limits +uint8_t RF22::setFHStepSize(uint8_t fhs) +{ + spiWrite(RF22_REG_7A_FREQUENCY_HOPPING_STEP_SIZE, fhs); + return !(statusRead() & RF22_FREQERR); +} + +// Adds fhch * fhs to centre frequency +// Returns true if centre + (fhch * fhs) is within limits +uint8_t RF22::setFHChannel(uint8_t fhch) +{ + spiWrite(RF22_REG_79_FREQUENCY_HOPPING_CHANNEL_SELECT, fhch); + return !(statusRead() & RF22_FREQERR); +} + +uint8_t RF22::rssiRead() +{ + return spiRead(RF22_REG_26_RSSI); +} + +uint8_t RF22::ezmacStatusRead() +{ + return spiRead(RF22_REG_31_EZMAC_STATUS); +} + +void RF22::setMode(uint8_t mode) +{ + spiWrite(RF22_REG_07_OPERATING_MODE1, mode); +} + +void RF22::setModeIdle() +{ + if (_mode != RF22_MODE_IDLE) + { + setMode(_idleMode); + _mode = RF22_MODE_IDLE; + } +} + +void RF22::setModeRx() +{ + if (_mode != RF22_MODE_RX) + { + setMode(_idleMode | RF22_RXON); + _mode = RF22_MODE_RX; + } +} + +void RF22::setModeTx() +{ + if (_mode != RF22_MODE_TX) + { + setMode(_idleMode | RF22_TXON); + _mode = RF22_MODE_TX; + // Hmmm, if you dont clear the RX FIFO here, then it appears that going + // to transmit mode in the middle of a receive can corrupt the + // RX FIFO + resetRxFifo(); + clearRxBuf(); + } +} + +uint8_t RF22::mode() +{ + return _mode; +} + +void RF22::setTxPower(uint8_t power) +{ + spiWrite(RF22_REG_6D_TX_POWER, power); +} + +// Sets registers from a canned modem configuration structure +void RF22::setModemRegisters(const ModemConfig* config) +{ + spiWrite(RF22_REG_1C_IF_FILTER_BANDWIDTH, config->reg_1c); + spiWrite(RF22_REG_1F_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE, config->reg_1f); + spiBurstWrite(RF22_REG_20_CLOCK_RECOVERY_OVERSAMPLING_RATE, &config->reg_20, 6); + spiBurstWrite(RF22_REG_2C_OOK_COUNTER_VALUE_1, &config->reg_2c, 3); + spiWrite(RF22_REG_58_CHARGE_PUMP_CURRENT_TRIMMING, config->reg_58); + spiWrite(RF22_REG_69_AGC_OVERRIDE1, config->reg_69); + spiBurstWrite(RF22_REG_6E_TX_DATA_RATE1, &config->reg_6e, 5); +} + +// Set one of the canned FSK Modem configs +// Returns true if its a valid choice +uint8_t RF22::setModemConfig(ModemConfigChoice index) +{ + if (index > (sizeof(MODEM_CONFIG_TABLE) / sizeof(ModemConfig))) + return false; + + RF22::ModemConfig cfg; + // memcpy_P(&cfg, &MODEM_CONFIG_TABLE[index], sizeof(RF22::ModemConfig)); // !!!!!!!!!!!!!!!!!!! MIGHT CAUSE ISSUES + memcpy(&cfg, &MODEM_CONFIG_TABLE[index], sizeof(RF22::ModemConfig)); + setModemRegisters(&cfg); + + return true; +} + +// REVISIT: top bit is in Header Control 2 0x33 +void RF22::setPreambleLength(uint8_t nibbles) +{ + spiWrite(RF22_REG_34_PREAMBLE_LENGTH, nibbles); +} + +// Caution doesnt set sync word len in Header Control 2 0x33 +void RF22::setSyncWords(const uint8_t* syncWords, uint8_t len) +{ + spiBurstWrite(RF22_REG_36_SYNC_WORD3, syncWords, len); +} + +void RF22::clearRxBuf() +{ + _bufLen = 0; + _rxBufValid = false; +} + +uint8_t RF22::available() +{ + if (!_rxBufValid) + setModeRx(); // Make sure we are receiving + return _rxBufValid; +} + +// Blocks until a valid message is received +void RF22::waitAvailable() +{ + while (!available()) + ; +} + +// Blocks until a valid message is received or timeout expires +// Return true if there is a message available +bool RF22::waitAvailableTimeout(unsigned long timeout) +{ + unsigned long endtime = getTimestamp() + timeout; + unsigned long currenttime = getTimestamp(); + while (currenttime < endtime) { + currenttime = getTimestamp(); + if (available()) { + return true; + } + } + + return false; +} + +void RF22::waitPacketSent() +{ + while (_mode == RF22_MODE_TX) + ; // Wait for any previous transmit to finish +} + +// Diagnostic help +void RF22::printBuffer(const char* prompt, const uint8_t* buf, uint8_t len) +{ +} + +uint8_t RF22::recv(uint8_t* buf, uint8_t* len) +{ + if (!available()) + return false; + + if (*len > _bufLen) + *len = _bufLen; + memcpy(buf, _buf, *len); + clearRxBuf(); + return true; +} + +void RF22::clearTxBuf() +{ + _bufLen = 0; + _txBufSentIndex = 0; +} + +void RF22::startTransmit() +{ + sendNextFragment(); // Actually the first fragment + spiWrite(RF22_REG_3E_PACKET_LENGTH, _bufLen); // Total length that will be sent + setModeTx(); // Start the transmitter, turns off the receiver +} + +// Restart the transmission of a packet that had a problem +void RF22::restartTransmit() +{ + _mode = RF22_MODE_IDLE; + _txBufSentIndex = 0; + startTransmit(); +} + +uint8_t RF22::send(const uint8_t* data, uint8_t len) +{ + waitPacketSent(); + + if (!fillTxBuf(data, len)) + return false; + startTransmit(); + + return true; +} + +uint8_t RF22::fillTxBuf(const uint8_t* data, uint8_t len) +{ + clearTxBuf(); + if (!len) + return false; + return appendTxBuf(data, len); +} + +uint8_t RF22::appendTxBuf(const uint8_t* data, uint8_t len) +{ + if (((uint16_t)_bufLen + len) > RF22_MAX_MESSAGE_LEN) + return false; + + memcpy(_buf + _bufLen, data, len); + _bufLen += len; + + return true; +} + +// Assumption: there is currently <= RF22_TXFFAEM_THRESHOLD bytes in the Tx FIFO +void RF22::sendNextFragment() +{ + if (_txBufSentIndex < _bufLen) + { + // Some left to send? + uint8_t len = _bufLen - _txBufSentIndex; + // But dont send too much + if (len > (RF22_FIFO_SIZE - RF22_TXFFAEM_THRESHOLD - 1)) + len = (RF22_FIFO_SIZE - RF22_TXFFAEM_THRESHOLD - 1); + spiBurstWrite(RF22_REG_7F_FIFO_ACCESS, _buf + _txBufSentIndex, len); + _txBufSentIndex += len; + } +} + +// Assumption: there are at least RF22_RXFFAFULL_THRESHOLD in the RX FIFO +// That means it should only be called after a RXFFAFULL interrupt +void RF22::readNextFragment() +{ + if (((uint16_t)_bufLen + RF22_RXFFAFULL_THRESHOLD) > RF22_MAX_MESSAGE_LEN) + return; // Hmmm receiver overflow. Should never occur + + // Read the RF22_RXFFAFULL_THRESHOLD octets that should be there + spiBurstRead(RF22_REG_7F_FIFO_ACCESS, _buf + _bufLen, RF22_RXFFAFULL_THRESHOLD); + _bufLen += RF22_RXFFAFULL_THRESHOLD; +} + +// Clear the FIFOs +void RF22::resetFifos() +{ + spiWrite(RF22_REG_08_OPERATING_MODE2, RF22_FFCLRRX | RF22_FFCLRTX); + spiWrite(RF22_REG_08_OPERATING_MODE2, 0); +} + +// Clear the Rx FIFO +void RF22::resetRxFifo() +{ + spiWrite(RF22_REG_08_OPERATING_MODE2, RF22_FFCLRRX); + spiWrite(RF22_REG_08_OPERATING_MODE2, 0); +} + +// CLear the TX FIFO +void RF22::resetTxFifo() +{ + spiWrite(RF22_REG_08_OPERATING_MODE2, RF22_FFCLRTX); + spiWrite(RF22_REG_08_OPERATING_MODE2, 0); +} + +// Default implmentation does nothing. Override if you wish +void RF22::handleExternalInterrupt() +{ +} + +// Default implmentation does nothing. Override if you wish +void RF22::handleWakeupTimerInterrupt() +{ +} + +void RF22::setHeaderTo(uint8_t to) +{ + spiWrite(RF22_REG_3A_TRANSMIT_HEADER3, to); +} + +void RF22::setHeaderFrom(uint8_t from) +{ + spiWrite(RF22_REG_3B_TRANSMIT_HEADER2, from); +} + +void RF22::setHeaderId(uint8_t id) +{ + spiWrite(RF22_REG_3C_TRANSMIT_HEADER1, id); +} + +void RF22::setHeaderFlags(uint8_t flags) +{ + spiWrite(RF22_REG_3D_TRANSMIT_HEADER0, flags); +} + +uint8_t RF22::headerTo() +{ + return spiRead(RF22_REG_47_RECEIVED_HEADER3); +} + +uint8_t RF22::headerFrom() +{ + return spiRead(RF22_REG_48_RECEIVED_HEADER2); +} + +uint8_t RF22::headerId() +{ + return spiRead(RF22_REG_49_RECEIVED_HEADER1); +} + +uint8_t RF22::headerFlags() +{ + return spiRead(RF22_REG_4A_RECEIVED_HEADER0); +} + +uint8_t RF22::lastRssi() +{ + return _lastRssi; +} + +void RF22::setPromiscuous(uint8_t promiscuous) +{ + spiWrite(RF22_REG_43_HEADER_ENABLE3, promiscuous ? 0x00 : 0xff); +} + +uint64_t +RF22::getTimestamp () { + struct timeval tv; + gettimeofday(&tv, NULL); + return (uint64_t)(1000000 * tv.tv_sec + tv.tv_usec); +} diff --git a/src/rf22/rf22.hpp b/src/rf22/rf22.hpp new file mode 100644 index 00000000..3a103697 --- /dev/null +++ b/src/rf22/rf22.hpp @@ -0,0 +1,987 @@ +/* + * Author: Kiveisha Yevgeniy + * Copyright (c) 2015-2016 Intel Corporation + * + * Author: Mike McCauley + * Copyright (c) 2011 Mike McCauley + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include +#include + +// This is the bit in the SPI address that marks it as a write +#define RF22_SPI_WRITE_MASK 0x80 + +// This is the maximum message length that can be supported by this library. Limited by +// the single message length octet in the header. +// Yes, 255 is correct even though the FIFO size in the RF22 is only +// 64 octets. We use interrupts to refill the Tx FIFO during transmission and to empty the +// Rx FIFO during reception +// Can be pre-defined to a smaller size (to save SRAM) prior to including this header +#ifndef RF22_MAX_MESSAGE_LEN +//#define RF22_MAX_MESSAGE_LEN 255 +#define RF22_MAX_MESSAGE_LEN 50 +#endif + +// Max number of octets the RF22 Rx and Tx FIFOs can hold +#define RF22_FIFO_SIZE 64 + +// Keep track of the mode the RF22 is in +#define RF22_MODE_IDLE 0 +#define RF22_MODE_RX 1 +#define RF22_MODE_TX 2 + +// These values we set for FIFO thresholds are actually the same as the POR values +#define RF22_TXFFAEM_THRESHOLD 4 +#define RF22_RXFFAFULL_THRESHOLD 55 + +// This is the default node address, +#define RF22_DEFAULT_NODE_ADDRESS 0 + +// This address in the TO address signifies a broadcast +#define RF22_BROADCAST_ADDRESS 0xff + +// Number of registers to be passed to setModemConfig() +#define RF22_NUM_MODEM_CONFIG_REGS 18 + +// Register names +#define RF22_REG_00_DEVICE_TYPE 0x00 +#define RF22_REG_01_VERSION_CODE 0x01 +#define RF22_REG_02_DEVICE_STATUS 0x02 +#define RF22_REG_03_INTERRUPT_STATUS1 0x03 +#define RF22_REG_04_INTERRUPT_STATUS2 0x04 +#define RF22_REG_05_INTERRUPT_ENABLE1 0x05 +#define RF22_REG_06_INTERRUPT_ENABLE2 0x06 +#define RF22_REG_07_OPERATING_MODE1 0x07 +#define RF22_REG_08_OPERATING_MODE2 0x08 +#define RF22_REG_09_OSCILLATOR_LOAD_CAPACITANCE 0x09 +#define RF22_REG_0A_UC_OUTPUT_CLOCK 0x0a +#define RF22_REG_0B_GPIO_CONFIGURATION0 0x0b +#define RF22_REG_0C_GPIO_CONFIGURATION1 0x0c +#define RF22_REG_0D_GPIO_CONFIGURATION2 0x0d +#define RF22_REG_0E_IO_PORT_CONFIGURATION 0x0e +#define RF22_REG_0F_ADC_CONFIGURATION 0x0f +#define RF22_REG_10_ADC_SENSOR_AMP_OFFSET 0x10 +#define RF22_REG_11_ADC_VALUE 0x11 +#define RF22_REG_12_TEMPERATURE_SENSOR_CALIBRATION 0x12 +#define RF22_REG_13_TEMPERATURE_VALUE_OFFSET 0x13 +#define RF22_REG_14_WAKEUP_TIMER_PERIOD1 0x14 +#define RF22_REG_15_WAKEUP_TIMER_PERIOD2 0x15 +#define RF22_REG_16_WAKEUP_TIMER_PERIOD3 0x16 +#define RF22_REG_17_WAKEUP_TIMER_VALUE1 0x17 +#define RF22_REG_18_WAKEUP_TIMER_VALUE2 0x18 +#define RF22_REG_19_LDC_MODE_DURATION 0x19 +#define RF22_REG_1A_LOW_BATTERY_DETECTOR_THRESHOLD 0x1a +#define RF22_REG_1B_BATTERY_VOLTAGE_LEVEL 0x1b +#define RF22_REG_1C_IF_FILTER_BANDWIDTH 0x1c +#define RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE 0x1d +#define RF22_REG_1E_AFC_TIMING_CONTROL 0x1e +#define RF22_REG_1F_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE 0x1f +#define RF22_REG_20_CLOCK_RECOVERY_OVERSAMPLING_RATE 0x20 +#define RF22_REG_21_CLOCK_RECOVERY_OFFSET2 0x21 +#define RF22_REG_22_CLOCK_RECOVERY_OFFSET1 0x22 +#define RF22_REG_23_CLOCK_RECOVERY_OFFSET0 0x23 +#define RF22_REG_24_CLOCK_RECOVERY_TIMING_LOOP_GAIN1 0x24 +#define RF22_REG_25_CLOCK_RECOVERY_TIMING_LOOP_GAIN0 0x25 +#define RF22_REG_26_RSSI 0x26 +#define RF22_REG_27_RSSI_THRESHOLD 0x27 +#define RF22_REG_28_ANTENNA_DIVERSITY1 0x28 +#define RF22_REG_29_ANTENNA_DIVERSITY2 0x29 +#define RF22_REG_2A_AFC_LIMITER 0x2a +#define RF22_REG_2B_AFC_CORRECTION_READ 0x2b +#define RF22_REG_2C_OOK_COUNTER_VALUE_1 0x2c +#define RF22_REG_2D_OOK_COUNTER_VALUE_2 0x2d +#define RF22_REG_2E_SLICER_PEAK_HOLD 0x2e +#define RF22_REG_30_DATA_ACCESS_CONTROL 0x30 +#define RF22_REG_31_EZMAC_STATUS 0x31 +#define RF22_REG_32_HEADER_CONTROL1 0x32 +#define RF22_REG_33_HEADER_CONTROL2 0x33 +#define RF22_REG_34_PREAMBLE_LENGTH 0x34 +#define RF22_REG_35_PREAMBLE_DETECTION_CONTROL1 0x35 +#define RF22_REG_36_SYNC_WORD3 0x36 +#define RF22_REG_37_SYNC_WORD2 0x37 +#define RF22_REG_38_SYNC_WORD1 0x38 +#define RF22_REG_39_SYNC_WORD0 0x39 +#define RF22_REG_3A_TRANSMIT_HEADER3 0x3a +#define RF22_REG_3B_TRANSMIT_HEADER2 0x3b +#define RF22_REG_3C_TRANSMIT_HEADER1 0x3c +#define RF22_REG_3D_TRANSMIT_HEADER0 0x3d +#define RF22_REG_3E_PACKET_LENGTH 0x3e +#define RF22_REG_3F_CHECK_HEADER3 0x3f +#define RF22_REG_40_CHECK_HEADER2 0x40 +#define RF22_REG_41_CHECK_HEADER1 0x41 +#define RF22_REG_42_CHECK_HEADER0 0x42 +#define RF22_REG_43_HEADER_ENABLE3 0x43 +#define RF22_REG_44_HEADER_ENABLE2 0x44 +#define RF22_REG_45_HEADER_ENABLE1 0x45 +#define RF22_REG_46_HEADER_ENABLE0 0x46 +#define RF22_REG_47_RECEIVED_HEADER3 0x47 +#define RF22_REG_48_RECEIVED_HEADER2 0x48 +#define RF22_REG_49_RECEIVED_HEADER1 0x49 +#define RF22_REG_4A_RECEIVED_HEADER0 0x4a +#define RF22_REG_4B_RECEIVED_PACKET_LENGTH 0x4b +#define RF22_REG_50_ANALOG_TEST_BUS_SELECT 0x50 +#define RF22_REG_51_DIGITAL_TEST_BUS_SELECT 0x51 +#define RF22_REG_52_TX_RAMP_CONTROL 0x52 +#define RF22_REG_53_PLL_TUNE_TIME 0x53 +#define RF22_REG_55_CALIBRATION_CONTROL 0x55 +#define RF22_REG_56_MODEM_TEST 0x56 +#define RF22_REG_57_CHARGE_PUMP_TEST 0x57 +#define RF22_REG_58_CHARGE_PUMP_CURRENT_TRIMMING 0x58 +#define RF22_REG_59_DIVIDER_CURRENT_TRIMMING 0x59 +#define RF22_REG_5A_VCO_CURRENT_TRIMMING 0x5a +#define RF22_REG_5B_VCO_CALIBRATION 0x5b +#define RF22_REG_5C_SYNTHESIZER_TEST 0x5c +#define RF22_REG_5D_BLOCK_ENABLE_OVERRIDE1 0x5d +#define RF22_REG_5E_BLOCK_ENABLE_OVERRIDE2 0x5e +#define RF22_REG_5F_BLOCK_ENABLE_OVERRIDE3 0x5f +#define RF22_REG_60_CHANNEL_FILTER_COEFFICIENT_ADDRESS 0x60 +#define RF22_REG_61_CHANNEL_FILTER_COEFFICIENT_VALUE 0x61 +#define RF22_REG_62_CRYSTAL_OSCILLATOR_POR_CONTROL 0x62 +#define RF22_REG_63_RC_OSCILLATOR_COARSE_CALIBRATION 0x63 +#define RF22_REG_64_RC_OSCILLATOR_FINE_CALIBRATION 0x64 +#define RF22_REG_65_LDO_CONTROL_OVERRIDE 0x65 +#define RF22_REG_66_LDO_LEVEL_SETTINGS 0x66 +#define RF22_REG_67_DELTA_SIGMA_ADC_TUNING1 0x67 +#define RF22_REG_68_DELTA_SIGMA_ADC_TUNING2 0x68 +#define RF22_REG_69_AGC_OVERRIDE1 0x69 +#define RF22_REG_6A_AGC_OVERRIDE2 0x6a +#define RF22_REG_6B_GFSK_FIR_FILTER_COEFFICIENT_ADDRESS 0x6b +#define RF22_REG_6C_GFSK_FIR_FILTER_COEFFICIENT_VALUE 0x6c +#define RF22_REG_6D_TX_POWER 0x6d +#define RF22_REG_6E_TX_DATA_RATE1 0x6e +#define RF22_REG_6F_TX_DATA_RATE0 0x6f +#define RF22_REG_70_MODULATION_CONTROL1 0x70 +#define RF22_REG_71_MODULATION_CONTROL2 0x71 +#define RF22_REG_72_FREQUENCY_DEVIATION 0x72 +#define RF22_REG_73_FREQUENCY_OFFSET1 0x73 +#define RF22_REG_74_FREQUENCY_OFFSET2 0x74 +#define RF22_REG_75_FREQUENCY_BAND_SELECT 0x75 +#define RF22_REG_76_NOMINAL_CARRIER_FREQUENCY1 0x76 +#define RF22_REG_77_NOMINAL_CARRIER_FREQUENCY0 0x77 +#define RF22_REG_79_FREQUENCY_HOPPING_CHANNEL_SELECT 0x79 +#define RF22_REG_7A_FREQUENCY_HOPPING_STEP_SIZE 0x7a +#define RF22_REG_7C_TX_FIFO_CONTROL1 0x7c +#define RF22_REG_7D_TX_FIFO_CONTROL2 0x7d +#define RF22_REG_7E_RX_FIFO_CONTROL 0x7e +#define RF22_REG_7F_FIFO_ACCESS 0x7f + +// These register masks etc are named wherever possible +// corresponding to the bit and field names in the RF-22 Manual +// RF22_REG_00_DEVICE_TYPE 0x00 +#define RF22_DEVICE_TYPE_RX_TRX 0x08 +#define RF22_DEVICE_TYPE_TX 0x07 + +// RF22_REG_02_DEVICE_STATUS 0x02 +#define RF22_FFOVL 0x80 +#define RF22_FFUNFL 0x40 +#define RF22_RXFFEM 0x20 +#define RF22_HEADERR 0x10 +#define RF22_FREQERR 0x08 +#define RF22_LOCKDET 0x04 +#define RF22_CPS 0x03 +#define RF22_CPS_IDLE 0x00 +#define RF22_CPS_RX 0x01 +#define RF22_CPS_TX 0x10 + +// RF22_REG_03_INTERRUPT_STATUS1 0x03 +#define RF22_IFFERROR 0x80 +#define RF22_ITXFFAFULL 0x40 +#define RF22_ITXFFAEM 0x20 +#define RF22_IRXFFAFULL 0x10 +#define RF22_IEXT 0x08 +#define RF22_IPKSENT 0x04 +#define RF22_IPKVALID 0x02 +#define RF22_ICRCERROR 0x01 + +// RF22_REG_04_INTERRUPT_STATUS2 0x04 +#define RF22_ISWDET 0x80 +#define RF22_IPREAVAL 0x40 +#define RF22_IPREAINVAL 0x20 +#define RF22_IRSSI 0x10 +#define RF22_IWUT 0x08 +#define RF22_ILBD 0x04 +#define RF22_ICHIPRDY 0x02 +#define RF22_IPOR 0x01 + +// RF22_REG_05_INTERRUPT_ENABLE1 0x05 +#define RF22_ENFFERR 0x80 +#define RF22_ENTXFFAFULL 0x40 +#define RF22_ENTXFFAEM 0x20 +#define RF22_ENRXFFAFULL 0x10 +#define RF22_ENEXT 0x08 +#define RF22_ENPKSENT 0x04 +#define RF22_ENPKVALID 0x02 +#define RF22_ENCRCERROR 0x01 + +// RF22_REG_06_INTERRUPT_ENABLE2 0x06 +#define RF22_ENSWDET 0x80 +#define RF22_ENPREAVAL 0x40 +#define RF22_ENPREAINVAL 0x20 +#define RF22_ENRSSI 0x10 +#define RF22_ENWUT 0x08 +#define RF22_ENLBDI 0x04 +#define RF22_ENCHIPRDY 0x02 +#define RF22_ENPOR 0x01 + +// RF22_REG_07_OPERATING_MODE 0x07 +#define RF22_SWRES 0x80 +#define RF22_ENLBD 0x40 +#define RF22_ENWT 0x20 +#define RF22_X32KSEL 0x10 +#define RF22_TXON 0x08 +#define RF22_RXON 0x04 +#define RF22_PLLON 0x02 +#define RF22_XTON 0x01 + +// RF22_REG_08_OPERATING_MODE2 0x08 +#define RF22_ANTDIV 0xc0 +#define RF22_RXMPK 0x10 +#define RF22_AUTOTX 0x08 +#define RF22_ENLDM 0x04 +#define RF22_FFCLRRX 0x02 +#define RF22_FFCLRTX 0x01 + +// RF22_REG_0F_ADC_CONFIGURATION 0x0f +#define RF22_ADCSTART 0x80 +#define RF22_ADCDONE 0x80 +#define RF22_ADCSEL 0x70 +#define RF22_ADCSEL_INTERNAL_TEMPERATURE_SENSOR 0x00 +#define RF22_ADCSEL_GPIO0_SINGLE_ENDED 0x10 +#define RF22_ADCSEL_GPIO1_SINGLE_ENDED 0x20 +#define RF22_ADCSEL_GPIO2_SINGLE_ENDED 0x30 +#define RF22_ADCSEL_GPIO0_GPIO1_DIFFERENTIAL 0x40 +#define RF22_ADCSEL_GPIO1_GPIO2_DIFFERENTIAL 0x50 +#define RF22_ADCSEL_GPIO0_GPIO2_DIFFERENTIAL 0x60 +#define RF22_ADCSEL_GND 0x70 +#define RF22_ADCREF 0x0c +#define RF22_ADCREF_BANDGAP_VOLTAGE 0x00 +#define RF22_ADCREF_VDD_ON_3 0x08 +#define RF22_ADCREF_VDD_ON_2 0x0c +#define RF22_ADCGAIN 0x03 + +// RF22_REG_10_ADC_SENSOR_AMP_OFFSET 0x10 +#define RF22_ADCOFFS 0x0f + +// RF22_REG_12_TEMPERATURE_SENSOR_CALIBRATION 0x12 +#define RF22_TSRANGE 0xc0 +#define RF22_TSRANGE_M64_64C 0x00 +#define RF22_TSRANGE_M64_192C 0x40 +#define RF22_TSRANGE_0_128C 0x80 +#define RF22_TSRANGE_M40_216F 0xc0 +#define RF22_ENTSOFFS 0x20 +#define RF22_ENTSTRIM 0x10 +#define RF22_TSTRIM 0x0f + +// RF22_REG_14_WAKEUP_TIMER_PERIOD1 0x14 +#define RF22_WTR 0x3c +#define RF22_WTD 0x03 + +// RF22_REG_1D_AFC_LOOP_GEARSHIFT_OVERRIDE 0x1d +#define RF22_AFBCD 0x80 +#define RF22_ENAFC 0x40 +#define RF22_AFCGEARH 0x38 +#define RF22_AFCGEARL 0x07 + +// RF22_REG_1E_AFC_TIMING_CONTROL 0x1e +#define RF22_SWAIT_TIMER 0xc0 +#define RF22_SHWAIT 0x38 +#define RF22_ANWAIT 0x07 + +// RF22_REG_30_DATA_ACCESS_CONTROL 0x30 +#define RF22_ENPACRX 0x80 +#define RF22_MSBFRST 0x00 +#define RF22_LSBFRST 0x40 +#define RF22_CRCHDRS 0x00 +#define RF22_CRCDONLY 0x20 +#define RF22_ENPACTX 0x08 +#define RF22_ENCRC 0x04 +#define RF22_CRC 0x03 +#define RF22_CRC_CCITT 0x00 +#define RF22_CRC_CRC_16_IBM 0x01 +#define RF22_CRC_IEC_16 0x02 +#define RF22_CRC_BIACHEVA 0x03 + +// RF22_REG_32_HEADER_CONTROL1 0x32 +#define RF22_BCEN 0xf0 +#define RF22_BCEN_NONE 0x00 +#define RF22_BCEN_HEADER0 0x10 +#define RF22_BCEN_HEADER1 0x20 +#define RF22_BCEN_HEADER2 0x40 +#define RF22_BCEN_HEADER3 0x80 +#define RF22_HDCH 0x0f +#define RF22_HDCH_NONE 0x00 +#define RF22_HDCH_HEADER0 0x01 +#define RF22_HDCH_HEADER1 0x02 +#define RF22_HDCH_HEADER2 0x04 +#define RF22_HDCH_HEADER3 0x08 + +// RF22_REG_33_HEADER_CONTROL2 0x33 +#define RF22_HDLEN 0x70 +#define RF22_HDLEN_0 0x00 +#define RF22_HDLEN_1 0x10 +#define RF22_HDLEN_2 0x20 +#define RF22_HDLEN_3 0x30 +#define RF22_HDLEN_4 0x40 +#define RF22_VARPKLEN 0x00 +#define RF22_FIXPKLEN 0x08 +#define RF22_SYNCLEN 0x06 +#define RF22_SYNCLEN_1 0x00 +#define RF22_SYNCLEN_2 0x02 +#define RF22_SYNCLEN_3 0x04 +#define RF22_SYNCLEN_4 0x06 +#define RF22_PREALEN8 0x01 + +// RF22_REG_6D_TX_POWER 0x6d +#define RF22_TXPOW 0x07 +#define RF22_TXPOW_4X31 0x08 // Not used in RFM22B +#define RF22_TXPOW_1DBM 0x00 +#define RF22_TXPOW_2DBM 0x01 +#define RF22_TXPOW_5DBM 0x02 +#define RF22_TXPOW_8DBM 0x03 +#define RF22_TXPOW_11DBM 0x04 +#define RF22_TXPOW_14DBM 0x05 +#define RF22_TXPOW_17DBM 0x06 +#define RF22_TXPOW_20DBM 0x07 +// IN RFM23B +#define RF22_TXPOW_LNA_SW 0x08 + +// RF22_REG_71_MODULATION_CONTROL2 0x71 +#define RF22_TRCLK 0xc0 +#define RF22_TRCLK_NONE 0x00 +#define RF22_TRCLK_GPIO 0x40 +#define RF22_TRCLK_SDO 0x80 +#define RF22_TRCLK_NIRQ 0xc0 +#define RF22_DTMOD 0x30 +#define RF22_DTMOD_DIRECT_GPIO 0x00 +#define RF22_DTMOD_DIRECT_SDI 0x10 +#define RF22_DTMOD_FIFO 0x20 +#define RF22_DTMOD_PN9 0x30 +#define RF22_ENINV 0x08 +#define RF22_FD8 0x04 +#define RF22_MODTYP 0x30 +#define RF22_MODTYP_UNMODULATED 0x00 +#define RF22_MODTYP_OOK 0x01 +#define RF22_MODTYP_FSK 0x02 +#define RF22_MODTYP_GFSK 0x03 + +// RF22_REG_75_FREQUENCY_BAND_SELECT 0x75 +#define RF22_SBSEL 0x40 +#define RF22_HBSEL 0x20 +#define RF22_FB 0x1f + +// Define this to include Serial printing in diagnostic routines +#define RF22_HAVE_SERIAL + +namespace upm { + +/** + * @brief RF22 Wireless Transceiver library + * @defgroup rf22 libupm-rf22 + * @ingroup sparkfun spi wifi + */ +/** + * @library rf22 + * @sensor rf22 + * @comname RF22 Transceiver + * @altname RFM22B + * @type wifi + * @man sparkfun + * @web https://www.sparkfun.com/products/12030 + * @con spi + * + * @brief API for the RF22 Transceiver Module + * + * This base class provides basic functions for sending and receiving unaddressable, + * unreliable datagrams of arbitrary length to 255 octets per packet. + * + * Subclasses may use this class to implement reliable, addressed datagrams and streams, + * mesh routers, repeaters, translators etc. + * + * On transmission, the TO and FROM addresses default to 0x00, unless changed by a subclass. + * On reception the TO addressed is checked against the node address (defaults to 0x00) or the + * broadcast address (which is 0xff). The ID and FLAGS are set to 0, and not checked by this class. + * This permits use of the this base RF22 class as an unaddressable, unreliable datagram service. + * Subclasses are expected to change this behavior to add node address, ids, retransmission etc. + * + * Naturally, for any 2 radios to communicate that must be configured to use the same frequency and + * modulation scheme. + * + * @image html rf22.jpg + *
RF22 Sensor image provided by SparkFun* under + *
+ * CC BY-NC-SA-3.0. + * + * @snippet rf22-server.cxx Interesting + * @snippet rf22-client.cxx Interesting + */ +class RF22 +{ +public: + + /** + * @brief Defines register values for a set of modem configuration registers + * + * Defines register values for a set of modem configuration registers + * that can be passed to setModemConfig() + * if none of the choices in ModemConfigChoice suit your need + * setModemConfig() writes the register values to the appropriate RF22 registers + * to set the desired modulation type, data rate and deviation/bandwidth. + * Suitable values for these registers can be computed using the register calculator at + * http://www.hoperf.com/upload/rf/RF22B%2023B%2031B%2042B%2043B%20Register%20Settings_RevB1-v5.xls + */ + typedef struct + { + uint8_t reg_1c; ///< Value for register RF22_REG_1C_IF_FILTER_BANDWIDTH + uint8_t reg_1f; ///< Value for register RF22_REG_1F_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE + uint8_t reg_20; ///< Value for register RF22_REG_20_CLOCK_RECOVERY_OVERSAMPLING_RATE + uint8_t reg_21; ///< Value for register RF22_REG_21_CLOCK_RECOVERY_OFFSET2 + uint8_t reg_22; ///< Value for register RF22_REG_22_CLOCK_RECOVERY_OFFSET1 + uint8_t reg_23; ///< Value for register RF22_REG_23_CLOCK_RECOVERY_OFFSET0 + uint8_t reg_24; ///< Value for register RF22_REG_24_CLOCK_RECOVERY_TIMING_LOOP_GAIN1 + uint8_t reg_25; ///< Value for register RF22_REG_25_CLOCK_RECOVERY_TIMING_LOOP_GAIN0 + uint8_t reg_2c; ///< Value for register RF22_REG_2C_OOK_COUNTER_VALUE_1 + uint8_t reg_2d; ///< Value for register RF22_REG_2D_OOK_COUNTER_VALUE_2 + uint8_t reg_2e; ///< Value for register RF22_REG_2E_SLICER_PEAK_HOLD + uint8_t reg_58; ///< Value for register RF22_REG_58_CHARGE_PUMP_CURRENT_TRIMMING + uint8_t reg_69; ///< Value for register RF22_REG_69_AGC_OVERRIDE1 + uint8_t reg_6e; ///< Value for register RF22_REG_6E_TX_DATA_RATE1 + uint8_t reg_6f; ///< Value for register RF22_REG_6F_TX_DATA_RATE0 + uint8_t reg_70; ///< Value for register RF22_REG_70_MODULATION_CONTROL1 + uint8_t reg_71; ///< Value for register RF22_REG_71_MODULATION_CONTROL2 + uint8_t reg_72; ///< Value for register RF22_REG_72_FREQUENCY_DEVIATION + } ModemConfig; + + /** + * Choices for setModemConfig() for a selected subset of common modulation types, + * and data rates. If you need another configuration, use the register calculator. + * and call setModemRegisters() with your desired settings + * These are indexes into _modemConfig + */ + typedef enum + { + UnmodulatedCarrier = 0, ///< Unmodulated carrier for testing + FSK_PN9_Rb2Fd5, ///< FSK, No Manchester, Rb = 2kbs, Fd = 5kHz, PN9 random modulation for testing + + FSK_Rb2Fd5, ///< FSK, No Manchester, Rb = 2kbs, Fd = 5kHz + FSK_Rb2_4Fd36, ///< FSK, No Manchester, Rb = 2.4kbs, Fd = 36kHz + FSK_Rb4_8Fd45, ///< FSK, No Manchester, Rb = 4.8kbs, Fd = 45kHz + FSK_Rb9_6Fd45, ///< FSK, No Manchester, Rb = 9.6kbs, Fd = 45kHz + FSK_Rb19_2Fd9_6, ///< FSK, No Manchester, Rb = 19.2kbs, Fd = 9.6kHz + FSK_Rb38_4Fd19_6, ///< FSK, No Manchester, Rb = 38.4kbs, Fd = 19.6kHz + FSK_Rb57_6Fd28_8, ///< FSK, No Manchester, Rb = 57.6kbs, Fd = 28.8kHz + FSK_Rb125Fd125, ///< FSK, No Manchester, Rb = 125kbs, Fd = 125kHz + + GFSK_Rb2Fd5, ///< GFSK, No Manchester, Rb = 2kbs, Fd = 5kHz + GFSK_Rb2_4Fd36, ///< GFSK, No Manchester, Rb = 2.4kbs, Fd = 36kHz + GFSK_Rb4_8Fd45, ///< GFSK, No Manchester, Rb = 4.8kbs, Fd = 45kHz + GFSK_Rb9_6Fd45, ///< GFSK, No Manchester, Rb = 9.6kbs, Fd = 45kHz + GFSK_Rb19_2Fd9_6, ///< GFSK, No Manchester, Rb = 19.2kbs, Fd = 9.6kHz + GFSK_Rb38_4Fd19_6, ///< GFSK, No Manchester, Rb = 38.4kbs, Fd = 19.6kHz + GFSK_Rb57_6Fd28_8, ///< GFSK, No Manchester, Rb = 57.6kbs, Fd = 28.8kHz + GFSK_Rb125Fd125, ///< GFSK, No Manchester, Rb = 125kbs, Fd = 125kHz + + OOK_Rb1_2Bw75, ///< OOK, No Manchester, Rb = 1.2kbs, Rx Bandwidth = 75kHz + OOK_Rb2_4Bw335, ///< OOK, No Manchester, Rb = 2.4kbs, Rx Bandwidth = 335kHz + OOK_Rb4_8Bw335, ///< OOK, No Manchester, Rb = 4.8kbs, Rx Bandwidth = 335kHz + OOK_Rb9_6Bw335, ///< OOK, No Manchester, Rb = 9.6kbs, Rx Bandwidth = 335kHz + OOK_Rb19_2Bw335, ///< OOK, No Manchester, Rb = 19.2kbs, Rx Bandwidth = 335kHz + OOK_Rb38_4Bw335, ///< OOK, No Manchester, Rb = 38.4kbs, Rx Bandwidth = 335kHz + OOK_Rb40Bw335 ///< OOK, No Manchester, Rb = 40kbs, Rx Bandwidth = 335kHz + } ModemConfigChoice; + + /** + * Constructor. You can have multiple instances, but each instance must have its own + * interrupt and slave select pin. After constructing, you must call init() to initialize the interface + * and the radio module + * @param[in] spiBus Pointer to the SPI interface object to use. Default 0 or the standard Arduino hardware + * SPI interface + * @param[in] slaveSelectPin the Arduino pin number of the output to use to select the RF22 before + * accessing it. Default is 10 or the normal SS pin for Arduino + * @param[in] interruptPin The interrupt pin number to use. Default is 2 + */ + RF22(uint8_t spiBus = 0, uint8_t slaveSelectPin = 10, uint8_t interruptPin = 2); + + /** + * Destructor. + */ + virtual ~RF22(); + + /** + * Initializes this instance and the radio module connected to it. + * The following steps are taken: + * - Software reset the RF22 module + * - Checks the connected RF22 module is either a RF22_DEVICE_TYPE_RX_TRX or a RF22_DEVICE_TYPE_TX + * - Configures the RF22 module + * - Sets the frequency to 434.0 MHz + * - Sets the modem data rate to FSK_Rb2_4Fd36 + * @return true if everything was successful + */ + uint8_t init(); + + /** + * Issues a software reset to the + * RF22 module. Blocks for 1ms to ensure the reset is complete. + */ + void reset(); + + /** + * Reads a single register from the RF22 + * @param[in] reg Register number, one of RF22_REG_* + * @return The value of the register + */ + uint8_t spiRead(uint8_t reg); + + /** + * Writes a single byte to the RF22 + * @param[in] reg Register number, one of RF22_REG_* + * @param[in] val The value to write + */ + void spiWrite(uint8_t reg, uint8_t val); + + /** + * Reads a number of consecutive registers from the RF22 using burst read mode + * @param[in] reg Register number of the first register, one of RF22_REG_* + * @param[in] dest Array to write the register values to. Must be at least len bytes + * @param[in] len Number of bytes to read + */ + void spiBurstRead(uint8_t reg, uint8_t* dest, uint8_t len); + + /** + * Write a number of consecutive registers using burst write mode + * @param[in] reg Register number of the first register, one of RF22_REG_* + * @param[in] src Array of new register values to write. Must be at least len bytes + * @param[in] len Number of bytes to write + */ + void spiBurstWrite(uint8_t reg, const uint8_t* src, uint8_t len); + + /** + * Reads and returns the device status register RF22_REG_02_DEVICE_STATUS + * @return The value of the device status register + */ + uint8_t statusRead(); + + /** + * Reads a value from the on-chip analog-digital converter + * @param[in] adcsel Selects the ADC input to measure. One of RF22_ADCSEL_*. Defaults to the + * internal temperature sensor + * @param[in] adcref Specifies the reference voltage to use. One of RF22_ADCREF_*. + * Defaults to the internal bandgap voltage. + * @param[in] adcgain Amplifier gain selection. + * @param[in] adcoffs Amplifier offset (0 to 15). + * @return The analog value. 0 to 255. + */ + uint8_t adcRead(uint8_t adcsel = RF22_ADCSEL_INTERNAL_TEMPERATURE_SENSOR, + uint8_t adcref = RF22_ADCREF_BANDGAP_VOLTAGE, + uint8_t adcgain = 0, + uint8_t adcoffs = 0); + + /** + * Reads the on-chip temperature sensor + * @param[in] tsrange Specifies the temperature range to use. One of RF22_TSRANGE_* + * @param[in] tvoffs Specifies the temperature value offset. This is actually signed value + * added to the measured temperature value + * @return The measured temperature. + */ + uint8_t temperatureRead(uint8_t tsrange = RF22_TSRANGE_M64_64C, uint8_t tvoffs = 0); + + /** + * Reads the wakeup timer value in registers RF22_REG_17_WAKEUP_TIMER_VALUE1 + * and RF22_REG_18_WAKEUP_TIMER_VALUE2 + * @return The wakeup timer value + */ + uint16_t wutRead(); + + /** + * Sets the wakeup timer period registers RF22_REG_14_WAKEUP_TIMER_PERIOD1, + * RF22_REG_15_WAKEUP_TIMER_PERIOD2 and RF22_R 0) + * @return true if the message length was valid and it was correctly queued for transmit + */ + uint8_t send(const uint8_t* data, uint8_t len); + + /** + * Blocks until the RF22 is not in mode RF22_MODE_TX (i.e. until the RF22 is not transmitting). + * This effectively waits until any previous transmit packet is finished being transmitted. + */ + void waitPacketSent(); + + /** + * Tells the receiver to accept messages with any TO address, not just messages + * addressed to this node or the broadcast address + * @param[in] promiscuous true if you wish to receive messages with any TO address + */ + void setPromiscuous(uint8_t promiscuous); + + /** + * Returns the TO header of the last received message + * @return The TO header + */ + uint8_t headerTo(); + + /** + * Returns the FROM header of the last received message + * @return The FROM header + */ + uint8_t headerFrom(); + + /** + * Returns the ID header of the last received message + * @return The ID header + */ + uint8_t headerId(); + + /** + * Returns the FLAGS header of the last received message + * @return The FLAGS header + */ + uint8_t headerFlags(); + + /** + * Returns the RSSI (Receiver Signal Strength Indicator) + * of the last received message. This measurement is taken when + * the preamble has been received. It is a (non-linear) measure of the received signal strength. + * @return The RSSI + */ + uint8_t lastRssi(); + + /** + * Prints a data buffer in HEX. + * For diagnostic use + * @param[in] prompt string to preface the print + * @param[in] buf Location of the buffer to print + * @param[in] len Length of the buffer in octets. + */ + static void printBuffer(const char* prompt, const uint8_t* buf, uint8_t len); + + /** + * Sets the length of the preamble + * in 4-bit nibbles. + * Caution: this should be set to the same + * value on all nodes in your network. Default is 8. + * Sets the message preamble length in RF22_REG_34_PREAMBLE_LENGTH + * @param[in] nibbles Preamble length in nibbles of 4 bits each. + */ + void setPreambleLength(uint8_t nibbles); + + /** + * Sets the sync words for transmit and receive in registers RF22_REG_36_SYNC_WORD3 + * to RF22_REG_39_SYNC_WORD0 + * Caution: this should be set to the same + * value on all nodes in your network. Default is { 0x2d, 0xd4 } + * @param[in] syncWords Array of sync words + * @param[in] len Number of sync words to set + */ + void setSyncWords(const uint8_t* syncWords, uint8_t len); + +protected: + /** + * This is a low level function to handle the interrupts for one instance of RF22. + * Called automatically when interrupt pin goes low, should not need to be called by user. + */ + void handleInterrupt(); + + /** + * Clears the receiver buffer. + * Internal use only + */ + void clearRxBuf(); + + /** + * Clears the transmitter buffer + * Internal use only + */ + void clearTxBuf(); + + /** + * Fills the transmitter buffer with the data of a message to be sent + * @param[in] data Array of data bytes to be sent (1 to 255) + * @param[in] len Number of data bytes in data (> 0) + * @return true if the message length is valid + */ + uint8_t fillTxBuf(const uint8_t* data, uint8_t len); + + /** + * Appends the transmitter buffer with the data of a message to be sent + * @param[in] data Array of data bytes to be sent (0 to 255) + * @param[in] len Number of data bytes in data + * @return false if the resulting message would exceed RF22_MAX_MESSAGE_LEN, else true + */ + uint8_t appendTxBuf(const uint8_t* data, uint8_t len); + + /** + * Internal function to load the next fragment of + * the current message into the transmitter FIFO + * Internal use only + */ + void sendNextFragment(); + + /** + * Function to copy the next fragment from + * the receiver FIFO into the receiver buffer + */ + void readNextFragment(); + + /** + * Clears the RF22 Rx and Tx FIFOs + * Internal use only + */ + void resetFifos(); + + /** + * Clears the RF22 Rx FIFO + * Internal use only + */ + void resetRxFifo(); + + /** + * Clears the RF22 Tx FIFO + * Internal use only + */ + void resetTxFifo(); + + /** + * This function will be called by handleInterrupt() if an RF22 external interrupt occurs. + * This can only happen if external interrupts are enabled in the RF22 + * (which they are not by default). + * Subclasses may override this function to get control when an RF22 external interrupt occurs. + */ + virtual void handleExternalInterrupt(); + + /** + * This function will be called by handleInterrupt() if an RF22 wakeup timer interrupt occurs. + * This can only happen if wakeup timer interrupts are enabled in the RF22 + * (which they are not by default). + * Subclasses may override this function to get control when an RF22 wakeup timer interrupt occurs. + */ + virtual void handleWakeupTimerInterrupt(); + + /** + * Sets the TO header to be sent in all subsequent messages + * @param[in] to The new TO header value + */ + void setHeaderTo(uint8_t to); + + /** + * Sets the FROM header to be sent in all subsequent messages + * @param[in] from The new FROM header value + */ + void setHeaderFrom(uint8_t from); + + /** + * Sets the ID header to be sent in all subsequent messages + * @param[in] id The new ID header value + */ + void setHeaderId(uint8_t id); + + /** + * Sets the FLAGS header to be sent in all subsequent messages + * @param[in] flags The new FLAGS header value + */ + void setHeaderFlags(uint8_t flags); + + /** + * Start the transmission of the contents + * of the Tx buffer + */ + void startTransmit(); + + /** + * ReStart the transmission of the contents + * of the Tx buffer after a transmission failure + */ + void restartTransmit(); + uint64_t getTimestamp (); + +private: + /** + * Static interrupt handler wrapper + */ + static void isr(void* args); + + mraa_spi_context _spi; + mraa_gpio_context _cs; + mraa_gpio_context _irq; + + volatile uint8_t _mode; // One of RF22_MODE_* + + uint8_t _idleMode; + uint8_t _deviceType; + + // These volatile members may get changed in the interrupt service routine + volatile uint8_t _bufLen; + uint8_t _buf[RF22_MAX_MESSAGE_LEN]; + + volatile uint8_t _rxBufValid; + volatile uint8_t _txBufSentIndex; + + volatile uint16_t _rxBad; + volatile uint16_t _rxGood; + volatile uint16_t _txGood; + + volatile uint8_t _lastRssi; +}; + +}