Hi, I can get ahold of the SPI device and call the spi_transceive function wihtout returning error codes. Logic analyzer shows nothing happening, such as SCK clocking. I am using the NRF52833-DK board.
In pj.conf:
CONFIG_SPI=y
In .dts:
can_spi: &spi1 {
compatible = "nordic,nrf-spim";
cs-gpios = <&gpio0 22 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&spi1_default>;
pinctrl-1 = <&spi1_sleep>;
pinctrl-names = "default", "sleep";
};
&pinctrl {
spi1_default: spi1_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 1)>,
<NRF_PSEL(SPIM_MISO, 1, 2)>,
<NRF_PSEL(SPIM_MOSI, 1, 3)>;
};
};
spi1_sleep: spi1_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 1)>,
<NRF_PSEL(SPIM_MISO, 1, 2)>,
<NRF_PSEL(SPIM_MOSI, 1, 3)>;
low-power-enable;
};
};
};
In C module for SPI transactions:
#include <stdint.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/logging/log.h>
#include "spi_interface.h"
LOG_MODULE_REGISTER(spi_interface, LOG_LEVEL_INF);
static struct device * spi_dev;
static struct spi_buf tx_spi_buffer[1];
static struct spi_buf rx_spi_buffer[1];
static struct spi_config spi_cfg = {
.frequency = 500000,
.operation = SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8) | SPI_LINES_SINGLE,
};
static const struct spi_buf_set api_tx_buff = { tx_spi_buffer, 1 };
static const struct spi_buf_set api_rx_buff = { rx_spi_buffer, 1 };
void spi_init(void)
{
spi_dev = device_get_binding(DEVICE_DT_NAME(DT_NODELABEL(spi1)));
if (spi_dev == NULL) {
/* No such node, or the node does not have status "okay". */
LOG_ERR("\nError: no device found.\n");
}
else if (!device_is_ready(spi_dev)) {
LOG_ERR("\nError: Device \"%s\" is not ready; "
"check the driver initialization logs for errors.\n",
spi_dev->name);
}
else
{
LOG_INF("Found device \"%s\", getting sensor data\n", spi_dev->name);
}
}
void spi_trx(uint8_t* tx_buf, uint8_t write_size, uint8_t* rx_buf, uint8_t read_size)
{
tx_spi_buffer[0].buf = tx_buf;
tx_spi_buffer[0].len = write_size;
rx_spi_buffer[0].buf = rx_buf;
rx_spi_buffer[0].len = read_size;
int ret = spi_transceive(spi_dev,
&spi_cfg,
&api_tx_buff,
&api_rx_buff);
if (ret < 0)
{
LOG_ERR("err code %d", ret);
}
}