<?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>nRF54L15DK (NCS v3.1.0): SPIM22 signals not routing to physical pins (GPIOMCU issue?)</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/127670/nrf54l15dk-ncs-v3-1-0-spim22-signals-not-routing-to-physical-pins-gpiomcu-issue</link><description>Environment: 
 
 Board: nRF54L15DK ( nrf54l15dk/nrf54l15/ cpuapp ) 
 NCS Version: v3.1.0 
 Zephyr OS: v3.7.99 (NCS fork) NOTE: I am building this over peripheral uart example, so I want to keep that functionality intact besides this. 
 
 Overview: I am</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 08 Apr 2026 09:09:50 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/127670/nrf54l15dk-ncs-v3-1-0-spim22-signals-not-routing-to-physical-pins-gpiomcu-issue" /><item><title>RE: nRF54L15DK (NCS v3.1.0): SPIM22 signals not routing to physical pins (GPIOMCU issue?)</title><link>https://devzone.nordicsemi.com/thread/564595?ContentTypeID=1</link><pubDate>Wed, 08 Apr 2026 09:09:50 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:397dfe67-d6df-4ca8-9b82-6eb5bcae5ee7</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;From the logs you posted, it looks like the SPI communication is working and that the busy signal is asserted and de-asserted correctly at the beginning during initialization of the display. If you have an oscilloscope or logic analyzer, I would recommend probing the bus so you can easily compare the differences between your SPI hardware and SPI software (bit-bang) version.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF54L15DK (NCS v3.1.0): SPIM22 signals not routing to physical pins (GPIOMCU issue?)</title><link>https://devzone.nordicsemi.com/thread/564572?ContentTypeID=1</link><pubDate>Wed, 08 Apr 2026 06:10:01 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d1c248c0-7880-4a74-a938-eab045c078f3</guid><dc:creator>jasansingh</dc:creator><description>&lt;p&gt;It works when I use software implementation i.e using bit bitbanging approach. But when I try using SPI hardware I could see an average voltage measured of around 1.6v, but Busy signal is still low like shown in uart.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;I am using Waveshare 4.2&amp;quot; display V2 if that helps, I do not have trace, please let me know if you need any other details.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF54L15DK (NCS v3.1.0): SPIM22 signals not routing to physical pins (GPIOMCU issue?)</title><link>https://devzone.nordicsemi.com/thread/564571?ContentTypeID=1</link><pubDate>Wed, 08 Apr 2026 05:57:07 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:345fd5ed-904e-46b1-b329-a49c7bd6fdc5</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;&lt;span&gt;You initially reported that there were no clock or data signals on the SPI bus. Is it still not working after you fixed the pinctrl assignments? Do you have a logic trace?&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF54L15DK (NCS v3.1.0): SPIM22 signals not routing to physical pins (GPIOMCU issue?)</title><link>https://devzone.nordicsemi.com/thread/564569?ContentTypeID=1</link><pubDate>Wed, 08 Apr 2026 03:42:34 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0b875bbc-95e5-435f-928b-dd045764bbb2</guid><dc:creator>jasansingh</dc:creator><description>&lt;p&gt;I am still seeing the same issue, where the BUSY signal never goes high even after MASTER activvation command sent&lt;/p&gt;
&lt;p&gt;epaper.c&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;/*
 * Copyright (c) 2024
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 *
 * Waveshare 4.2&amp;quot; e-Paper driver for the nRF54L15DK.
 *
 * Controller: SSD1683 (Waveshare V2 variant).
 * Resolution: 400 x 300 pixels, 1-bit monochrome.
 * Interface:  Selectable via CONFIG_EPAPER_SW_SPI / CONFIG_EPAPER_HW_SPI.
 *             See src/epaper_spi.h for the two-define selection mechanism.
 *
 * Pins:
 *   SPI (SCK P1.14 / DIN P1.08 / CS P1.09) — managed by the transport layer.
 *   DC  P1.11  RST P1.12  BUSY P1.06        — managed here.
 *
 * Framebuffer layout:
 *   - 15 000 bytes (400 * 300 / 8)
 *   - Byte index:  idx = (x / 8) + y * (EPD_WIDTH / 8)
 *   - Bit mask:    0x80 &amp;gt;&amp;gt; (x % 8)   [MSB = leftmost pixel in byte]
 *   - Bit value 1 = white, 0 = black
 *
 * Debug output:
 *   All [EPD] printk() lines go to the UART console (uart20, 115200 baud).
 *   LOG_INF/LOG_ERR lines go to RTT (connect via J-Link RTT Viewer).
 */

#include &amp;quot;epaper.h&amp;quot;
#include &amp;quot;epaper_spi.h&amp;quot;
#include &amp;quot;font5x7.h&amp;quot;

#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/device.h&amp;gt;
#include &amp;lt;zephyr/devicetree.h&amp;gt;
#include &amp;lt;zephyr/drivers/gpio.h&amp;gt;
#include &amp;lt;zephyr/logging/log.h&amp;gt;

#include &amp;lt;string.h&amp;gt;

LOG_MODULE_REGISTER(epaper, LOG_LEVEL_DBG);

/* -------------------------------------------------------------------------
 * Timing constants
 * All values are conservative (larger than minimum) for wiring tolerance.
 * ------------------------------------------------------------------------- */
#define EPD_POWER_ON_DELAY_MS   200  /* VDD stabilisation after power-on                     */
#define EPD_RESET_HIGH_MS       100  /* RST high before asserting reset (V2 ref: 100 ms)     */
#define EPD_RESET_PULSE_MS        2  /* RST low pulse width        (V2 ref: 2 ms)            */
#define EPD_RESET_RELEASE_MS    100  /* Settle time after RST deasserted (V2 ref: 100 ms)    */
#define EPD_SW_RESET_DELAY_MS    20  /* Wait after 0x12 SW_RESET command                     */
#define EPD_BUSY_POLL_MS         10  /* Polling interval while waiting for BUSY              */
#define EPD_BUSY_TIMEOUT_MS    6000  /* Maximum time to wait for BUSY to go LOW              */
/* EPD_BUSY_POLL_MS is reused as the post-MASTER_ACTIVATION probe delay.
 * A genuine full refresh takes &amp;gt; 1 000 ms, so 10 ms is more than enough to
 * distinguish a connected (BUSY = 1) from a floating (BUSY = 0) signal. */

