Interfacing ST IMU(LSM6DSV) with nRF52840dk via SPI interface

Hi, I just tried to connect LSM6DSV IMU with nRF52840dk

The whole folder structure is shown below : 

1. I set nrf52840dk_nrf52840.overlay file first.

&spi2 {
    status = "okay";
    cs-gpios = <&gpio0 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
    pinctrl-0 = <&spi2_default>;
    pinctrl-1 = <&spi2_sleep>;
    pinctrl-names = "default", "sleep";

    lsm6dsv: lsm6dsl@0 {
        compatible = "st,lsm6dsl";
        reg = <0>;
        spi-max-frequency = <10000000>;
    };
};
&pinctrl {
    spi2_default: spi2_default {
        group1 {
            psels = <NRF_PSEL(SPIM_SCK, 0, 19)>,
                    <NRF_PSEL(SPIM_MISO, 0, 21)>,
                    <NRF_PSEL(SPIM_MOSI, 0, 20)>;
        };
    };
    spi2_sleep: spi2_sleep {
        group1 {
            psels = <NRF_PSEL(SPIM_SCK, 0, 19)>,
                    <NRF_PSEL(SPIM_MISO, 0, 21)>,
                    <NRF_PSEL(SPIM_MOSI, 0, 20)>;
            low-power-enable;
        };
    };
};
2. I set main.c as below also :
but I failed to get proper WHO_AM_I result from the sensor. Every pin was properly connected.
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);

#define CS_PIN 3
#define VDD_CTRL_PIN 10

#define SPI_MODE (SPI_WORD_SET(8) | SPI_TRANSFER_MSB | SPI_MODE_CPOL | SPI_MODE_CPHA)

static const struct spi_dt_spec lsm6dsv = SPI_DT_SPEC_GET(
    DT_NODELABEL(lsm6dsv),
    SPI_MODE,
    0
);

void main(void)
{
    const struct device *gpio_dev = DEVICE_DT_GET(DT_NODELABEL(gpio0));

    gpio_pin_configure(gpio_dev, CS_PIN, GPIO_OUTPUT_LOW);            
    gpio_pin_configure(gpio_dev, VDD_CTRL_PIN, GPIO_OUTPUT_LOW);      

    LOG_INF("Initialize : CS LOW + Sensor VDD OFF");
    k_msleep(100);  

    gpio_pin_set(gpio_dev, VDD_CTRL_PIN, 1);
    LOG_INF("VDD ON");
    k_msleep(100);  

    if (!spi_is_ready_dt(&lsm6dsv)) {
        LOG_ERR("SPI not ready");
        return;
    }
     
    uint8_t tx_buf[2] = { 0x8F, 0x00 };
    uint8_t rx_buf[2] = { 0 };

    const struct spi_buf tx = { .buf = tx_buf, .len = 2 };
    const struct spi_buf rx = { .buf = rx_buf, .len = 2 };
    const struct spi_buf_set tx_set = { .buffers = &tx, .count = 1 };
    const struct spi_buf_set rx_set = { .buffers = &rx, .count = 1 };

    int ret = spi_transceive_dt(&lsm6dsv, &tx_set, &rx_set);
    if (ret == 0) {
        LOG_INF("WHO_AM_I = 0x%02X", rx_buf[1]);
        if (rx_buf[1] == 0x6C) {
            LOG_INF("SPI comm DONE!");
        } else {
            LOG_ERR("Unexpected");
        }
    } else {
        LOG_ERR("SPI transceive 실패: %d", ret);
    }

    k_msleep(500);

}

[00:00:00.423,004] <inf> main: Initialize : CS LOW + Sensor VDD OFF
[00:00:00.523,101] <inf> main: VDD ON
[00:00:00.623,229] <inf> main: WHO_AM_I = 0x00
[00:00:00.623,260] <err> main: Unexpected
I tried to switch to SPI mode.
But I still don't know why my code is not working..  
Is there any proper solution for this problem? Thanks in advance
Related