fix: correct SPI bus transaction length handling in LED strip driver

This commit is contained in:
2025-11-10 10:53:28 +08:00
parent a47216c9b4
commit 732a1f56b5

View File

@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/cdefs.h>
#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");