From 732a1f56b51e8ed34b4a440356e1a526e4139da3 Mon Sep 17 00:00:00 2001 From: crosstyan Date: Mon, 10 Nov 2025 10:53:28 +0800 Subject: [PATCH] fix: correct SPI bus transaction length handling in LED strip driver --- src/led_strip_spi_dev.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/led_strip_spi_dev.c b/src/led_strip_spi_dev.c index 81be029..c34efb9 100644 --- a/src/led_strip_spi_dev.c +++ b/src/led_strip_spi_dev.c @@ -7,6 +7,7 @@ #include #include #include +#include "esp_err.h" #include "esp_log.h" #include "esp_check.h" #include "esp_private/spi_common_internal.h" @@ -96,11 +97,12 @@ static esp_err_t led_strip_spi_refresh(led_strip_t *strip) spi_transaction_t tx_conf; memset(&tx_conf, 0, sizeof(tx_conf)); - spi_bus_attr_t *bus_attr = spi_bus_get_attr(spi_strip->spi_host); - ESP_RETURN_ON_FALSE(bus_attr, ESP_ERR_INVALID_STATE, TAG, "SPI bus not initialized"); + esp_err_t err = ESP_OK; + size_t max_transfer_sz = 0; + err = spi_bus_get_max_transaction_len(spi_strip->spi_host, &max_transfer_sz); + ESP_RETURN_ON_FALSE(err, ESP_ERR_INVALID_STATE, TAG, "SPI bus not initialized"); size_t acc = 0; - const size_t max_transfer_sz = bus_attr->max_transfer_sz; const size_t chunk_size = max_transfer_sz - 1; const size_t total_bytes = spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE; @@ -195,7 +197,7 @@ esp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const l .sclk_io_num = -1, .quadwp_io_num = -1, .quadhd_io_num = -1, - .max_transfer_sz = led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, + .max_transfer_sz = (led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE) + 1, .flags = SPICOMMON_BUSFLAG_MOSI, }; ESP_GOTO_ON_ERROR(spi_bus_initialize(spi_strip->spi_host, &spi_bus_cfg, spi_config->flags.with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED), err, TAG, "create SPI bus failed");