Hi,
I am using the NRF52832 DK version 3.0.0 with a UWB module: the DWM1000 from Qorvo.
I was struggling with the SPI communication to get the Chip ID by sending a simple 0x00 byte through the MOSI line. I have tried with nrfx_spi alone, but
no success for now. I share my code, which is written in zephyr, it should work but I always receive a 0xFFFFF. I tested the qorvo module with arduino and
it seems to work fine, as I am getting the expected results; as a result, the problem seems to be my code or the board. (I am using the NrfConnect for VScode)
I also followed the instruction in the User Guide where it is said that I should enable the I/O expander to avoid any problem with the buttons and leds in the board
which uses the SPI pins also.
source: infocenter.nordicsemi.com/.../nRF52_DK_User_Guide_v1.2.pdf
&pinctrl { spi_master_default: spi_master_default { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 25)>, <NRF_PSEL(SPIM_MOSI, 0, 23)>, <NRF_PSEL(SPIM_MISO, 0, 24)>; }; }; spi_master_sleep: spi_master_sleep { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 25)>, <NRF_PSEL(SPIM_MOSI, 0, 23)>, <NRF_PSEL(SPIM_MISO, 0, 24)>; low-power-enable; }; }; }; spi2_master: &spi2 { compatible = "nordic,nrf-spi"; status = "okay"; pinctrl-0 = <&spi_master_default>; pinctrl-1 = <&spi_master_sleep>; pinctrl-names = "default", "sleep"; cs-gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>; reg_spi2_master: spi-dev-a@0 { reg = <0>; }; };
#include <stdio.h> #include <string.h> #include <zephyr/kernel.h> #include <zephyr/device.h> #include <zephyr/devicetree.h> #include <zephyr/drivers/gpio.h> #include <zephyr/drivers/spi.h> /* 1000 msec = 1 sec */ #define SLEEP_TIME_MS 1000 #define ZEPHYR_MHZ_TO_HZ(freq) ((freq) * 1000 * 1000) #define QORVO_CHIPID_REG 0x00 #define MY_SPI_MASTER DT_NODELABEL(spi2) // SPI master functionality const struct device *spi_dev = DEVICE_DT_GET(MY_SPI_MASTER); // Chip select functionality #define MY_GPIO0 DT_NODELABEL(gpio0) #define GPIO_0_CS 22 static const struct device *gpio0_dev = DEVICE_DT_GET(MY_GPIO0); struct spi_config spi_cfg = { .operation = SPI_TRANSFER_MSB | SPI_WORD_SET(8),// | SPI_MODE_CPOL | SPI_MODE_CPHA, .frequency = 2000000U, .slave = 0, //.cs = NULL, }; void print_buffer(uint32_t readlength, uint8_t *readBuffer){ int j = 0; printf("Payload is: "); for(int loop = readlength; loop > 0; loop--){ j = (j << 8) | readBuffer[loop]; } printf("0x%.8X \t\n", j); } int readfromspi(uint8_t reg, uint8_t values[], uint8_t size) { int err; uint8_t tx_buffer[1]; tx_buffer[0] = reg; struct spi_buf tx_buf[] = { {.buf = tx_buffer, .len = sizeof(tx_buffer),} }; struct spi_buf_set tx = { .buffers = tx_buf, .count = 1 }; struct spi_buf rx_buf[] = { {.buf = values, .len = size,} }; struct spi_buf_set rx = { .buffers = rx_buf, .count = 1 }; gpio_pin_set(gpio0_dev, GPIO_0_CS, 0); // Start transaction err = spi_write(spi_dev, &spi_cfg, &tx); if(err<0){ printk("SPI transaction error: %i\n", err); return err; } err = spi_read(spi_dev, &spi_cfg, &rx); if(err<0){ printk("SPI receive error: %i\n", err); return err; } gpio_pin_set(gpio0_dev, GPIO_0_CS, 1); return 0; } static void readChipID(void){ uint8_t rx_buff_chipid[5]; readfromspi(QORVO_CHIPID_REG,rx_buff_chipid,5); //printk("ChipID: 0x%02X\n"); print_buffer(5, rx_buff_chipid); } int main(void) { gpio_pin_configure(gpio0_dev, GPIO_0_CS, GPIO_OUTPUT); gpio_pin_set(gpio0_dev, GPIO_0_CS, 1); if(!device_is_ready(spi_dev)) { printk("SPI master device not ready!\n"); } readChipID(); k_msleep(SLEEP_TIME_MS); while (1) { k_msleep(SLEEP_TIME_MS); } return 0; }
Please, I need some suggestions about the code or configuration. Probably I am misunderstanding something.