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.
pull/108/head
Callan Bryant 2020-01-29 15:00:36 +00:00
rodzic 7b10bd4e0f
commit c49323fa78
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: C31FA9DF3ACBFFAA
4 zmienionych plików z 0 dodań i 4 usunięć

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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