From 7ddd9549738a7e06f90185763dfc4834b80cc99b Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Sat, 7 Aug 2021 17:05:33 -0700 Subject: [PATCH] Correct State Clearing (#511) --- src/internal/Esp32_i2s.c | 61 ++++++++++++++++++-------------- src/internal/NeoEsp32I2sMethod.h | 3 +- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/internal/Esp32_i2s.c b/src/internal/Esp32_i2s.c index d25856a..ec49e0a 100644 --- a/src/internal/Esp32_i2s.c +++ b/src/internal/Esp32_i2s.c @@ -207,38 +207,47 @@ esp_err_t i2sSetClock(uint8_t bus_num, uint8_t div_num, uint8_t div_b, uint8_t d return ESP_OK; } -void i2sSetPins(uint8_t bus_num, int8_t out, bool invert) { - if (bus_num >= I2S_NUM_MAX) { +void i2sSetPins(uint8_t bus_num, int8_t out, bool invert) +{ + if (bus_num >= I2S_NUM_MAX) + { return; } - if (out >= 0) { - if (I2S[bus_num].out != out) { - if (I2S[bus_num].out >= 0) { - gpio_matrix_out(I2S[bus_num].out, 0x100, invert, false); - } - I2S[bus_num].out = out; - pinMode(out, OUTPUT); + int8_t outOld = I2S[bus_num].out; - int i2sSignal; -#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) -// (I2S_NUM_MAX == 2) - if (bus_num == 1) { - i2sSignal = I2S1O_DATA_OUT23_IDX; - } - else -#endif - { - i2sSignal = I2S0O_DATA_OUT23_IDX; - } - - gpio_matrix_out(out, i2sSignal, invert, false); - } - } else if (I2S[bus_num].out >= 0) { - gpio_matrix_out(I2S[bus_num].out, 0x100, invert, false); - I2S[bus_num].out = -1; + // disable old pin + if (outOld >= 0) + { + gpio_matrix_out(outOld, 0x100, false, false); + pinMode(outOld, INPUT); } + if (out >= 0) + { + I2S[bus_num].out = out; + + pinMode(out, OUTPUT); + + int i2sSignal; +#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) +// (I2S_NUM_MAX == 2) + if (bus_num == 1) + { + i2sSignal = I2S1O_DATA_OUT23_IDX; + } + else +#endif + { + i2sSignal = I2S0O_DATA_OUT23_IDX; + } + + gpio_matrix_out(out, i2sSignal, invert, false); + } + else + { + I2S[bus_num].out = -1; + } } bool i2sWriteDone(uint8_t bus_num) { diff --git a/src/internal/NeoEsp32I2sMethod.h b/src/internal/NeoEsp32I2sMethod.h index 9dbaa7f..65645e0 100644 --- a/src/internal/NeoEsp32I2sMethod.h +++ b/src/internal/NeoEsp32I2sMethod.h @@ -169,8 +169,7 @@ public: yield(); } - gpio_matrix_out(_pin, 0x100, false, false); - pinMode(_pin, INPUT); + i2sSetPins(_bus.I2sBusNumber, -1, false); free(_data); free(_i2sBuffer);