Hi there,
I'm having an issue with the SPI master in Zephyr. When attempting to transmit data it returns the error: 'Timeout waiting for transfer to complete'. Am I missing something here?
main.c:
#include <zephyr/kernel.h> #include <zephyr/logging/log.h> #include <zephyr/drivers/spi.h> #define PN76_SPI DT_NODELABEL(pn76_spi) #define PN76_SPI_OP (SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8) | SPI_LINES_SINGLE) LOG_MODULE_REGISTER(app); void main(void) { struct spi_dt_spec pn76_spi = SPI_DT_SPEC_GET(PN76_SPI, PN76_SPI_OP, 0); bool ready = spi_is_ready(&pn76_spi); LOG_INF("Ready: %i", ready); unsigned char buffer[20] = { 0 }; unsigned int length = sizeof(buffer); const struct spi_buf tx_buffer = { .buf = buffer, .len = length }; const struct spi_buf_set tx_buffers = { .buffers = &tx_buffer, .count = 1 }; int status = spi_write_dt(&pn76_spi, &tx_buffers); LOG_INF("Status: %i", status); k_sleep(K_FOREVER); }
DTS overlay:
/ { zephyr,user { pn76-enable-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>; pn76-dwl-req-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>; pn76-irq-gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>; }; }; &pinctrl { spi1_default: spi1_default { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 8)>, <NRF_PSEL(SPIM_MOSI, 0, 6)>, <NRF_PSEL(SPIM_MISO, 0, 7)>; }; }; spi1_sleep: spi1_sleep { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 8)>, <NRF_PSEL(SPIM_MOSI, 0, 6)>, <NRF_PSEL(SPIM_MISO, 0, 7)>; low-power-enable; }; }; }; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; pinctrl-0 = <&spi1_default>; pinctrl-1 = <&spi1_sleep>; cs-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; pn76_spi: spi-dev-a@0 { compatible = "vnd,spi-device"; reg = <0>; spi-max-frequency = <1600000>; }; };
prj.conf:
CONFIG_SPI=y CONFIG_LOG=y
Logs:
*** Booting Zephyr OS build v3.2.99-ncs1 *** [00:00:00.373,657] <inf> app: Ready: 1 [00:00:00.573,791] <err> spi_nrfx_spim: Timeout waiting for transfer complete [00:00:00.573,822] <inf> app: Transmit status: -116
nRF Connect version: v2.2.0
Zephyr version: 3.2.99
Best regards,
Stefan Nienhuis