/* -------------------------------------------------------------------------
 * Devicetree node aliases
 * ------------------------------------------------------------------------- */
#define EPAPER_NODE DT_NODELABEL(epaper)

/*
 * Thin adapter macros so the rest of this file is unchanged regardless of
 * which SPI transport is compiled.  All actual SPI logic lives in
 * epaper_spi_sw.c (software) or epaper_spi_hw.c (hardware SPIM + DMA).
 */
#define epd_send_cmd(c)     epaper_spi_cmd((uint8_t)(c))
#define epd_send_byte(d)    epaper_spi_data((uint8_t)(d))
#define epd_send_buf(b, l)  epaper_spi_buf((b), (l))

/* GPIO control lines — DC and CS are owned by the transport layer */
static const struct gpio_dt_spec rst_gpio =
    GPIO_DT_SPEC_GET(EPAPER_NODE, reset_gpios);

static const struct gpio_dt_spec busy_gpio =
    GPIO_DT_SPEC_GET(EPAPER_NODE, busy_gpios);

/* -------------------------------------------------------------------------
 * Framebuffer  (15 000 bytes, static allocation in BSS)
 * ------------------------------------------------------------------------- */
static uint8_t framebuf[EPD_BUF_SIZE];

/* SPI transfers are forwarded to the selected transport via the
 * epd_send_cmd / epd_send_byte / epd_send_buf macros defined above. */

/* -------------------------------------------------------------------------
 * Display control helpers
 * ------------------------------------------------------------------------- */

/*
 * Poll BUSY until the display signals idle (LOW), with a hard timeout.
 *
 * BUSY = HIGH → display is busy / refreshing
 * BUSY = LOW  → display is idle, ready to accept commands
 *
 * Prints to UART:
 *   - Pin level on entry (helps detect always-HIGH / always-LOW faults)
 *   - Heartbeat every 500 ms while waiting (confirms MCU is alive)
 *   - Elapsed time when BUSY finally goes LOW
 *   - A clear ERROR line on timeout
 *
 * Returns true if idle was reached, false on timeout.
 */
static bool epd_wait_busy(const char *context)
{
    int64_t t_start    = k_uptime_get();
    int64_t deadline   = t_start + EPD_BUSY_TIMEOUT_MS;
    int64_t t_last_hb  = t_start;
    int     pin_entry  = gpio_pin_get_dt(&amp;amp;busy_gpio);

    printk(&amp;quot;[EPD] wait_busy [%s]: BUSY pin = %d at entry  &amp;quot;
           &amp;quot;(1=busy HIGH, 0=idle LOW)\n&amp;quot;, context, pin_entry);
    LOG_INF(&amp;quot;wait_busy [%s]: BUSY pin = %d at entry&amp;quot;, context, pin_entry);

    while (gpio_pin_get_dt(&amp;amp;busy_gpio) == 1) {
        int64_t now = k_uptime_get();

        if (now &amp;gt; deadline) {
            printk(&amp;quot;[EPD] *** BUSY TIMEOUT *** [%s] after %d ms\n&amp;quot;
                   &amp;quot;      --&amp;gt; Is display powered? Is P1.06 connected to BUSY?\n&amp;quot;
                   &amp;quot;      --&amp;gt; Continuing anyway — subsequent commands may fail.\n&amp;quot;,
                   context, EPD_BUSY_TIMEOUT_MS);
            LOG_ERR(&amp;quot;BUSY timeout %d ms [%s] — check P1.06 wiring!&amp;quot;,
                    EPD_BUSY_TIMEOUT_MS, context);
            return false;
        }

        if (now - t_last_hb &amp;gt;= 500) {
            printk(&amp;quot;[EPD] ... still waiting [%s], elapsed %d ms, BUSY=%d\n&amp;quot;,
                   context, (int)(now - t_start),
                   gpio_pin_get_dt(&amp;amp;busy_gpio));
            t_last_hb = now;
        }

        k_msleep(EPD_BUSY_POLL_MS);
    }

    int elapsed = (int)(k_uptime_get() - t_start);

    printk(&amp;quot;[EPD] BUSY went LOW after %d ms [%s]  &amp;lt;-- OK\n&amp;quot;, elapsed, context);
    LOG_INF(&amp;quot;wait_busy [%s]: idle after %d ms&amp;quot;, context, elapsed);
    return true;
}

/*
 * Pulse RST to hardware-reset the display controller.
 * After this function returns the controller is out of reset but still
 * performing its internal init — do NOT send any SPI command until
 * EPD_RESET_RELEASE_MS has elapsed (handled by the caller).
 */
