Hello there!
I´m new in the nordic universe. I have a nrf52840 dk and i want to learn how it works. I succsesfully started with using the gpios and the i2c and now i want to use SPI.
But i wont get it running. I want to create a new spi device and want to read out some registers. I tried several exemples form the internet and read much in some forums but it didn´t help. I´m using SDK 2.2.0 and VS Code.
I created a new device in the device tree and added the SPI in the configuration file.
CONFIG_GPIO=y
CONFIG_SPI=y
my prj.conf
&spi1 {
eeprom:test@0 {
status = "okay";
compatible = "bosch,bmi160";
//compatible = "spi-device"; //spi-device did not work
spi-max-frequency = <1000000>;
reg = <0>;
};
cs-gpios = <&gpio1 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
};
and my overlay...
i needed to join one different compatible because it does not compile... Thats why i select the bmi160. How can i use the "spi-device"?
And here the main()
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/drivers/gpio.h>
#define SPI_NODE DT_NODELABEL(eeprom)
#define SPI_OP_MODE (SPI_OP_MODE_MASTER | SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_MSB )
static struct spi_dt_spec appSPI = SPI_DT_SPEC_GET(SPI_NODE, SPI_OP_MODE, 1);
void readRegister(uint8_t reg, uint8_t values[], uint8_t size)
{
int err;
uint8_t tx_buffer[1];
tx_buffer[0] = reg;
struct spi_buf tx_spi_bufs[] =
{
{.buf = tx_buffer,
.len = sizeof(tx_buffer)},
};
struct spi_buf_set spi_tx_buffer_set =
{
.buffers = tx_spi_bufs,
.count = 1};
struct spi_buf rx_spi_bufs[] =
{
{.buf = values,
.len = size}};
struct spi_buf_set spi_rx_buffer_set =
{
.buffers = rx_spi_bufs,
.count = 1};
err = spi_transceive_dt(&appSPI, &spi_tx_buffer_set, &spi_rx_buffer_set);
if (err < 0)
{
printk("Read Registers failed: %d\n", reg);
}
}
void main(void)
{
if (!device_is_ready(appSPI.bus))
{
printk("SPI bus %s not ready!\r\n", appSPI.bus->name);
return;
}
uint8_t reg_value[1];
readRegister(0x00, ®_value, sizeof(reg_value));
printk("Value: 0x%02X", reg_value[0]);
}
I want to read the value from reg 0x00... it must be a 0x24 but i only got 0x00. I checkt it with an logic analyser and I saw that there is no SPI Clock and I don´t know how to fix it.
I spent amost 2 week to get the spi running but nothing works
. Does anyone have an idea how to get it working?