Hi all.
I have made myself a board which has a module with the nRF52833 chip embedded onto it. It's effectively a board with a set of switching regulators on it to drive multiple strings of LEDs. I have been testing the board with relatively small strings of SK6812 RGBW LEDs - up to 120 or so - and all has been working fine. Today I have received a longer strip of LEDs and I'm apparently having issues driving it.
The code is relatively simple, I am generating pixels and sending them towards the strip using the ws2812_spi driver:
ret = led_strip_update_rgb(strips[i]->device, strips[i]->buffer, offset); // Update physical
An example of my config (there's one for each of the four SPI buses):
&spi2 {
compatible="nordic,nrf-spim";
status = "okay";
pinctrl-0 = <&spi2_default>;
pinctrl-1 = <&spi2_sleep>;
pinctrl-names = "default", "sleep";
led_strip2: ws2812@2 {
compatible = "worldsemi,ws2812-spi";
/* SPI */
reg = <2>; /* ignored, but necessary for SPI bindings */
spi-max-frequency = <SPI_FREQ>;
/* WS2812 */
chain-length = <300>; /* arbitrary; change at will */
color-mapping = <LED_COLOR_ID_GREEN
LED_COLOR_ID_RED
LED_COLOR_ID_BLUE
LED_COLOR_ID_WHITE
>;
spi-one-frame = <ONE_FRAME>;
spi-zero-frame = <ZERO_FRAME>;
};
};
arch_swap(unsigned int key) (c:\ncs\v2.6.0\zephyr\arch\arm\core\cortex_m\swap.c:48)
spi_context_wait_for_completion(struct spi_context * ctx) (c:\ncs\v2.6.0\zephyr\drivers\spi\spi_context.h:169)
transceive(const struct device * dev, const struct spi_config * spi_cfg, const struct spi_buf_set * tx_bufs, const struct spi_buf_set * rx_bufs, _Bool asynchronous, spi_callback_t cb, void * userdata) (c:\ncs\v2.6.0\zephyr\drivers\spi\spi_nrfx_spim.c:446)
spi_nrfx_transceive(const struct device * dev, const struct spi_config * spi_cfg, const struct spi_buf_set * tx_bufs, const struct spi_buf_set * rx_bufs) (c:\ncs\v2.6.0\zephyr\drivers\spi\spi_nrfx_spim.c:485)
spi_transceive(const struct spi_buf_set * rx_bufs, const struct spi_buf_set * tx_bufs, const struct spi_config * config, const struct device * dev) (c:\V\led_board_testing\build\zephyr\include\generated\syscalls\spi.h:38)
spi_write(const struct spi_buf_set * tx_bufs, const struct spi_config * config, const struct device * dev) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\spi.h:837)
spi_write_dt(const struct spi_dt_spec * spec, const struct spi_buf_set * tx_bufs) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\spi.h:855)
ws2812_strip_update_rgb(const struct device * dev, struct led_rgb * pixels, size_t num_pixels) (c:\ncs\v2.6.0\zephyr\drivers\led_strip\ws2812_spi.c:152)
led_strip_update_rgb(size_t num_pixels, struct led_rgb * pixels, const struct device * dev) (c:\ncs\v2.6.0\zephyr\include\zephyr\drivers\led_strip.h:105)
if (k_sem_take(&ctx->sync, timeout)) {
And I'm getting an exception only when I breakpoint, on the logging thread (which seems arbitrary, as if I entirely remove logging, I get the exception instead on the gpio_handler thread):
k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t * esf) (c:\ncs\v2.6.0\zephyr\kernel\fatal.c:41)
<signal handler called> (Unknown Source:0)
<signal handler called> (Unknown Source:0)
mpsc_pbuf_free(struct mpsc_pbuf_buffer * buffer, const union mpsc_pbuf_generic * item) (c:\ncs\v2.6.0\zephyr\lib\os\mpsc_pbuf.c:577)
msg_free(struct mpsc_pbuf_buffer * buffer, const union log_msg_generic * msg) (c:\ncs\v2.6.0\zephyr\subsys\logging\log_core.c:739)
log_process() (c:\V\led_board_testing\build\zephyr\include\generated\syscalls\log_ctrl.h:57)
log_process_thread_func(void * dummy1, void * dummy2, void * dummy3) (c:\ncs\v2.6.0\zephyr\subsys\logging\log_core.c:908)
NCS 2.6.0; custom dts based on this: