<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/124764/real-time-requirements-easydma</link><description>Hello Nordic, 
 
 I am developing for a project that requires real-time accuracy. We are using ncs v2.9.1 Zephyr, an nRF54L15 and an IMU (w/ SPI interface) to acquire positional data. 
 An observed issue is that we cannot reliably sample our IMU during</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Thu, 13 Nov 2025 18:30:57 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/124764/real-time-requirements-easydma" /><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/554298?ContentTypeID=1</link><pubDate>Thu, 13 Nov 2025 18:30:57 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7aa6ccb9-c734-44cb-8b81-eeb44560b8c1</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Great, thank you Edvin!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/554268?ContentTypeID=1</link><pubDate>Thu, 13 Nov 2025 13:40:00 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:327e195b-cab0-4295-bb1c-819902cef16f</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Ok, I thought you controlled it using PPI directly (PPI + GPIOTE), but it seems like the driver handles this, yes.&amp;nbsp;&lt;/p&gt;
[quote user="LeviRand"]The driver states to leave &amp;quot;&lt;span&gt;Chip select must be configured to &lt;/span&gt;&lt;span&gt;@ref&lt;/span&gt;&lt;span&gt; NRF_SPIM_PIN_NOT_CONNECTED and managed outside the driver.&lt;/span&gt;&amp;quot;&amp;nbsp;[/quote]
&lt;p&gt;I believe this snippet is coming from the older chips where the CSN was not hardware controlled, but controlled by the software drivers. At that point, the CSN pins could not be handled by the peripheral itself, and hence not controlled automatically by the PPI directly (unless you specify this as a separate task in PPI).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;BR,&lt;br /&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/554175?ContentTypeID=1</link><pubDate>Wed, 12 Nov 2025 17:21:56 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:773d9dee-3b19-490d-b60f-ebb5000cc91c</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Yes, that makes sense. my device only needs 40ns for CS setup/hold time. Upon closer inspection of the waveform there is a 60ns hold time.&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1762968007536v1.png" alt=" " /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For my code, the CS is being trigger by the driver. Is the CS being triggered (almost) at the same time as the&amp;nbsp;MOSI&amp;nbsp;why the documentation states to handle the CS outside the driver? Can I leave it like this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/554078?ContentTypeID=1</link><pubDate>Wed, 12 Nov 2025 09:16:31 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a05d97d5-c2d2-4e52-9bb6-8c2c67a02b4b</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;I guess the SPIS device that you are using accepts that the CS pin is set at the same time as the MOSI starts outputting data. Some devices uses this as a wakeup source to trigger some task, and is not ready to receive data before a certain amount of time has passed.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;How do you trigger the CS pin? Is it being done by the driver, or do you do it using the fork and PPI?&lt;/p&gt;
&lt;p&gt;BR,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/554045?ContentTypeID=1</link><pubDate>Wed, 12 Nov 2025 01:19:32 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:83efb2cf-4e5d-43a1-985b-a7a3b97a53a7</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Ok, thank you for the instruction.&lt;/p&gt;
&lt;p&gt;One final question: When testing the module, I did not do as the driver instructed. The driver states to leave &amp;quot;&lt;span&gt;Chip select must be configured to &lt;/span&gt;&lt;span&gt;@ref&lt;/span&gt;&lt;span&gt; NRF_SPIM_PIN_NOT_CONNECTED and managed outside the driver.&lt;/span&gt;&amp;quot;&amp;nbsp;&amp;nbsp;Instead, I configured it to pin 69. See below.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;#define SPI_CLK_PIN_201      65
#define SPI_MOSI_PIN_202     66
#define SPI_MISO_PIN_204     68
#define SPI_CS_PIN_205       69
#define SPI_INSTANCE_IDX     00
const nrfx_spim_t spiDev = NRFX_SPIM_INSTANCE(SPI_INSTANCE_IDX);