static void epd_hw_reset(void)
{
    /* RST HIGH → LOW → HIGH, matching Waveshare V2 reference timing */
    printk(&amp;quot;[EPD] HW reset: RST HIGH (%d ms)\n&amp;quot;, EPD_RESET_HIGH_MS);
    LOG_INF(&amp;quot;HW reset start&amp;quot;);
    gpio_pin_set_dt(&amp;amp;rst_gpio, 1);
    k_msleep(EPD_RESET_HIGH_MS);                 /* 100 ms */

    printk(&amp;quot;[EPD] HW reset: RST LOW pulse (%d ms)\n&amp;quot;, EPD_RESET_PULSE_MS);
    gpio_pin_set_dt(&amp;amp;rst_gpio, 0);
    k_msleep(EPD_RESET_PULSE_MS);                /* 2 ms   */

    gpio_pin_set_dt(&amp;amp;rst_gpio, 1);
    k_msleep(EPD_RESET_RELEASE_MS);              /* 100 ms settle — controller init */
    printk(&amp;quot;[EPD] HW reset: RST released, %d ms settle done\n&amp;quot;,
           EPD_RESET_RELEASE_MS);

    printk(&amp;quot;[EPD] HW reset: monitoring BUSY for 300 ms after RST release...\n&amp;quot;);
    bool busy_ever_high = false;
    int  busy_rise_ms   = -1;
    int  busy_fall_ms   = -1;
    int  prev_b         = 0;

    for (int t = 0; t &amp;lt; 300; t++) {
        int b = gpio_pin_get_dt(&amp;amp;busy_gpio);

        if (b == 1 &amp;amp;&amp;amp; prev_b == 0) {
            busy_rise_ms   = t;
            busy_ever_high = true;
            printk(&amp;quot;[EPD]   BUSY rose  HIGH at %3d ms\n&amp;quot;, t);
        } else if (b == 0 &amp;amp;&amp;amp; prev_b == 1) {
            busy_fall_ms = t;
            printk(&amp;quot;[EPD]   BUSY fell  LOW  at %3d ms  (reset complete)\n&amp;quot;, t);
            break; /* display ready — no need to wait longer */
        }

        prev_b = b;
        k_msleep(1);
    }

    if (busy_ever_high) {
        printk(&amp;quot;[EPD] HW reset: BUSY pulsed HIGH (%d ms) then LOW (%d ms) -- RST OK\n&amp;quot;,
               busy_rise_ms,
               busy_fall_ms &amp;gt;= 0 ? busy_fall_ms : 300);
    } else {
        printk(&amp;quot;[EPD] HW reset: BUSY never went HIGH in 300 ms.\n&amp;quot;);
        printk(&amp;quot;[EPD]   --&amp;gt; RST wire (P1.12 to display RST) may not be connected.\n&amp;quot;);
        printk(&amp;quot;[EPD]   --&amp;gt; The SPI init sequence will still proceed.\n&amp;quot;);
        printk(&amp;quot;[EPD]   --&amp;gt; If display stays blank: verify P1.12 &amp;lt;-&amp;gt; RST wire.\n&amp;quot;);
        LOG_WRN(&amp;quot;BUSY never HIGH after RST — check P1.12 RST wire&amp;quot;);
    }

    printk(&amp;quot;[EPD] HW reset: done\n&amp;quot;);
    LOG_INF(&amp;quot;HW reset done&amp;quot;);
}


/* Set the RAM write window to the full panel and move cursor to (0, 0). */
static void epd_set_window_and_cursor(void)
{
    /* RAM X: byte 0 → byte 49  (8 pixels per byte &amp;#215; 50 = 400 pixels) */
    epd_send_cmd(0x44);
    epd_send_byte(0x00);
    epd_send_byte((EPD_WIDTH / 8U) - 1U);         /* 49 = 0x31 */

    /* RAM Y: line 0 → line 299 */
    epd_send_cmd(0x45);
    epd_send_byte(0x00);                           /* YStart low  */
    epd_send_byte(0x00);                           /* YStart high */
    epd_send_byte((EPD_HEIGHT - 1U) &amp;amp; 0xFF);       /* YEnd low  = 0x2B */
    epd_send_byte(((EPD_HEIGHT - 1U) &amp;gt;&amp;gt; 8) &amp;amp; 0xFF); /* YEnd high = 0x01 */

    /* RAM X counter = 0 */
    epd_send_cmd(0x4E);
    epd_send_byte(0x00);

    /* RAM Y counter = 0 */
    epd_send_cmd(0x4F);
    epd_send_byte(0x00);
    epd_send_byte(0x00);
}

/* -------------------------------------------------------------------------
 * SSD1683 full initialisation sequence
 * Mirrors Waveshare 4.2&amp;quot; V2 Python driver (epd4in2_V2.py) exactly.
 * SPI transfers are delegated to the selected transport (SW or HW).
 * ------------------------------------------------------------------------- */
static int epd_init_hw(void)
{
    printk(&amp;quot;[EPD] ============================================\n&amp;quot;);
    printk(&amp;quot;[EPD]  SSD1683 init (V2 sequence)\n&amp;quot;);
    printk(&amp;quot;[EPD] ============================================\n&amp;quot;);

    /*
     * Init sequence mirrors Waveshare 4.2&amp;quot; V2 Python driver (epd4in2_V2.py)
     * exactly — same commands, same data bytes, same order.
     *
     * Key corrections vs previous version:
     *   • 0x01 (DRIVER_OUTPUT_CONTROL) removed — not in V2 init()
     *   • 0x21 data fixed: 0x40,0x00 (was 0x00,0x80)
     *     0x80 in byte-2 sets LUTSEL=1 (custom LUT from registers).
     *     No custom LUT was loaded, so waveform engine was undefined.
     *     0x00 in byte-2 = LUTSEL=0 → use factory-calibrated OTP LUT.
     *   • 0x21 / 0x3C sent BEFORE RAM window (V2 order)
     *   • 0x18 (TEMPERATURE_SENSOR) removed — not in V2 init()
     */

    /* Step 0: power-on stabilisation */
    printk(&amp;quot;[EPD] Step 0: power-on delay %d ms\n&amp;quot;, EPD_POWER_ON_DELAY_MS);
    k_msleep(EPD_POWER_ON_DELAY_MS);

    /* Step 1: hardware reset */
    printk(&amp;quot;[EPD] Step 1: hardware reset\n&amp;quot;);
    epd_hw_reset();

    /* Step 1b: wait for BUSY LOW after reset (V2: ReadBusy after reset()) */
    printk(&amp;quot;[EPD] Step 1b: wait BUSY LOW after HW reset\n&amp;quot;);
    epd_wait_busy(&amp;quot;post_hw_reset&amp;quot;);

    /* Step 2: software reset (0x12) then wait BUSY LOW (V2: ReadBusy after 0x12) */
    printk(&amp;quot;[EPD] Step 2: SW_RESET 0x12\n&amp;quot;);
    epd_send_cmd(0x12);
    k_msleep(EPD_SW_RESET_DELAY_MS);
    printk(&amp;quot;[EPD] Step 2b: wait BUSY LOW after SW_RESET\n&amp;quot;);
    epd_wait_busy(&amp;quot;SW_RESET&amp;quot;);

    /* Step 3: Display Update Control — 0x21, data 0x40, 0x00
     * Byte 1: 0x40 — normal BW display mode
     * Byte 2: 0x00 — LUTSEL=0 (use OTP/factory LUT, NOT register LUT) */
    printk(&amp;quot;[EPD] Step 3: DISPLAY_UPDATE_CTRL 0x21, data=0x40,0x00\n&amp;quot;);
    epd_send_cmd(0x21);
    epd_send_byte(0x40);
    epd_send_byte(0x00);

    /* Step 4: Border Waveform Control */
    printk(&amp;quot;[EPD] Step 4: BORDER_WAVEFORM 0x3C, data=0x05\n&amp;quot;);
    epd_send_cmd(0x3C);
    epd_send_byte(0x05);

    /* Step 5: Data Entry Mode — X increment, Y increment */
    printk(&amp;quot;[EPD] Step 5: DATA_ENTRY_MODE 0x11, data=0x03\n&amp;quot;);
    epd_send_cmd(0x11);
    epd_send_byte(0x03);

    /* Step 6: RAM X window: byte 0 (X=0) to byte 0x31=49 (X=399) */
    printk(&amp;quot;[EPD] Step 6: RAM X window 0x44: 0x00..0x31\n&amp;quot;);
    epd_send_cmd(0x44);
    epd_send_byte(0x00);
    epd_send_byte(0x31);

    /* Step 7: RAM Y window: line 0 to line 299 (0x012B) */
    printk(&amp;quot;[EPD] Step 7: RAM Y window 0x45: 0x0000..0x012B\n&amp;quot;);
    epd_send_cmd(0x45);
    epd_send_byte(0x00);
    epd_send_byte(0x00);
    epd_send_byte(0x2B);
    epd_send_byte(0x01);

    /* Step 8: RAM X counter = 0 */
    printk(&amp;quot;[EPD] Step 8: RAM cursor 0x4E=0x00, 0x4F=0x0000\n&amp;quot;);
    epd_send_cmd(0x4E);
    epd_send_byte(0x00);

    /* Step 9: RAM Y counter = 0 */
    epd_send_cmd(0x4F);
    epd_send_byte(0x00);
    epd_send_byte(0x00);

    /* Step 10: final BUSY wait (V2: ReadBusy at end of init()) */
    printk(&amp;quot;[EPD] Step 10: final wait BUSY LOW\n&amp;quot;);
    epd_wait_busy(&amp;quot;init_final&amp;quot;);

    printk(&amp;quot;[EPD] ============================================\n&amp;quot;);
    printk(&amp;quot;[EPD]  SSD1683 init COMPLETE — display ready\n&amp;quot;);
    printk(&amp;quot;[EPD] ============================================\n&amp;quot;);
    LOG_INF(&amp;quot;EPD init: complete&amp;quot;);
    return 0;
}

/* -------------------------------------------------------------------------
 * Public API
 * ------------------------------------------------------------------------- */

int epaper_init(void)
{
    printk(&amp;quot;[EPD] *** epaper_init() called ***\n&amp;quot;);
    printk(&amp;quot;[EPD] Display: Waveshare 4.2\&amp;quot; b/w, SSD1683, %ux%u px\n&amp;quot;,
           EPD_WIDTH, EPD_HEIGHT);
    printk(&amp;quot;[EPD] Transport: %s\n&amp;quot;,
           EPAPER_TRANSPORT_HW ? &amp;quot;hardware SPIM22 + DMA (nrfx)&amp;quot;
                               : &amp;quot;software SPI (bit-bang)&amp;quot;);
    LOG_INF(&amp;quot;epaper_init: starting&amp;quot;);

    /* ---- SPI transport (DC + CS + SPI pins) ---- */
    int err = epaper_spi_init();
    if (err) {
        printk(&amp;quot;[EPD] ERROR: epaper_spi_init() failed: %d\n&amp;quot;, err);
        LOG_ERR(&amp;quot;SPI transport init failed (%d)&amp;quot;, err);
        return err;
    }

    /* ---- RST GPIO (P1.12) ---- */
    if (!gpio_is_ready_dt(&amp;amp;rst_gpio)) {
        printk(&amp;quot;[EPD] ERROR: RST GPIO not ready\n&amp;quot;);
        LOG_ERR(&amp;quot;RST GPIO not ready&amp;quot;);
        return -ENODEV;
    }
    printk(&amp;quot;[EPD] RST GPIO (%s pin %u) ready\n&amp;quot;,
           rst_gpio.port-&amp;gt;name, rst_gpio.pin);

    /* ---- BUSY GPIO (P1.06) ---- */
    if (!gpio_is_ready_dt(&amp;amp;busy_gpio)) {
        printk(&amp;quot;[EPD] ERROR: BUSY GPIO not ready\n&amp;quot;);
        LOG_ERR(&amp;quot;BUSY GPIO not ready&amp;quot;);
        return -ENODEV;
    }
    printk(&amp;quot;[EPD] BUSY GPIO (%s pin %u) ready\n&amp;quot;,
           busy_gpio.port-&amp;gt;name, busy_gpio.pin);

    /* RST: output, start HIGH (not in reset) */
    err = gpio_pin_configure_dt(&amp;amp;rst_gpio, GPIO_OUTPUT_ACTIVE);
    if (err) {
        printk(&amp;quot;[EPD] ERROR: RST GPIO configure failed: %d\n&amp;quot;, err);
        LOG_ERR(&amp;quot;RST GPIO configure failed (%d)&amp;quot;, err);
        return err;
    }
    printk(&amp;quot;[EPD] RST GPIO configured OUTPUT HIGH\n&amp;quot;);

    /*
     * BUSY: input with internal pull-down.
     * Pull-down ensures LOW (idle) when the BUSY wire is disconnected,
     * so epd_wait_busy() never hangs even without the wire present.
     */
    err = gpio_pin_configure_dt(&amp;amp;busy_gpio, GPIO_INPUT | GPIO_PULL_DOWN);
    if (err) {
        printk(&amp;quot;[EPD] ERROR: BUSY GPIO configure failed: %d\n&amp;quot;, err);
        LOG_ERR(&amp;quot;BUSY GPIO configure failed (%d)&amp;quot;, err);
        return err;
    }
    printk(&amp;quot;[EPD] BUSY GPIO configured INPUT+PULL-DOWN  (current=%d)\n&amp;quot;,
           gpio_pin_get_dt(&amp;amp;busy_gpio));

    LOG_INF(&amp;quot;GPIOs configured — starting SSD1683 init&amp;quot;);

    err = epd_init_hw();
    if (err) {
        printk(&amp;quot;[EPD] ERROR: hardware init failed: %d\n&amp;quot;, err);
        LOG_ERR(&amp;quot;EPD hardware init failed (%d)&amp;quot;, err);
        return err;
    }

    printk(&amp;quot;[EPD] epaper_init() SUCCESS — %ux%u display ready\n&amp;quot;,
           EPD_WIDTH, EPD_HEIGHT);
    LOG_INF(&amp;quot;Waveshare 4.2\&amp;quot; e-Paper ready (%ux%u)&amp;quot;, EPD_WIDTH, EPD_HEIGHT);
    return 0;
}

