From dbffcac195fa944b4a43a6160881209049d66da3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 12 Feb 2023 12:19:02 +0100 Subject: [PATCH] Shelly Pro 4PM reduce number of SPI updates --- .../xdrv_88_esp32_shelly_pro.ino | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro.ino b/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro.ino index d6f3d1d10..16dd8db3e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_88_esp32_shelly_pro.ino @@ -88,7 +88,10 @@ enum SP4MCP23X17GPIORegisters { uint8_t sp4_mcp23s17_olata = 0; uint8_t sp4_mcp23s17_olatb = 0; +bool sp4_spi_busy; + void SP4Mcp23S17Enable(void) { + sp4_spi_busy = true; SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); digitalWrite(SPro.pin_register_cs, 0); } @@ -96,6 +99,7 @@ void SP4Mcp23S17Enable(void) { void SP4Mcp23S17Disable(void) { SPI.endTransaction(); digitalWrite(SPro.pin_register_cs, 1); + sp4_spi_busy = false; } uint32_t SP4Mcp23S17Read16(uint8_t reg) { @@ -408,11 +412,21 @@ void ShellyProPower(void) { // AddLog(LOG_LEVEL_DEBUG, PSTR("SHP: Set Power 0x%08X"), XdrvMailbox.index); power_t rpower = XdrvMailbox.index; +/* for (uint32_t i = 0; i < 4; i++) { power_t state = rpower &1; - SP4Mcp23S17DigitalWrite(sp4_relay_pin[i], state); + SP4Mcp23S17DigitalWrite(sp4_relay_pin[i], state); // 4 SPI writes rpower >>= 1; // Select next power } +*/ + for (uint32_t i = 0; i < 4; i++) { + power_t state = rpower &1; + uint32_t bit = sp4_relay_pin[i] -8; // Adjust by 8 bits + bitWrite(sp4_mcp23s17_olatb, bit, state); + rpower >>= 1; // Select next power + } + SP4Mcp23S17Write(SP4_MCP23S17_OLATB, sp4_mcp23s17_olatb); // 1 SPI write + } }