From a4700b673e16a8f661fbbd21763a4bfd31cc317e Mon Sep 17 00:00:00 2001 From: Joshua King Date: Fri, 6 Mar 2026 21:34:11 -0500 Subject: [PATCH] Refactor SPI handling in cat-medication-tracker to use ESP-IDF API for improved performance and reliability --- esphome/cat-medication-tracker.yaml | 32 +++++++++++++++++++---------- esphome/spi_helper.h | 3 ++- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/esphome/cat-medication-tracker.yaml b/esphome/cat-medication-tracker.yaml index e3501bf..9f9ec8c 100644 --- a/esphome/cat-medication-tracker.yaml +++ b/esphome/cat-medication-tracker.yaml @@ -15,17 +15,27 @@ esphome: then: - lambda: |- // Send MADCTL 0x88: MY=1, BGR=1 — correct portrait for this board - // Uses raw HSPI to bypass ESPHome's buffered display layer - SPIClass spi2(HSPI); - spi2.begin(14, 12, 13, -1); // SCK, MISO, MOSI, SS - spi2.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); - digitalWrite(15, LOW); // CS assert - digitalWrite(2, LOW); // DC = command - spi2.transfer(0x36); // MADCTL register - digitalWrite(2, HIGH); // DC = data - spi2.transfer(0x88); // MY=1, BGR=1: correct vertical, no horizontal mirror - digitalWrite(15, HIGH); // CS deassert - spi2.endTransaction(); + // Uses ESP-IDF SPI master API to bypass ESPHome's buffered display layer + spi_device_handle_t disp_fix; + spi_device_interface_config_t cfg = {}; + cfg.clock_speed_hz = 1000000; + cfg.mode = 0; + cfg.spics_io_num = -1; // manual CS + cfg.queue_size = 1; + if (spi_bus_add_device(SPI2_HOST, &cfg, &disp_fix) == ESP_OK) { + gpio_set_level((gpio_num_t)15, 0); // CS low + gpio_set_level((gpio_num_t)2, 0); // DC = command + spi_transaction_t t = {}; + t.length = 8; + t.flags = SPI_TRANS_USE_TXDATA; + t.tx_data[0] = 0x36; // MADCTL register + spi_device_polling_transmit(disp_fix, &t); + gpio_set_level((gpio_num_t)2, 1); // DC = data + t.tx_data[0] = 0x88; // MY=1, BGR=1 + spi_device_polling_transmit(disp_fix, &t); + gpio_set_level((gpio_num_t)15, 1); // CS high + spi_bus_remove_device(disp_fix); + } - component.update: my_display esp32: diff --git a/esphome/spi_helper.h b/esphome/spi_helper.h index 59d4754..3eb8365 100644 --- a/esphome/spi_helper.h +++ b/esphome/spi_helper.h @@ -1,2 +1,3 @@ #pragma once -#include +#include "driver/spi_master.h" +#include "driver/gpio.h"