void epaper_clear(uint8_t color)
{
    memset(framebuf, color, sizeof(framebuf));
}

void epaper_set_pixel(uint16_t x, uint16_t y, bool black)
{
    if (x &amp;gt;= EPD_WIDTH || y &amp;gt;= EPD_HEIGHT) {
        return;
    }

    uint32_t idx  = (x / 8U) + (uint32_t)y * (EPD_WIDTH / 8U);
    uint8_t  mask = 0x80U &amp;gt;&amp;gt; (x % 8U);

    if (black) {
        framebuf[idx] &amp;amp;= ~mask; /* clear bit → black pixel */
    } else {
        framebuf[idx] |=  mask; /* set bit   → white pixel */
    }
}

void epaper_draw_char(uint16_t x, uint16_t y, char c,
                      uint8_t scale, bool black)
{
    if ((uint8_t)c &amp;lt; 0x20U || (uint8_t)c &amp;gt; 0x7EU) {
        c = &amp;#39;?&amp;#39;;
    }

    const uint8_t *glyph = font5x7[(uint8_t)c - 0x20U];

    for (uint8_t col = 0U; col &amp;lt; FONT5X7_COLS; col++) {
        uint8_t col_data = glyph[col];

        for (uint8_t row = 0U; row &amp;lt; FONT5X7_ROWS; row++) {
            if (col_data &amp;amp; (1U &amp;lt;&amp;lt; row)) {
                for (uint8_t sx = 0U; sx &amp;lt; scale; sx++) {
                    for (uint8_t sy = 0U; sy &amp;lt; scale; sy++) {
                        epaper_set_pixel(
                            x + (uint16_t)(col * scale + sx),
                            y + (uint16_t)(row * scale + sy),
                            black);
                    }
                }
            }
        }
    }
}

void epaper_draw_string(uint16_t x, uint16_t y, const char *str,
                        uint8_t scale, bool black)
{
    uint16_t cx      = x;
    uint16_t advance = (uint16_t)(FONT5X7_ADVANCE * scale);

    while (*str) {
        if (cx + (uint16_t)(FONT5X7_COLS * scale) &amp;gt; EPD_WIDTH) {
            break;
        }
        epaper_draw_char(cx, y, *str, scale, black);
        cx += advance;
        str++;
    }
}

void epaper_display(void)
{
    printk(&amp;quot;[EPD] epaper_display(): resetting cursor to (0,0)\n&amp;quot;);
    LOG_INF(&amp;quot;epaper_display: writing framebuffer&amp;quot;);

    /* Reset write cursor to (0, 0) before streaming the framebuffer */
    epd_set_window_and_cursor();

    /*
     * Write the same framebuffer to BOTH RAM banks — required by V2.
     *   0x24 = BW RAM  (new / current frame)
     *   0x26 = RED RAM (previous frame — used by waveform engine for
     *                   differential e-ink drive; must not be garbage)
     * Waveshare V2 Python display() sends the image to both banks.
     */
    printk(&amp;quot;[EPD] Writing BW RAM  (0x24): %u bytes...\n&amp;quot;,
           (unsigned)sizeof(framebuf));
    epd_send_cmd(0x24);
    epd_send_buf(framebuf, sizeof(framebuf));

    printk(&amp;quot;[EPD] Writing RED RAM (0x26): %u bytes (same data)...\n&amp;quot;,
           (unsigned)sizeof(framebuf));
    epd_send_cmd(0x26);
    epd_send_buf(framebuf, sizeof(framebuf));
    printk(&amp;quot;[EPD] Framebuffer write complete (both RAM banks)\n&amp;quot;);

    /* Full update — LUT from OTP (temperature-compensated) */
    printk(&amp;quot;[EPD] Sending DISPLAY_UPDATE_CONTROL_2 cmd 0x22, data=0xF7\n&amp;quot;);
    epd_send_cmd(0x22);
    epd_send_byte(0xF7);

    printk(&amp;quot;[EPD] Sending MASTER_ACTIVATION cmd 0x20  &amp;quot;
           &amp;quot;&amp;lt;-- e-ink waveform starts now\n&amp;quot;);
    LOG_INF(&amp;quot;epaper_display: triggering full refresh (may take ~2 s)&amp;quot;);
    epd_send_cmd(0x20);

    /*
     * Monitor BUSY for up to 15 seconds after MASTER_ACTIVATION.
     *
     * A working SSD1683 drives BUSY HIGH within 1 ms of receiving 0x20 and
     * holds it HIGH for ~2-4 seconds during the full refresh waveform.
     * Polling every 50 ms is more than fine enough to catch it.
     *
     * If BUSY never goes HIGH in 15 seconds:
     *   (a) SPI data is not reaching the display controller.
     *   (b) The display is damaged.
     * The software SPI diagnostic earlier in epd_init_hw() distinguishes these.
     */
    printk(&amp;quot;[EPD] Monitoring BUSY for up to 15 s after MASTER_ACTIVATION...\n&amp;quot;);
    printk(&amp;quot;[EPD]   (SSD1683 should drive BUSY HIGH within 1 ms of 0x20)\n&amp;quot;);

    bool refresh_seen = false;
    int  last_print_s = 0;

    for (int t_ms = 0; t_ms &amp;lt;= 15000; t_ms += 50) {
        int b = gpio_pin_get_dt(&amp;amp;busy_gpio);

        /* Print a status line every 1000 ms */
        int s = t_ms / 1000;
        if (s &amp;gt; last_print_s || t_ms == 0) {
            last_print_s = s;
            printk(&amp;quot;[EPD]   +%2d s : BUSY = %d\n&amp;quot;, s, b);
        }

        if (b == 1) {
            refresh_seen = true;
            printk(&amp;quot;[EPD] BUSY HIGH at +%d ms — display is refreshing!\n&amp;quot;, t_ms);
            printk(&amp;quot;[EPD] Waiting for BUSY to go LOW (refresh complete)...\n&amp;quot;);
            epd_wait_busy(&amp;quot;display_refresh&amp;quot;);
            break;
        }

        k_msleep(50);
    }

    if (!refresh_seen) {
        printk(&amp;quot;[EPD] *** BUSY never went HIGH in 15 s ***\n&amp;quot;);
        printk(&amp;quot;[EPD]   SPI data (0x20 MASTER_ACTIVATION) did not reach the display.\n&amp;quot;);
        printk(&amp;quot;[EPD]   Check wiring: SCK P1.14, DIN P1.08, CS P1.09, DC P1.11.\n&amp;quot;);
    }

    printk(&amp;quot;[EPD] epaper_display(): refresh COMPLETE — image should be visible\n&amp;quot;);
    LOG_INF(&amp;quot;epaper_display: refresh complete&amp;quot;);
}

