From 0bc7208827c1eaeb4df6a8874f5d7ae21f46b358 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:17:01 +0100 Subject: [PATCH] [RF69] Changed pin mapping --- examples/RF69/RF69_Receive/RF69_Receive.ino | 4 +- .../RF69_Receive_AES/RF69_Receive_AES.ino | 4 +- .../RF69_Receive_Address.ino | 4 +- .../RF69_Receive_Interrupt.ino | 4 +- examples/RF69/RF69_Settings/RF69_Settings.ino | 8 +-- examples/RF69/RF69_Transmit/RF69_Transmit.ino | 4 +- .../RF69_Transmit_AES/RF69_Transmit_AES.ino | 4 +- .../RF69_Transmit_Address.ino | 4 +- .../RF69_Transmit_Interrupt.ino | 4 +- src/modules/RF69/RF69.cpp | 62 +++++++++++++------ src/modules/RF69/RF69.h | 9 ++- 11 files changed, 70 insertions(+), 41 deletions(-) diff --git a/examples/RF69/RF69_Receive/RF69_Receive.ino b/examples/RF69/RF69_Receive/RF69_Receive.ino index fb8b69bd..e45e45c0 100644 --- a/examples/RF69/RF69_Receive/RF69_Receive.ino +++ b/examples/RF69/RF69_Receive/RF69_Receive.ino @@ -17,9 +17,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino b/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino index cc5e074a..9fb3a5c6 100644 --- a/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino +++ b/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino @@ -13,9 +13,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino b/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino index c0444357..d1095ba3 100644 --- a/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino +++ b/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino @@ -15,9 +15,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino index a38ec020..e25dc64b 100644 --- a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino +++ b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino @@ -13,9 +13,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Settings/RF69_Settings.ino b/examples/RF69/RF69_Settings/RF69_Settings.ino index 1e5363ab..d4f5a158 100644 --- a/examples/RF69/RF69_Settings/RF69_Settings.ino +++ b/examples/RF69/RF69_Settings/RF69_Settings.ino @@ -19,15 +19,15 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf1 = new Module(10, 2, 3); // second CC1101 has different connections: -// NSS pin: 9 +// CS pin: 9 // DIO0 pin: 4 -// DIO1 pin: 5 +// RESET pin: 5 RF69 rf2 = new Module(9, 4, 5); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit/RF69_Transmit.ino b/examples/RF69/RF69_Transmit/RF69_Transmit.ino index eb818b22..8e6fea55 100644 --- a/examples/RF69/RF69_Transmit/RF69_Transmit.ino +++ b/examples/RF69/RF69_Transmit/RF69_Transmit.ino @@ -15,9 +15,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino b/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino index b0b127ff..03f98a2e 100644 --- a/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino +++ b/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino @@ -13,9 +13,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino b/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino index 03b61a70..69e7d102 100644 --- a/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino +++ b/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino @@ -15,9 +15,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino b/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino index 684a9a9d..59dd02fb 100644 --- a/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino +++ b/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino @@ -16,9 +16,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 1f236485..bf1d83a9 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -14,7 +14,11 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT, int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { // set module properties - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_0); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); + + // reset the module + reset(); // try to find the RF69 chip uint8_t i = 0; @@ -101,15 +105,34 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe return(ERR_NONE); } +void RF69::reset() { + Module::pinMode(_mod->getRst(), OUTPUT); + Module::digitalWrite(_mod->getRst(), HIGH); + delayMicroseconds(100); + Module::digitalWrite(_mod->getRst(), LOW); + Module::pinMode(_mod->getRst(), INPUT); + delay(10); +} + int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) { + // calculate timeout (5ms + 500 % of expected time-on-air) + uint32_t timeout = 5000000 + (uint32_t)((((float)(len * 8)) / (_br * 1000.0)) * 5000000.0); + // start transmission int16_t state = startTransmit(data, len, addr); if(state != ERR_NONE) { return(state); } - // wait for transmission end - while(!digitalRead(_mod->getInt0())); + // wait for transmission end or timeout + uint32_t start = micros(); + while(!digitalRead(_mod->getIrq())) { + if(micros() - start > timeout) { + standby(); + clearIRQFlags(); + return(ERR_TX_TIMEOUT); + } + } // clear interrupt flags clearIRQFlags(); @@ -118,15 +141,20 @@ int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) { } int16_t RF69::receive(uint8_t* data, size_t len) { + // calculate timeout (500 ms + 400 full 64-byte packets at current bit rate) + uint32_t timeout = 500000 + (1.0/(_br*1000.0))*(RF69_MAX_PACKET_LENGTH*400.0); + // start reception - int16_t state = startReceive(true); + int16_t state = startReceive(); if(state != ERR_NONE) { return(state); } // wait for packet reception or timeout - while(!digitalRead(_mod->getInt0())) { - if(digitalRead(_mod->getInt1())) { + uint32_t start = micros(); + while(!digitalRead(_mod->getIrq())) { + if(micros() - start > timeout) { + standby(); clearIRQFlags(); return(ERR_RX_TIMEOUT); } @@ -208,20 +236,14 @@ int16_t RF69::disableAES() { return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_AES_OFF, 0, 0)); } -int16_t RF69::startReceive(bool timeout) { +int16_t RF69::startReceive() { // set mode to standby int16_t state = setMode(RF69_STANDBY); // set RX timeouts and DIO pin mapping - if(timeout) { - state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY | RF69_DIO1_PACK_TIMEOUT, 7, 4); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH); - } else { - state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY, 7, 6); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START_OFF); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH_OFF); - } + state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY, 7, 4); + state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START); + state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH); if(state != ERR_NONE) { return(state); } @@ -238,11 +260,15 @@ int16_t RF69::startReceive(bool timeout) { } void RF69::setDio0Action(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt0()), func, RISING); + attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING); } void RF69::setDio1Action(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt1()), func, RISING); + if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + return; + } + Module::pinMode(_mod->getGpio(), INPUT); + attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, RISING); } int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index fbe8abb2..8f3a0a4c 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -464,6 +464,11 @@ class RF69: public PhysicalLayer { */ int16_t begin(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13); + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + */ + void reset(); + /*! \brief Blocking binary transmit method. Overloads for string-based transmissions are implemented in PhysicalLayer. @@ -581,11 +586,9 @@ class RF69: public PhysicalLayer { /*! \brief Interrupt-driven receive method. GDO0 will be activated when full packet is received. - \param timeout Enable module-driven timeout. Set to false for listen mode. - \returns \ref status_codes */ - int16_t startReceive(bool timeout = false); + int16_t startReceive(); /*! \brief Reads data received after calling startReceive method.