diff --git a/drivers/spi/spi_ll_stm32.c b/drivers/spi/spi_ll_stm32.c index 49902086575bb..2e168d0bdfbeb 100644 --- a/drivers/spi/spi_ll_stm32.c +++ b/drivers/spi/spi_ll_stm32.c @@ -480,6 +480,21 @@ static int spi_stm32_configure(const struct device *dev, return -ENOTSUP; } + /* configure the frame format Motorola (default) or TI */ + if ((config->operation & SPI_FRAME_FORMAT_TI) == SPI_FRAME_FORMAT_TI) { +#ifdef LL_SPI_PROTOCOL_TI + LL_SPI_SetStandard(spi, LL_SPI_PROTOCOL_TI); +#else + LOG_ERR("Frame Format TI not supported"); + /* on stm32F1 or some stm32L1 (cat1,2) without SPI_CR2_FRF */ + return -ENOTSUP; +#endif +#if defined(LL_SPI_PROTOCOL_MOTOROLA) && defined(SPI_CR2_FRF) + } else { + LL_SPI_SetStandard(spi, LL_SPI_PROTOCOL_MOTOROLA); +#endif +} + if (clock_control_get_rate(DEVICE_DT_GET(STM32_CLOCK_CONTROL_NODE), (clock_control_subsys_t) &cfg->pclken, &clock) < 0) { LOG_ERR("Failed call clock_control_get_rate"); @@ -561,11 +576,6 @@ static int spi_stm32_configure(const struct device *dev, ll_func_set_fifo_threshold_8bit(spi); #endif -#if !defined(CONFIG_SOC_SERIES_STM32F1X) \ - && (!defined(CONFIG_SOC_SERIES_STM32L1X) || defined(SPI_CR2_FRF)) - LL_SPI_SetStandard(spi, LL_SPI_PROTOCOL_MOTOROLA); -#endif - /* At this point, it's mandatory to set this on the context! */ data->ctx.config = config; diff --git a/samples/drivers/led_ws2812/boards/nucleo_f070rb.overlay b/samples/drivers/led_ws2812/boards/nucleo_f070rb.overlay index 097f0ed6f8edf..1b9f514424f2e 100644 --- a/samples/drivers/led_ws2812/boards/nucleo_f070rb.overlay +++ b/samples/drivers/led_ws2812/boards/nucleo_f070rb.overlay @@ -19,6 +19,7 @@ /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = ; + frame-format = <32768>; /* SPI_FRAME_FORMAT_TI */ /* B1414 */ chain-length = <18>; /* arbitrary; change at will */ diff --git a/samples/drivers/led_ws2812/boards/nucleo_g071rb.overlay b/samples/drivers/led_ws2812/boards/nucleo_g071rb.overlay new file mode 100644 index 0000000000000..ce6dd34d1790e --- /dev/null +++ b/samples/drivers/led_ws2812/boards/nucleo_g071rb.overlay @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&arduino_spi { + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + frame-format = <32768>; /* SPI_FRAME_FORMAT_TI */ + + /* WS2812 */ + chain-length = <16>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + aliases { + led-strip = &led_strip; + }; +}; diff --git a/samples/drivers/led_ws2812/boards/nucleo_l476rg.overlay b/samples/drivers/led_ws2812/boards/nucleo_l476rg.overlay index 46b8e4db9aad5..ce6dd34d1790e 100644 --- a/samples/drivers/led_ws2812/boards/nucleo_l476rg.overlay +++ b/samples/drivers/led_ws2812/boards/nucleo_l476rg.overlay @@ -14,6 +14,7 @@ /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; + frame-format = <32768>; /* SPI_FRAME_FORMAT_TI */ /* WS2812 */ chain-length = <16>; /* arbitrary; change at will */