Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RF24: Implement MY_RF24_INVERTED_ACK hack #1463

Open
wants to merge 5 commits into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions MyConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,48 @@
#define MY_RF24_CHANNEL (76)
#endif

/**
* @def MY_RF24_INVERTED_ACK
* @brief Assume that this node's radio auto-ack bit is reversed
*
* Define this if this node has a wireless chip with AutoACK bit reversed
* compared to wireless chip in the gateway. Read this for more details.
*
* There are a dozen nRF24L01+ clones out there in the wild. A few of them (SI24R01)
* have their AutoACK bit inverted, due to a bug in the original doc they ripped off
*
* If this define doesn't help with your setup (and your clones are even weirder),
* here are a few more tricks:
*
* 1. Assign a static Parent ID and Node ID for your node.
*
* #define MY_NODE_ID 1
* #define MY_PARENT_NODE_ID 0
* #define MY_PARENT_NODE_IS_STATIC
*
* However you loose the automated 'mesh' organisation function of the network.
* That is not fun, but it's okay for some leak sensors that should have this static
* anyway.
*
* 2. Try different speeds. Some of the fakes I got don't play along with genuine
* chips nicely when the speed is 250Kbps. 1Mbps and 2Mbps work fine.
*
* 3. Put your finger on the PCB antenna. If the thing starts working, you are missing
* a 1 pF capacitor on the module. See this post:
*
* https://ncrmnt.org/2021/01/03/nrf24l01-fixing-the-magic-finger-problem/
*
*
* Obligatory reading material:
*
* https://sigrok.org/wiki/Protocol_decoder:Nrf24l01 - A list of clones and their 'features'
* https://hackaday.com/2015/02/23/nordic-nrf24l01-real-vs-fake/ - Hack-a-Day article describing the problem
* https://forum.mysensors.org/topic/9947/nrf24l01-si24r1 - mysensors forum thread
* https://ncrmnt.org/2015/03/13/how-do-i-cost-optimize-nrf24l01/ - Missing components on some COB fakes
*
*/
//#define MY_RF24_INVERTED_ACK

/**
* @def MY_RF24_DATARATE
* @brief RF24 data rate.
Expand Down Expand Up @@ -1111,6 +1153,15 @@
#define MY_TRANSPORT_DISCOVERY_INTERVAL_MS (20*60*1000ul)
#endif

/**
* @def MY_TRANSPORT_SEND_RETRIES
* @brief If defined to a positive number N, the node will try to send the payload to the
* uplink up to N times before actually failing. Useful when working in a noisy environment
* @note Setting this option too high will
*
*/
//#define MY_TRANSPORT_SEND_RETRIES (5)

/**
*@def MY_TRANSPORT_UPLINK_CHECK_DISABLED
*@brief If defined, disables uplink check to GW during transport initialisation
Expand Down
8 changes: 8 additions & 0 deletions hal/transport/MyTransportHAL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,15 @@ bool transportHALSend(const uint8_t nextRecipient, const MyMessage *outMsg, cons
const uint8_t finalLength = len;
#endif

#ifdef MY_TRANSPORT_SEND_RETRIES
uint8_t retries = MY_TRANSPORT_SEND_RETRIES;
bool result = false;
while (retries-- && (!result)) {
result = transportSend(nextRecipient, (void *)tx_data, finalLength, noACK);
}
#else
bool result = transportSend(nextRecipient, (void *)tx_data, finalLength, noACK);
#endif
TRANSPORT_HAL_DEBUG(PSTR("THA:SND:MSG LEN=%" PRIu8 ",RES=%" PRIu8 "\n"), finalLength, result);
return result;
}
Expand Down
2 changes: 2 additions & 0 deletions hal/transport/RF24/driver/RF24.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,9 @@ LOCAL void RF24_setNodeAddress(const uint8_t address)
// enable node pipe
RF24_setPipe(_BV(RF24_ERX_P0 + RF24_BROADCAST_PIPE) | _BV(RF24_ERX_P0));
// enable autoACK on pipe 0
#ifndef MY_RF24_INVERTED_ACK
RF24_setAutoACK(_BV(RF24_ENAA_P0));
#endif
}
}

Expand Down
2 changes: 2 additions & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ MY_SIGNAL_REPORT_ENABLED LITERAL1
MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS LITERAL1
MY_SMART_SLEEP_WAIT_DURATION_MS LITERAL1
MY_TRANSPORT_CHKUPL_INTERVAL_MS LITERAL1
MY_TRANSPORT_SEND_RETRIES LITERAL1
MY_TRANSPORT_DISCOVERY_INTERVAL_MS LITERAL1
MY_TRANSPORT_MAX_TSM_FAILURES LITERAL1
MY_TRANSPORT_MAX_TX_FAILURES LITERAL1
Expand Down Expand Up @@ -158,6 +159,7 @@ MY_RF24_BASE_RADIO_ID LITERAL1
MY_RF24_ENABLE_ENCRYPTION LITERAL1
MY_RF24_CE_PIN LITERAL1
MY_RF24_CHANNEL LITERAL1
MY_RF24_INVERTED_ACK LITERAL1
MY_RF24_CS_PIN LITERAL1
MY_RF24_DATARATE LITERAL1
MY_RF24_IRQ_PIN LITERAL1
Expand Down