nrfx_spim_config_t spiConfig = {
        .sck_pin = SPI_CLK_PIN_201,
        .mosi_pin = SPI_MOSI_PIN_202,
        .miso_pin = SPI_MISO_PIN_204,
        .ss_pin = SPI_CS_PIN_205,
        .ss_active_high = false,
        .irq_priority = NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY,
        .orc = 0x00,
        .frequency = NRFX_MHZ_TO_HZ(8),
        .mode = NRF_SPIM_MODE_0,
        .bit_order = NRF_SPIM_BIT_ORDER_MSB_FIRST,
        .miso_pull = NRF_GPIO_PIN_NOPULL,
        .ss_duration = 5UL,
        .dcx_pin = NRF_SPIM_PIN_NOT_CONNECTED,
        .use_hw_ss = true,  // TODO LR: Not sure if this should be true
        .rx_delay = 2UL,
    };

    // Perform Reconfigure
    nrfx_err_t err = nrfx_spim_reconfigure(&amp;amp;spiDev, &amp;amp;spiConfig);
    if (err != NRFX_SUCCESS) {
        printk(&amp;quot;[SPI] FAILURE: Reconfiguration Failed\n&amp;quot;);
    }&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Despite this, the device seems to operate fine. When scoping the lines, the CS functions appropriately. Is there any consequence or negative side effect if I keep it this way? Why does this work?&lt;/p&gt;
