
&pinctrl {
spi21_imu_default: spi21_imu_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 11)>,
<NRF_PSEL(SPIM_MISO, 1, 5)>,
<NRF_PSEL(SPIM_MOSI, 1, 12)>;
// nordic,drive-mode = <NRF_DRIVE_E0E1>;
};
};
spi21_imu_sleep: spi21_imu_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 11)>,
<NRF_PSEL(SPIM_MISO, 1, 5)>,
<NRF_PSEL(SPIM_MOSI, 1, 12)>;
// nordic,drive-mode = <NRF_DRIVE_E0E1>;
low-power-enable;
};
};
};
&spi21 {
status = "okay";
pinctrl-0 = <&spi21_imu_default>;
pinctrl-1 = <&spi21_imu_sleep>;
pinctrl-names = "default", "sleep";
cs-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
overrun-character = <0x00>;
bmi323: bmi323@0 {
status = "okay";
compatible = "bosch,bmi323";
reg = <0>;
spi-max-frequency = <8000000>;
};
};
int spi_transceive(const struct spi_dt_spec *spi_dev,
const uint8_t *tx_data, size_t tx_len,
uint8_t *rx_data, size_t rx_len)
{
if (!artoo_spi_is_ready(spi_dev)) {
return -ENODEV;
}
const struct spi_buf tx_buf = {
.buf = (void *)tx_data,
.len = tx_len,
};
const struct spi_buf rx_buf = {
.buf = rx_data,
.len = rx_len,
};
const struct spi_buf_set tx_set = {
.buffers = &tx_buf,
.count = 1,
};
const struct spi_buf_set rx_set = {
.buffers = &rx_buf,
.count = 1,
};
return spi_transceive_dt(spi_dev, &tx_set, &rx_set);
}
int bmi323_read_reg16(uint8_t reg, uint16_t *value)
{
if (bmi323_spi_dev == NULL || value == NULL) {
return -EINVAL;
}
uint8_t tx_buf[4] = {
reg | BMI323_SPI_READ_BIT,
0x00,
0x00,
0x00,
};
uint8_t rx_buf[4] = { 0 };
int err = spi_transceive(bmi323_spi_dev, tx_buf, sizeof(tx_buf),
rx_buf, sizeof(rx_buf));
if (err) {
return err;
}
*value = ((uint16_t)rx_buf[3] << 8) | rx_buf[2];
return 0;
}
uint16_t regs[4] = {0};
bmi323_read_reg16(0x20, ®s[0]);
bmi323_read_reg16(0x21, ®s[1]);
bmi323_read_reg16(0x01, ®s[2]);
bmi323_read_reg16(0x02, ®s[3]);
printk("ACC_CONF=0x%04x GYR_CONF=0x%04x, ERR=0x%04x STATUS=0x%04x\n", regs[0], regs[1], regs[2], regs[3]);
// ACC_CONF=0x7188 GYR_CONF=0x71c8, ERR=0xffff STATUS=0xffff
nRF54L15, ncs\v3.3.0\nrf\samples\bluetooth\peripheral_lbs
spi21, The third time reading the register value is 0xffff, and the SPI CS pin cannot be pulled low.