void epaper_sleep(void)
{
    printk(&amp;quot;[EPD] epaper_sleep(): sending DEEP_SLEEP cmd 0x10, data=0x01\n&amp;quot;);
    epd_send_cmd(0x10);
    epd_send_byte(0x01); /* Deep sleep mode 1 — RAM contents retained */
    printk(&amp;quot;[EPD] ePaper in deep sleep (RST required to wake)\n&amp;quot;);
    LOG_INF(&amp;quot;ePaper: deep sleep entered&amp;quot;);
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;THhs the uart output while using SW SPI (bit bangging approach)&lt;br /&gt;&lt;br /&gt;[MAIN] ----------------------------------------&lt;br /&gt;[MAIN] Starting Waveshare 4.2&amp;quot; ePaper init&lt;br /&gt;[MAIN] ----------------------------------------&lt;br /&gt;[EPD] *** epaper_init() called ***&lt;br /&gt;[EPD] Display: Waveshare 4.2&amp;quot; b/w, SSD1683, 400x300 px&lt;br /&gt;[EPD] Transport: software SPI (bit-bang)&lt;br /&gt;[EPD] RST GPIO (gpio@d8200 pin 12) ready&lt;br /&gt;[EPD] BUSY GPIO (gpio@d8200 pin 6) ready&lt;br /&gt;[EPD] RST GPIO configured OUTPUT HIGH&lt;br /&gt;[EPD] BUSY GPIO configured INPUT+PULL-DOWN (current=0)&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] SSD1683 init (V2 sequence)&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] Step 0: power-on delay 200 ms&lt;br /&gt;[EPD] Step 1: hardware reset&lt;br /&gt;[EPD] HW reset: RST HIGH (100 ms)&lt;br /&gt;[EPD] HW reset: RST LOW pulse (2 ms)&lt;br /&gt;[EPD] HW reset: RST released, 100 ms settle done&lt;br /&gt;[EPD] HW reset: monitoring BUSY for 300 ms after RST release...&lt;br /&gt;[EPD] HW reset: BUSY never went HIGH in 300 ms.&lt;br /&gt;[EPD] --&amp;gt; RST wire (P1.12 to display RST) may not be connected.&lt;br /&gt;[EPD] --&amp;gt; The SPI init sequence will still proceed.&lt;br /&gt;[EPD] --&amp;gt; If display stays blank: verify P1.12 &amp;lt;-&amp;gt; RST wire.&lt;br /&gt;[EPD] HW reset: done&lt;br /&gt;[EPD] Step 1b: wait BUSY LOW after HW reset&lt;br /&gt;[EPD] wait_busy [post_hw_reset]: BUSY pin = 0 at entry (1=busy HIGH, 0=idle LOW)&lt;br /&gt;[EPD] BUSY went LOW after 7 ms [post_hw_reset] &amp;lt;-- OK&lt;br /&gt;[EPD] Step 2: SW_RESET 0x12&lt;br /&gt;[EPD] Step 2b: wait BUSY LOW after SW_RESET&lt;br /&gt;[EPD] wait_busy [SW_RESET]: BUSY pin = 0 at entry (1=busy HIGH, 0=idle LOW)&lt;br /&gt;[EPD] BUSY went LOW after 6 ms [SW_RESET] &amp;lt;-- OK&lt;br /&gt;[EPD] Step 3: DISPLAY_UPDATE_CTRL 0x21, data=0x40,0x00&lt;br /&gt;[EPD] Step 4: BORDER_WAVEFORM 0x3C, data=0x05&lt;br /&gt;[EPD] Step 5: DATA_ENTRY_MODE 0x11, data=0x03&lt;br /&gt;[EPD] Step 6: RAM X window 0x44: 0x00..0x31&lt;br /&gt;[EPD] Step 7: RAM Y window 0x45: 0x0000..0x012B&lt;br /&gt;[EPD] Step 8: RAM cursor 0x4E=0x00, 0x4F=0x0000&lt;br /&gt;[EPD] Step 10: final wait BUSY LOW&lt;br /&gt;[EPD] wait_busy [init_final]: BUSY pin = 0 at entry (1=busy HIGH, 0=idle LOW)&lt;br /&gt;[EPD] BUSY went LOW after 7 ms [init_final] &amp;lt;-- OK&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] SSD1683 init COMPLETE &amp;mdash; display ready&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] epaper_init() SUCCESS &amp;mdash; 400x300 display ready&lt;br /&gt;[MAIN] epaper_init OK &amp;mdash; clearing framebuffer (white)&lt;br /&gt;[MAIN] Drawing &amp;#39;Hello, Nugo!&amp;#39; at (92,120) scale=3&lt;br /&gt;[MAIN] Drawing &amp;#39;nRF54L15DK&amp;#39; at (140,165) scale=2&lt;br /&gt;[MAIN] Calling epaper_display() &amp;mdash; full refresh (~2 s)&lt;br /&gt;[EPD] epaper_display(): resetting cursor to (0,0)&lt;br /&gt;[EPD] Writing BW RAM (0x24): 15000 bytes...&lt;br /&gt;[EPD] Writing RED RAM (0x26): 15000 bytes (same data)...&lt;br /&gt;[EPD] Framebuffer write complete (both RAM banks)&lt;br /&gt;[EPD] Sending DISPLAY_UPDATE_CONTROL_2 cmd 0x22, data=0xF7&lt;br /&gt;[EPD] Sending MASTER_ACTIVATION cmd 0x20 &amp;lt;-- e-ink waveform starts now&lt;br /&gt;[EPD] Monitoring BUSY for up to 15 s after MASTER_ACTIVATION...&lt;br /&gt;[EPD] (SSD1683 should drive BUSY HIGH within 1 ms of 0x20)&lt;br /&gt;[EPD] + 0 s : BUSY = 1&lt;br /&gt;[EPD] BUSY HIGH at +0 ms &amp;mdash; display is refreshing!&lt;br /&gt;[EPD] Waiting for BUSY to go LOW (refresh complete)...&lt;br /&gt;[EPD] wait_busy [display_refresh]: BUSY pin = 1 at entry (1=busy HIGH, 0=idle LOW)&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 501 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 1001 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 1510 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 2010 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 2510 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 3020 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 3529 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 4029 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 4529 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 5039 ms, BUSY=1&lt;br /&gt;[EPD] ... still waiting [display_refresh], elapsed 5548 ms, BUSY=1&lt;br /&gt;[EPD] *** BUSY TIMEOUT *** [display_refresh] after 6000 ms&lt;br /&gt; --&amp;gt; Is display powered? Is P1.06 connected to BUSY?&lt;br /&gt; --&amp;gt; Continuing anyway &amp;mdash; subsequent commands may fail.&lt;br /&gt;[EPD] epaper_display(): refresh COMPLETE &amp;mdash; image should be visible&lt;br /&gt;[MAIN] epaper_display() returned &amp;mdash; putting display to sleep&lt;br /&gt;[EPD] epaper_sleep(): sending DEEP_SLEEP cmd 0x10, data=0x01&lt;br /&gt;[EPD] ePaper in deep sleep (RST required to wake)&lt;br /&gt;[MAIN] ePaper sequence complete&lt;/p&gt;
&lt;p&gt;THis is my uart output for HW use case&lt;br /&gt;&lt;br /&gt;MAIN] ----------------------------------------&lt;br /&gt;[MAIN] Starting Waveshare 4.2&amp;quot; ePaper init&lt;br /&gt;[MAIN] ----------------------------------------&lt;br /&gt;[EPD] *** epaper_init() called ***&lt;br /&gt;[EPD] Display: Waveshare 4.2&amp;quot; b/w, SSD1683, 400x300 px&lt;br /&gt;[EPD] Transport: hardware SPIM22 + DMA (nrfx)&lt;br /&gt;[EPD-HW] SPIM22 ready via Zephyr SPI API (SCK=P1.14, DIN=P1.08, CS=P1.09 auto, DC=P1.11)&lt;br /&gt;[EPD] RST GPIO (gpio@d8200 pin 12) ready&lt;br /&gt;[EPD] BUSY GPIO (gpio@d8200 pin 6) ready&lt;br /&gt;[EPD] RST GPIO configured OUTPUT HIGH&lt;br /&gt;[EPD] BUSY GPIO configured INPUT+PULL-DOWN (current=0)&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] SSD1683 init (V2 sequence)&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] Step 0: power-on delay 200 ms&lt;br /&gt;[EPD] Step 1: hardware reset&lt;br /&gt;[EPD] HW reset: RST HIGH (100 ms)&lt;br /&gt;[EPD] HW reset: RST LOW pulse (2 ms)&lt;br /&gt;[EPD] HW reset: RST released, 100 ms settle done&lt;br /&gt;[EPD] HW reset: monitoring BUSY for 300 ms after RST release...&lt;br /&gt;[EPD] HW reset: BUSY never went HIGH in 300 ms.&lt;br /&gt;[EPD] --&amp;gt; RST wire (P1.12 to display RST) may not be connected.&lt;br /&gt;[EPD] --&amp;gt; The SPI init sequence will still proceed.&lt;br /&gt;[EPD] --&amp;gt; If display stays blank: verify P1.12 &amp;lt;-&amp;gt; RST wire.&lt;br /&gt;[EPD] HW reset: done&lt;br /&gt;[EPD] Step 1b: wait BUSY LOW after HW reset&lt;br /&gt;[EPD] wait_busy [post_hw_reset]: BUSY pin = 0 at entry (1=busy HIGH, 0=idle LOW)&lt;br /&gt;[EPD] BUSY went LOW after 7 ms [post_hw_reset] &amp;lt;-- OK&lt;br /&gt;[EPD] Step 2: SW_RESET 0x12&lt;br /&gt;[EPD] Step 2b: wait BUSY LOW after SW_RESET&lt;br /&gt;[EPD] wait_busy [SW_RESET]: BUSY pin = 0 at entry (1=busy HIGH, 0=idle LOW)&lt;br /&gt;[EPD] BUSY went LOW after 6 ms [SW_RESET] &amp;lt;-- OK&lt;br /&gt;[EPD] Step 3: DISPLAY_UPDATE_CTRL 0x21, data=0x40,0x00&lt;br /&gt;[EPD] Step 4: BORDER_WAVEFORM 0x3C, data=0x05&lt;br /&gt;[EPD] Step 5: DATA_ENTRY_MODE 0x11, data=0x03&lt;br /&gt;[EPD] Step 6: RAM X window 0x44: 0x00..0x31&lt;br /&gt;[EPD] Step 7: RAM Y window 0x45: 0x0000..0x012B&lt;br /&gt;[EPD] Step 8: RAM cursor 0x4E=0x00, 0x4F=0x0000&lt;br /&gt;[EPD] Step 10: final wait BUSY LOW&lt;br /&gt;[EPD] wait_busy [init_final]: BUSY pin = 0 at entry (1=busy HIGH, 0=idle LOW)&lt;br /&gt;[EPD] BUSY went LOW after 7 ms [init_final] &amp;lt;-- OK&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] SSD1683 init COMPLETE &amp;mdash; display ready&lt;br /&gt;[EPD] ============================================&lt;br /&gt;[EPD] epaper_init() SUCCESS &amp;mdash; 400x300 display ready&lt;br /&gt;[MAIN] epaper_init OK &amp;mdash; clearing framebuffer (white)&lt;br /&gt;[MAIN] Drawing &amp;#39;Hello, Nugo!&amp;#39; at (92,120) scale=3&lt;br /&gt;[MAIN] Drawing &amp;#39;nRF54L15DK&amp;#39; at (140,165) scale=2&lt;br /&gt;[MAIN] Calling epaper_display() &amp;mdash; full refresh (~2 s)&lt;br /&gt;[EPD] epaper_display(): resetting cursor to (0,0)&lt;br /&gt;[EPD] Writing BW RAM (0x24): 15000 bytes...&lt;br /&gt;[EPD] Writing RED RAM (0x26): 15000 bytes (same data)...&lt;br /&gt;[EPD] Framebuffer write complete (both RAM banks)&lt;br /&gt;[EPD] Sending DISPLAY_UPDATE_CONTROL_2 cmd 0x22, data=0xF7&lt;br /&gt;[EPD] Sending MASTER_ACTIVATION cmd 0x20 &amp;lt;-- e-ink waveform starts now&lt;br /&gt;[EPD] Monitoring BUSY for up to 15 s after MASTER_ACTIVATION...&lt;br /&gt;[EPD] (SSD1683 should drive BUSY HIGH within 1 ms of 0x20)&lt;br /&gt;[EPD] + 0 s : BUSY = 0&lt;br /&gt;[EPD] + 1 s : BUSY = 0&lt;br /&gt;[EPD] + 2 s : BUSY = 0&lt;br /&gt;[EPD] + 3 s : BUSY = 0&lt;br /&gt;[EPD] + 4 s : BUSY = 0&lt;br /&gt;[EPD] + 5 s : BUSY = 0&lt;br /&gt;[EPD] + 6 s : BUSY = 0&lt;br /&gt;[EPD] + 7 s : BUSY = 0&lt;br /&gt;[EPD] + 8 s : BUSY = 0&lt;br /&gt;[EPD] + 9 s : BUSY = 0&lt;br /&gt;[EPD] +10 s : BUSY = 0&lt;br /&gt;[EPD] +11 s : BUSY = 0&lt;br /&gt;[EPD] +12 s : BUSY = 0&lt;br /&gt;[EPD] +13 s : BUSY = 0&lt;br /&gt;[EPD] +14 s : BUSY = 0&lt;br /&gt;[EPD] +15 s : BUSY = 0&lt;br /&gt;[EPD] *** BUSY never went HIGH in 15 s ***&lt;br /&gt;[EPD] SPI data (0x20 MASTER_ACTIVATION) did not reach the display.&lt;br /&gt;[EPD] Check wiring: SCK P1.14, DIN P1.08, CS P1.09, DC P1.11.&lt;br /&gt;[EPD] epaper_display(): refresh COMPLETE &amp;mdash; image should be visible&lt;br /&gt;[MAIN] epaper_display() returned &amp;mdash; putting display to sleep&lt;br /&gt;[EPD] epaper_sleep(): sending DEEP_SLEEP cmd 0x10, data=0x01&lt;br /&gt;[EPD] ePaper in deep sleep (RST required to wake)&lt;br /&gt;[MAIN] ePaper sequence complete&lt;br /&gt;[MAIN] ----------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF54L15DK (NCS v3.1.0): SPIM22 signals not routing to physical pins (GPIOMCU issue?)</title><link>https://devzone.nordicsemi.com/thread/564498?ContentTypeID=1</link><pubDate>Tue, 07 Apr 2026 11:01:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ad5c5249-d9bd-43c1-b4b8-f5f7278ac735</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t see anything wrong with your pin assignments, but I see you are using the&amp;nbsp;NRF_FUN_* prefix in your pinctrl nodes. This prefix is already applied by the&amp;nbsp;NRF_PSEL() macro.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So instead of this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;			psels = &amp;lt;NRF_PSEL(NRF_FUN_SPIM_SCK, 1, 14)&amp;gt;,
			        &amp;lt;NRF_PSEL(NRF_FUN_SPIM_MOSI, 1, 8)&amp;gt;,
			        &amp;lt;NRF_PSEL(NRF_FUN_SPIM_MISO, 1, 31)&amp;gt;; /* Disconnected */&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;it should be written like this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;			psels = &amp;lt;NRF_PSEL(SPIM_SCK, 1, 14)&amp;gt;,
			        &amp;lt;NRF_PSEL(SPIM_MOSI, 1, 8)&amp;gt;,
			        &amp;lt;NRF_PSEL(SPIM_MISO, 1, 31)&amp;gt;; /* Disconnected */&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Please correct this and check again to see if it works.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Vidar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>