&lt;p&gt;Channel 4 (Yellow) - SPI CS&lt;/p&gt;
&lt;p&gt;Channel 5 (Green) - IMU Interrupt&lt;/p&gt;
&lt;p&gt;Channel 6 (Blue) - SPI MOSI&lt;/p&gt;
&lt;p&gt;Channel 7 (Purple) - SPI MISO&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1762909665476v1.png" alt=" " /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/553375?ContentTypeID=1</link><pubDate>Wed, 05 Nov 2025 08:25:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c3dd3705-b966-4b41-a9dc-a0e289e39c9d</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;That is up to you to test. The last one (hooked on the SPI Transmission End) is fine. The question is whether or not it is enough to set the CSN pin at the same time as you start the transmission. Is it enough for the SPI slave to react to it? Does it behave the way you want when you do it this way?&lt;/p&gt;
&lt;p&gt;If not, you probably need to set it a little bit sooner. Perhaps you need to include a timer, first set the CSN, start the timer, and when the timer reaches a certain value, then start the SPI transmission.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/553071?ContentTypeID=1</link><pubDate>Fri, 31 Oct 2025 21:51:50 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4cded6e6-74b3-485c-ad91-acc8a4a5af1b</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hi Edvin,&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;The bus is serviced every 5ms, so setting and unsetting manually is not ideal.&lt;/p&gt;
&lt;p&gt;It looks like you can set multiple channels from the same event. I was thinking of the following:&lt;/p&gt;
&lt;p&gt;First,&lt;/p&gt;
&lt;p&gt;IMU Interrupt (GPIOTE)&amp;nbsp; ---&amp;gt; GPPI Channel ---&amp;gt;&amp;nbsp; SPI Transmission Start&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;----&amp;gt; GPPI Channel ---&amp;gt; Chip Select High-to-Low (GPIOTE)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Then,&lt;/p&gt;
&lt;p&gt;&lt;span&gt;SPI Transmission&amp;nbsp;End ----&amp;gt; GPPI Channel ---&amp;gt; Chip Select&amp;nbsp;Low-to-High&amp;nbsp;(GPIOTE)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Would this work reliably?&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/552474?ContentTypeID=1</link><pubDate>Mon, 27 Oct 2025 12:40:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f2788c21-426e-42a1-a829-e7495481f3fe</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;For the CSN pin this can&amp;#39;t be controlled by GPPI. Do you have any other devices on the SPI bus? Is it an alternative to just set it before you start your 5 second routine, and then unset it after it is done?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/552377?ContentTypeID=1</link><pubDate>Fri, 24 Oct 2025 16:51:33 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:afbd3c2c-3e4d-48ea-be0f-251a19eccc03</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Update on this, I realized that my logic analyzer was sampling at 6.25 Mb/s while the SPI bus is operating at 8MHz, so the communication is fine. The logic displayer was just aliasing data. At the moment, I have most of the driver working with the following two GPPI pipelines.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;GPIOTE --&amp;gt; GPPI --&amp;gt; SPI Transfer&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;then&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;SPI End Event --&amp;gt; GPPI --&amp;gt; Timer (Counter) --&amp;gt; Interrupt (Reset&amp;nbsp;DMA List Rx Buffer Pointer)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Despite the above, I am still unsure how the chip select is intended to be setup for this. The header file cryptically states that it must be handled outside the driver... Are we intended to use the fork functionality to trigger a GPIO low whenever we intend to perform a SPI Transfer?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Additionally, I found a few interesting forum posts that stated there is no way for the SPI Transfer from GPPI to know when the DMA List (which is what is being used underneath) is full. As such, the DMA list&amp;#39;s Rx Buffer must be regularly serviced otherwise a crash WILL occur. I find this to be very odd design... My intent with this feature overall was to mitigate data loss during Bluetooth disconnections which I believe to be as long as 5 seconds.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pondering this scenario, for the data collected, there are 17 bytes of data sampled at 200Hz for 5 seconds. This means for a buffer to not fill up during one of these disconnections we would need:&lt;/p&gt;
&lt;p&gt;17bytes * 200Hz *&amp;nbsp; 5 seconds =&amp;nbsp;17,000 byte&lt;/p&gt;
&lt;p&gt;Moreover, to use the data in the buffers, it seems most convenient to double buffer all the data versus ring the buffer. Ringing the buffer poses the risk of overflow if a Bluetooth interrupt occurs that blocks the processor from ringing the buffer and thus, the DMA list overruns the buffer it is selected...&lt;/p&gt;
&lt;p&gt;So, double buffering&amp;nbsp;requires twice the amount of bytes: 34,000 ~= 34kB.&lt;/p&gt;
&lt;p&gt;From my pipeline, the last step (the counter interrupt) is intended to reset the buffer as quickly possible once the processor is no longer blocked by Bluetooth interrupts. The device overflowing its memory and crashing is not tolerable in my application.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;None of this seems to be clearly documented, so I am piecing together what I can from forum posts. Is this the intended way for these peripherals to function?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/552192?ContentTypeID=1</link><pubDate>Wed, 22 Oct 2025 23:45:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:3de89a44-87be-42bd-bf8f-6081247404b4</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Here is a zoomed out picture of the GPIOTE working with SPI.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1761176675558v1.png" alt=" " /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/552191?ContentTypeID=1</link><pubDate>Wed, 22 Oct 2025 23:43:08 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:998dc876-46e1-440d-a7a1-7bfa50a92ec6</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hello Edvin,&lt;/p&gt;
&lt;p&gt;I have made progress in implementing this interface, but found some confusing behavior. First when looking into the nrfx_spim.h file, for&amp;nbsp;NRFX_SPIM_FLAG_HOLD_XFER, it states &amp;quot;&lt;span&gt;Chip select must be configured to &lt;/span&gt;&lt;span&gt;@ref&lt;/span&gt;&lt;span&gt; NRF_SPIM_PIN_NOT_CONNECTED and managed outside the driver.&lt;/span&gt;&amp;quot; What does this mean? Am I expected to setup a GPIO to also be triggered via GPPI for my SPI driver separately.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Second, I was able to setup the GPPI interface correctly, but I am using GPIOTE instead of the timer. Our IMUs have an interrupt line which are triggered cyclically, so it serves the same purpose. The problem I am having is that when I try to schedule a repeated transfer to be used on each GPIOTE interrupt, the full SPI MOSI transmission is not being sent. Any ideas?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here are some waveforms:&lt;/p&gt;
&lt;p&gt;Channel 4 (Yellow&lt;span&gt;)&lt;/span&gt;: SPI MISO&lt;/p&gt;
&lt;p&gt;Channel 6 &lt;span&gt;(&lt;/span&gt;Blue&lt;span&gt;)&lt;/span&gt;: IMU Interrupt Line&lt;/p&gt;
&lt;p&gt;Channel 7 (Purple): SPI MOSI&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;(Previous) Healthy SPI Communication (Polled) with No Interrupts&amp;nbsp;&lt;br /&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1761175655795v4.png" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;(Current) IMU Interrupt GPIOTE Triggered SPI Communication&amp;nbsp;&amp;nbsp;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1761176289053v5.png" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;From above, it seems my GPIOTE linkage with the GPPI interface is working: every IMU interrupt is followed by an attempted SPI transmission. The SPI transmission&amp;nbsp;is only a high for a few moments, and then low. It should be sending the value 0x&lt;span&gt;8C&lt;/span&gt;&lt;span&gt;&amp;nbsp;= 0b1000 1100. See code below:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;static void setupSPITrigger() {
    // Prepare Configuration
    // Note: SPI CS is Floating for Repeated Automatic Transfer
    nrfx_spim_config_t spiConfig = {
        .sck_pin = SPI_CLK_PIN_201,
        .mosi_pin = SPI_MOSI_PIN_202,
        .miso_pin = SPI_MISO_PIN_204,
        .ss_pin = NRF_SPIM_PIN_NOT_CONNECTED,
        .ss_active_high = false,
        .irq_priority = NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY,
        .orc = 0xFF,
        .frequency = NRFX_MHZ_TO_HZ(8),
        .mode = NRF_SPIM_MODE_0,
        .bit_order = NRF_SPIM_BIT_ORDER_MSB_FIRST,
        .miso_pull = NRF_GPIO_PIN_NOPULL,
        .ss_duration = 5UL,
        .dcx_pin = NRF_SPIM_PIN_NOT_CONNECTED,
        .use_hw_ss = false,  // TODO LR: Not sure if this should be true
        .rx_delay = 2UL,
    };

    // Perform Reconfigure
    nrfx_err_t err = nrfx_spim_reconfigure(&amp;amp;spiDev, &amp;amp;spiConfig);
    if (err != NRFX_SUCCESS) {
        printk(&amp;quot;[SPI] FAILURE: Reconfiguration Failed\n&amp;quot;);
        uPbit.SPI = FAIL;
        return;
    }

    // Setup Buffer for Transfers
    txBuffer[0] = (uint8_t)(0x0C | 0x80);
    nrfx_spim_xfer_desc_t spiTransferBuffer = NRFX_SPIM_XFER_TRX(txBuffer, 1,
                                                                 rxBuffer, 17);

    // Setup the Following Flags
    // NRFX_SPIM_FLAG_RX_POSTINC - Increments RX buffer address after transceive. Allows for repeated reads w/ same buf
    // NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER - Does not trigger an interrupt after transfer.
    // NRFX_SPIM_FLAG_HOLD_XFER - Sets up the transceive, but doesn&amp;#39;t actually perform the transceive.
    // NRFX_SPIM_FLAG_REPEATED_XFER - Prepares for multiple transceives.
    uint32_t spiFlags = NRFX_SPIM_FLAG_RX_POSTINC | NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER |
                        NRFX_SPIM_FLAG_HOLD_XFER | NRFX_SPIM_FLAG_REPEATED_XFER;

    // Setup Transfer
    err = nrfx_spim_xfer(&amp;amp;spiDev, &amp;amp;spiTransferBuffer, spiFlags);
    if (err != NRFX_SUCCESS) {
        printk(&amp;quot;[SPI] FAILURE: Transfer Setup Failed\n&amp;quot;);
        uPbit.SPI = FAIL;
        return;
    }

    printk(&amp;quot;[SPI] NRFX SPIM Setup for Repeated Transfer&amp;quot;);
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;/********************************************************************************************/  /**
 *  &amp;lt;!-- Function Name: XXXX()  --&amp;gt;
 *  @brief
 *
 *************************************************************************************************/
static void setupGPIOTE() {
    nrfx_err_t err;
	uint8_t imuGPIOChannel;

	// /* Connect GPIOTE instance IRQ to irq handler */
	// IRQ_CONNECT(DT_IRQN(GPIOTE_NODE), DT_IRQ(GPIOTE_NODE, priority), nrfx_isr,
	// 	    NRFX_CONCAT(nrfx_gpiote_, GPIOTE_INST, _irq_handler), 0);

	/* Initialize GPIOTE (the interrupt priority passed as the parameter
	 * here is ignored, see nrfx_glue.h).
	 */
    // Initialize GPIOTE
    // NRFX_GPIOTE_DEFAULT_CONFIG_IRQ_PRIORITY
	err = nrfx_gpiote_init(&amp;amp;gpioteDev, 0);
	if (err != NRFX_SUCCESS &amp;amp;&amp;amp; err != NRFX_ERROR_ALREADY) {
		printk(&amp;quot;nrfx_gpiote_init error: 0x%08X&amp;quot;, err);
		return;
	}

	err = nrfx_gpiote_channel_alloc(&amp;amp;gpioteDev, &amp;amp;imuGPIOChannel);
	if (err != NRFX_SUCCESS) {
		printk(&amp;quot;Failed to allocate in_channel, error: 0x%08X&amp;quot;, err);
		return;
	}

	/* Initialize input pin to generate event on high to low transition
	 * (falling edge) and call button_handler()
	 */
	static const nrf_gpio_pin_pull_t gpioPinConfig = NRF_GPIO_PIN_PULLUP;
	nrfx_gpiote_trigger_config_t triggerConfig = {
		.trigger = NRFX_GPIOTE_TRIGGER_HITOLO,
		.p_in_channel = &amp;amp;imuGPIOChannel,
	};
	nrfx_gpiote_input_pin_config_t gpioteConfig = {
		.p_pull_config = &amp;amp;gpioPinConfig,
		.p_trigger_config = &amp;amp;triggerConfig,
		.p_handler_config = NULL,
	};

	err = nrfx_gpiote_input_configure(&amp;amp;gpioteDev, GPIO_IMU_PIN, &amp;amp;gpioteConfig);
	if (err != NRFX_SUCCESS) {
		printk(&amp;quot;nrfx_gpiote_input_configure error: 0x%08X&amp;quot;, err);
		return ;
	}
}

/********************************************************************************************/  /**
 *  &amp;lt;!-- Function Name: XXXX()  --&amp;gt;
 *  @brief
 *
 *************************************************************************************************/
static void setupGPPI() {
    nrfx_err_t err;
    uint8_t gppiChannel;

    // Allocate GPPI Channel
    err = nrfx_gppi_channel_alloc(&amp;amp;gppiChannel);
    printk(&amp;quot;[SPI] NRFX GPPI Channel: %s\n&amp;quot;, (err == NRFX_SUCCESS) ? &amp;quot;initialized&amp;quot; : &amp;quot;not initialized&amp;quot;);

    // Connect GPIOTE to SPI Event Task
    nrfx_gppi_channel_endpoints_setup(gppiChannel,
		nrfx_gpiote_in_event_address_get(&amp;amp;gpioteDev, GPIO_IMU_PIN),
		nrfx_spim_start_task_address_get(&amp;amp;spiDev));

    // Enable GPPI Channel
    nrfx_gppi_channels_enable(BIT(gppiChannel));
    nrfx_gpiote_trigger_enable(&amp;amp;gpioteDev, GPIO_IMU_PIN, true);
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/551416?ContentTypeID=1</link><pubDate>Tue, 14 Oct 2025 11:55:03 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:935e5c15-e008-49c8-9919-789eb385f543</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;Yes, the reason is probably the external flash chip on the DK, which is controlled by the SPI.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you look in the NCS v2.9.1\zephyr\boards\nordic\nrf54l15dk\nrf54l_05_10_15_cpuapp_common.dtsi, you can see that the default configuration for SPI00 is:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;&amp;amp;spi00 {
	status = &amp;quot;okay&amp;quot;;
	cs-gpios = &amp;lt;&amp;amp;gpio2 5 GPIO_ACTIVE_LOW&amp;gt;;
	pinctrl-0 = &amp;lt;&amp;amp;spi00_default&amp;gt;;
	pinctrl-1 = &amp;lt;&amp;amp;spi00_sleep&amp;gt;;
	pinctrl-names = &amp;quot;default&amp;quot;, &amp;quot;sleep&amp;quot;;

	mx25r64: mx25r6435f@0 {
		compatible = &amp;quot;jedec,spi-nor&amp;quot;;
		status = &amp;quot;okay&amp;quot;;
		reg = &amp;lt;0&amp;gt;;
		spi-max-frequency = &amp;lt;8000000&amp;gt;;
		jedec-id = [c2 28 17];
		sfdp-bfp = [
			e5 20 f1 ff  ff ff ff 03  44 eb 08 6b  08 3b 04 bb
			ee ff ff ff  ff ff 00 ff  ff ff 00 ff  0c 20 0f 52
			10 d8 00 ff  23 72 f5 00  82 ed 04 cc  44 83 48 44
			30 b0 30 b0  f7 c4 d5 5c  00 be 29 ff  f0 d0 ff ff
		];
		size = &amp;lt;67108864&amp;gt;;
		has-dpd;
		t-enter-dpd = &amp;lt;10000&amp;gt;;
		t-exit-dpd = &amp;lt;35000&amp;gt;;
	};
};&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;meaning, SPI00 is enabled, and it is used for the mx25r6435f, which is the external flash chip.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;So to fix this, either disable spi00&amp;#39;s mx25r64, so that it is not used for the external flash chip (because then it will be enabled), or use another SPI instance in your application.&lt;/p&gt;
&lt;p&gt;To disable the mx25r64 please add this to your .overlay (near the top):&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;/delete-node/ &amp;amp;mx25r64;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/551325?ContentTypeID=1</link><pubDate>Mon, 13 Oct 2025 19:35:21 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:49441067-8bd1-4cb2-8c0e-d65864d25344</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hi Edvin,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thank you for the suggestion. I have created a small project based on the example code in the nrfx_spim project to display the behavior I am seeing.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Initially, I did not see the NRFX_ERROR_ALREADY failure mode. After some investigation, I found that this issue occurs when configuring some CONFIGS in prj.conf. I have about 100 configs on and as such can&amp;#39;t find all the ones causing this issue. That being said I did find that CONFIG_FLASH=y reproduces the issue.&lt;/p&gt;
&lt;p&gt;In developing my driver API, I have found that I can&amp;nbsp;call&amp;nbsp;nrfx_spim_reconfigure() if I wish to&amp;nbsp;use my configs. With this workaround, the basic SPI functionality works, however,&amp;nbsp;this&amp;nbsp;is not ideal without proper reasoning. Is this&amp;nbsp;intended behavior?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;main.c&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;#include &amp;lt;nrfx_spim.h&amp;gt;
#include &amp;lt;zephyr/sys/printk.h&amp;gt;

#define SPI_CLK_PIN_201   65
#define SPI_MOSI_PIN_202  66
#define SPI_MISO_PIN_204  68
#define SPI_CS_PIN_205    69

int main(void) {
    // Get Device Reference
    nrfx_spim_t spiDev = NRFX_SPIM_INSTANCE(00);

    // Setup Config
    nrfx_spim_config_t spiConfig = NRFX_SPIM_DEFAULT_CONFIG(SPI_CLK_PIN_201,
        SPI_MOSI_PIN_202, SPI_MISO_PIN_204, SPI_CS_PIN_205);

    // Initialize SPIM
    nrfx_err_t err = nrfx_spim_init(&amp;amp;spiDev, &amp;amp;spiConfig, NULL, NULL);

    // Check if Initialization was Successful
    if (err != NRFX_SUCCESS || !nrfx_spim_init_check(&amp;amp;spiDev)) {  // LR: If CONFIG_FLASH=y then will return NRFX_ERROR_ALREADY
        printk(&amp;quot;[SPI] Failure: NRFX SPI Initialization %s\n&amp;quot;);
    }

    return 0;
}


&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CMakeLists.txt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(nrfx_example)
target_sources(app PRIVATE main.c)
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nrf54l15dk_nrf54l15_cpuapp.overlay&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;&amp;amp;pinctrl {
	spi00_default: spi00_default {
		group1 {
			psels = &amp;lt;NRF_PSEL(SPIM_SCK, 2, 1)&amp;gt;,
				&amp;lt;NRF_PSEL(SPIM_MOSI, 2, 2)&amp;gt;,
				&amp;lt;NRF_PSEL(SPIM_MISO, 2, 4)&amp;gt;;
		};
	};

	spi00_sleep: spi00_sleep {
		group1 {
			psels = &amp;lt;NRF_PSEL(SPIM_SCK, 2, 1)&amp;gt;,
				&amp;lt;NRF_PSEL(SPIM_MOSI, 2, 2)&amp;gt;,
				&amp;lt;NRF_PSEL(SPIM_MISO, 2, 4)&amp;gt;;
				low-power-enable;
		};
	};
};

&amp;amp;spi00 {
	compatible = &amp;quot;nordic,nrf-spim&amp;quot;;
	status = &amp;quot;okay&amp;quot;;
	cs-gpios = &amp;lt;&amp;amp;gpio2 5 GPIO_ACTIVE_LOW&amp;gt;;
	pinctrl-0 = &amp;lt;&amp;amp;spi00_default&amp;gt;;
	pinctrl-1 = &amp;lt;&amp;amp;spi00_sleep&amp;gt;;
	pinctrl-names = &amp;quot;default&amp;quot;, &amp;quot;sleep&amp;quot;;
	bmi270: spi-dev-bmi270@0 {
		compatible = &amp;quot;bosch,bmi270&amp;quot;;
		status = &amp;quot;okay&amp;quot;;
		reg = &amp;lt;0&amp;gt;;
		spi-max-frequency = &amp;lt;8000000&amp;gt;;
	};
};&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;prj.conf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;CONFIG_NRFX_SPIM00=y
CONFIG_FLASH=y&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/551231?ContentTypeID=1</link><pubDate>Mon, 13 Oct 2025 08:39:32 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:de4529d6-7d73-4ef3-b4d3-cbecb15be01e</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello Levi,&lt;/p&gt;
&lt;p&gt;I see. Yes, you need to disable the SPI by either setting CONFIG_SPI=n or just commenting it out.&lt;/p&gt;
&lt;p&gt;Please refer to the sample found in:&lt;/p&gt;
&lt;p&gt;NCS\modules\hal\nordic\nrfx\samples\src\nrfx_spim\&lt;/p&gt;
&lt;p&gt;This one doesn&amp;#39;t have board files for the nRF54L15, but if you look at e.g. the board files for nrf52840dk_nrf52840.overlay, you can see that in devicetree, the SPI instance is enabled. CONFIG_SPI is not set, but the SPI instance you want to use needs to be enables in prj.conf. E.g.:&lt;/p&gt;
&lt;p&gt;CONFIG_NRFX_SPIM00=y&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Give that a go. If it doesn&amp;#39;t work, feel free to upload the current state of your application, and I can have a look.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/551174?ContentTypeID=1</link><pubDate>Sat, 11 Oct 2025 00:12:08 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:71fdf6b5-da84-498c-b551-4c22ae23c5eb</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hello again,&lt;/p&gt;
&lt;p&gt;I have been trying to get the nrfx interface working for my branch but I am having difficulties. The problem I am having is that if I call the function: nrfx_spim_init, it will always return NRFX_ERROR_ALREADY, signifying the driver as already been initialized. I decided to ignore this error however, when calling:&amp;nbsp;nrfx_spim_xfer, I receive no data. Please note my peripheral was previously working with the Zephyr SPI API. So,&amp;nbsp;&lt;span style="font-family:inherit;"&gt;I assumed this was the Zephyr instance initializing the driver without the proper config and tried to turn it off.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I tried doing this two ways with no success. First, I tried setting:&amp;nbsp;&lt;span&gt;CONFIG_SPI&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;n. This&lt;/span&gt;&amp;nbsp;is always overrode by the build, even when I turn off all other configs and gut my project.&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1760141446388v1.png" alt=" " /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;I have also tried disabling the device tree node:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;spi00&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;disabled&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;However, this causes a compilation failure, as the build complains no valid SPI driver is provided.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Any insight?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;Levi&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/550631?ContentTypeID=1</link><pubDate>Fri, 03 Oct 2025 22:59:27 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7a34a2c6-dcc4-4a54-a481-121c82cbc57a</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hi Edvin,&lt;/p&gt;
&lt;p&gt;Thanks for your response. The IMU is being sampled every 5ms and for missed readings, this can vary. Depending on the connection quality, we have missed over 100ms of data. Losing 1-2 samples can be impactful to our system accuracy.&lt;/p&gt;
&lt;p&gt;Thank you for your suggestion about the PPI as a solution. I agree it appears to have the functionality required.&amp;nbsp;I will be traveling for business this next week, so I am unable to test my code. I will provide an update for other visitors of this thread and will fully respond late next week.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Looking over the example you suggested, I have found the functions you described:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;nrfx_spim_start_task_address_get()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;nrfx_spim_end_event_address_get()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;For the first function, I have the following code which links the timer to the SPI peripheral using the GPPI channel.&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;nrfx_gppi_channel_endpoints_setup(gppiChannel, 
        nrfx_timer_compare_event_address_get(&amp;amp;timerDev, NRF_TIMER_CC_CHANNEL0),
        nrfx_spim_start_task_address_get(&amp;amp;spiDev));&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;For the second function, the documentation suggests that you can use it to determine the number of events but does not go into detail.&amp;nbsp;I am assuming you can calculate a delta?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="text"&gt;printk(&amp;quot;Address Difference %d \n&amp;quot;, nrfx_spim_end_event_address_get(&amp;amp;spiDev) - 
    nrfx_spim_start_task_address_get(&amp;amp;spiDev));&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;The last puzzle piece is setting up the cyclical SPI transfer.&amp;nbsp;The&amp;nbsp;nrfx_spim_xfer() documentation goes into great detail which is nice.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="text"&gt;static void prepareSPITransfer() {
    nrfx_err_t err;
    // Setup Buffer for Transfers
    nrfx_spim_xfer_desc_t spiTransferBuffer = NRFX_SPIM_XFER_TRX(txBuffer, sizeof(txBuffer), 
                                                                 rxBuffer, sizeof(rxBuffer));
    
    // Setup the Following Flags
    // NRFX_SPIM_FLAG_RX_POSTINC - Increments RX buffer address after transceive. Allows for repeated reads w/ same buf
    // NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER - Does not trigger an interrupt after transfer.
    // NRFX_SPIM_FLAG_HOLD_XFER - Sets up the transceive, but doesn&amp;#39;t actually perform the transceive.
    // NRFX_SPIM_FLAG_REPEATED_XFER - Prepares for multiple transceives.
    uint32_t spiFlags = NRFX_SPIM_FLAG_RX_POSTINC | NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER | 
                        NRFX_SPIM_FLAG_HOLD_XFER | NRFX_SPIM_FLAG_REPEATED_XFER;
    
    // Setup Transfer
    err = nrfx_spim_xfer(&amp;amp;spiDev, &amp;amp;spiTransferBuffer, spiFlags);
    printk(&amp;quot;SPIM Tansfer: %s\n&amp;quot;, (err == NRFX_SUCCESS) ? &amp;quot;setup&amp;quot; : &amp;quot;not setup&amp;quot;);
}&lt;/pre&gt;&lt;/span&gt;Most of the setup seems to be in the flags and how they operate.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All other code seems to be copy/paste from the GPIOTE example you suggested.&lt;/p&gt;
&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;Levi&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Real-Time Requirements | EasyDMA</title><link>https://devzone.nordicsemi.com/thread/550587?ContentTypeID=1</link><pubDate>Fri, 03 Oct 2025 12:31:25 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f69056e1-8801-46d3-9004-c37e8e2c4763</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;At what speed/rate are you reading the IMU? And how many readings are you missing due to BLE events?&lt;/p&gt;
&lt;p&gt;If you want to look into DMA, you can have a look at this ticket, which discusses this:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="https://devzone.nordicsemi.com/f/nordic-q-a/121537/nrf54l15dk-unable-to-use-nrfx_spim_flag_tx_postinc-flag-in-nrfx_spim_xfer-api"&gt;NRF54L15DK unable to use NRFX_SPIM_FLAG_TX_POSTINC flag in nrfx_spim_xfer API&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Alternatively, there is an option to use PPI (Programmable peripheral interface). This way, you can connect events in one peripheral to a task in another. In your case, you would typipcally connect a timer event to the PPI, and you can trigger a transceive command from there.&lt;/p&gt;
&lt;p&gt;As an example, you can look at how the sample found in NCS\modules\hal\nordic\nrfx\samples\src\nrfx_ppi&lt;/p&gt;
&lt;p&gt;This uses a timer to toggle a GPIO, but you can replace the GPIO with any peripheral.&lt;/p&gt;
&lt;p&gt;You can see that this sample uses nrfx_giote_out_task_address_get() to find the address of the task in the GPIO. The equivavalent function for SPI is found in&amp;nbsp;ncs\modules\hal\nordic\nrfx\drivers\include\nrfx_spim.h. Search for &amp;quot;address_get(&amp;quot; in that file, and you should find the ones that you need.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>