Howdy,
I am currently working on the nRF52840 chip and trying to convert my SPIS code from being in my main while loop into being interrupt driven. I am using Zephyr to do this, but having trouble figuring out how the interrupt should be attached. I mainly need this since the SPI transmission is asynchronous and currently it locks my while loop waiting for it. This hurts since I needed to use my while loop for synchronous monitoring and processing. I should note that his is my first time using Zephyr. I have provided my SPI code below into section. Here is my config.
CONFIG_SPI=y CONFIG_SPI_SLAVE=y
Below is where I am getting my errors on defining the pointers. The error is coming from the define for "MY_ISR_ARG". It is saying that "'__device_DEVICE_DEFINE' was not declared in this scope".
#include <zephyr/device.h> #include <zephyr/devicetree/spi.h> #include <zephyr/dt-bindings/spi/spi.h> #include <zephyr/drivers/spi.h> #include <zephyr/logging/log.h> #include <autoconf.h> #define SPI_DEV DT_NODELABEL(spi1) #define MY_DEV_IRQ 24 /* device uses IRQ 24 */ #define MY_ISR_ARG DEVICE_GET(DEVICE_DEFINE(spi1)) /* argument passed to my_isr(), in this case a pointer to the device */
Here is the part where I am handling all the SPI setup outside of the main function. I know that everything here should work fine with the exception of the SPI_ISR function, from testing in the while loop.
static const struct device *spi_dev; static const struct spi_config spi_cfg = { .frequency= 2500000, .operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB | SPI_OP_MODE_SLAVE | SPI_CONFIG_CPHA_Leading | SPI_CONFIG_CPOL_ActiveLow, // 8-bit data, MSB first // .cs = (struct spi_cs_control){ // .gpio = GPIO_DT_SPEC_GET(SPI_DEV, cs_gpios), // .delay = 0u, // }, }; static uint8_t rx_buf[SPI_DATA_LEN] = {0}; // Received data from master should be 98 bytes, change if needed struct spi_buf spi_rx = { .buf = rx_buf, .len = sizeof(rx_buf) // Receive buffer }; const struct spi_buf_set rx_buffers = { .buffers = &spi_rx, .count = 1 }; void SPI_ISR(){ int ret = spi_read(spi_dev, &spi_cfg, &rx_buffers); if (ret >= 0) { printk("Received data from master:"); memcpy(The_Vocal_data, rx_buf, sizeof(rx_buf)); for(int i = 0; i < 20; i++){ printk("%d ",rx_buf[i]); } printk("\n"); } else { printk("SPI transceive error: %d\n", ret); memset(The_Vocal_data, 0, sizeof(rx_buf)); } }
The last part of the code takes place before the main while loop in the main function. I know that IRQ_CONNECT is incorrect but no clue as to why it is not correct.
const struct device *spi_dev = DEVICE_DT_GET(DT_NODELABEL(spi1)); spi_dev = DEVICE_DT_GET(SPI_DEV); if(!spi_dev){ printk("Device not found: SPI\n"); return 0; } if (!device_is_ready(spi_dev)) { printk("%s: device not ready.\n"); return 0; } IRQ_CONNECT(MY_DEV_IRQ, 2, my_isr, MY_ISR_ARG, 0); irq_enable(MY_DEV_IRQ);
Any help with this would be much appreciated.