Prevent spurious resets on some boards

My receiver was failing to receive after a random amount of time (2 - 60
seconds). I discovered some power supply issues (DC-DC converter
related) that turned out to be another cause of the same problem but
only on some boards.

The reset procedure for most of the boards that RadioLib can drive
changes the pin mode of the reset line to an input after reset,
effectively tri-stating the output. I had seen this but dismissed it
after checking that the SX126x has a pullup on NRST meaning this was not
an issue.

The receiver I have produced uses a level converter to translate the 5v0
signals to 3v3. The level converters are not themselves pulled up or
down, which means when a pin is connected in a high-impedance input
state it will float around possibly randomly.

This can cause spurious resets on my board, and possibly others. I
remembered the reset procedure when I realised I could reproduce the
problem by rubbing the board on my shirt, probably causing some ESD to
trigger a change on the reset line.

This PR simply removes the lines that change the pinmode to input after
reset leaving it as an output which is hard-driven and the safest way. I
assume that the current behaviour was chosen to decrease the chance of a
conflict if used incorrectly.
This commit is contained in:
Callan Bryant 2020-01-29 15:00:36 +00:00
parent 7b10bd4e0f
commit c49323fa78
No known key found for this signature in database
GPG key ID: C31FA9DF3ACBFFAA
4 changed files with 0 additions and 4 deletions

View file

@ -95,7 +95,6 @@ void RF69::reset() {
Module::digitalWrite(_mod->getRst(), HIGH); Module::digitalWrite(_mod->getRst(), HIGH);
delayMicroseconds(100); delayMicroseconds(100);
Module::digitalWrite(_mod->getRst(), LOW); Module::digitalWrite(_mod->getRst(), LOW);
Module::pinMode(_mod->getRst(), INPUT);
delay(10); delay(10);
} }

View file

@ -155,7 +155,6 @@ int16_t SX126x::reset(bool verify) {
Module::digitalWrite(_mod->getRst(), LOW); Module::digitalWrite(_mod->getRst(), LOW);
delayMicroseconds(150); delayMicroseconds(150);
Module::digitalWrite(_mod->getRst(), HIGH); Module::digitalWrite(_mod->getRst(), HIGH);
Module::pinMode(_mod->getRst(), INPUT);
// return immediately when verification is disabled // return immediately when verification is disabled
if(!verify) { if(!verify) {

View file

@ -126,7 +126,6 @@ void SX127x::reset() {
Module::digitalWrite(_mod->getRst(), LOW); Module::digitalWrite(_mod->getRst(), LOW);
delayMicroseconds(100); delayMicroseconds(100);
Module::digitalWrite(_mod->getRst(), HIGH); Module::digitalWrite(_mod->getRst(), HIGH);
Module::pinMode(_mod->getRst(), INPUT);
delay(5); delay(5);
} }

View file

@ -56,7 +56,6 @@ void XBee::reset() {
digitalWrite(_mod->getRst(), LOW); digitalWrite(_mod->getRst(), LOW);
delayMicroseconds(200); delayMicroseconds(200);
digitalWrite(_mod->getRst(), HIGH); digitalWrite(_mod->getRst(), HIGH);
pinMode(_mod->getRst(), INPUT);
} }
int16_t XBee::transmit(uint8_t* dest, const char* payload, uint8_t radius) { int16_t XBee::transmit(uint8_t* dest, const char* payload, uint8_t radius) {