Weak Pin Drive Strength on nRF5340 DK Leading to SPI Communication Failure with ICM-42688-P

I am using the Nordic nRF5340 DK to communicate with the ICM-42688-P sensor via SPI. However, the sensor does not respond to the MCU's commands. After observing the SPI clock (SCLK) waveform with an oscilloscope. I noticed that the rise and fall times of the clock signal are excessively long, which violates the sensor’s timing requirements.

I configured the SCLK GPIO pin’s drive strength to H0H1 but the issue persists. Following is my code using nrfx driver:

/* configurations in prj.conf
CONFIG_GPIO=y
CONFIG_LOG=y
CONFIG_SPI=y
CONFIG_NRFX_SPIM4=y
*/

#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zephyr/device.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/sys/printk.h>

#include <nrf.h>
#include <nrfx_spim.h>
#include <nrfx_gpiote.h>
#include <hal/nrf_gpio.h>

#include <stdio.h>
#include <string.h>

LOG_MODULE_REGISTER(nrf_imu, 4);

nrfx_spim_t spim = NRFX_SPIM_INSTANCE(4);

#define SPI_SCK_PIN   NRF_GPIO_PIN_MAP(1, 15)
#define SPI_MOSI_PIN  NRF_GPIO_PIN_MAP(1, 13)
#define SPI_MISO_PIN  NRF_GPIO_PIN_MAP(1, 14)
#define SPI_CSN_PIN   NRF_GPIO_PIN_MAP(1, 12)

#define NRFX_CUSTOM_ERROR_CODES 0 //used in nrfx_errors.h

nrfx_spim_config_t spim_config = NRFX_SPIM_DEFAULT_CONFIG(SPI_SCK_PIN, SPI_MOSI_PIN, SPI_MISO_PIN, SPI_CSN_PIN);

uint8_t ret = 0x00;

static volatile bool
	spim_xfer_done;

void spim_event_handler(nrfx_spim_evt_t const *p_event, void *p_context)
{
	spim_xfer_done = true;
}

int main(void)
{
    LOG_INF("Hello");
    spim_xfer_done = false;
    spim_config.orc = 0x47;
	nrfx_spim_init(&spim, &spim_config, spim_event_handler, NULL);

    nrf_gpio_cfg(
        SPI_SCK_PIN,
        NRF_GPIO_PIN_DIR_OUTPUT,
        NRF_GPIO_PIN_INPUT_DISCONNECT,
        NRF_GPIO_PIN_NOPULL,
        NRF_GPIO_PIN_H0H1,
        NRF_GPIO_PIN_NOSENSE
    );

    uint8_t tx_buffer[2] = {0x76, 0x00};
    uint8_t rx_buffer[2] = {0x00, 0x00};

    nrfx_spim_xfer_desc_t transfer = NRFX_SPIM_XFER_TX(tx_buffer, sizeof(tx_buffer));
    nrfx_spim_xfer(&spim, &transfer, 0);
    k_usleep(100);

    tx_buffer[0] = 0x11;
    tx_buffer[1] = 0x01; 

    nrfx_spim_xfer(&spim, &transfer, 0);
    k_msleep(2);

    tx_buffer[0] = 0xF5;
    tx_buffer[1] = 0x00; 

    nrfx_spim_xfer_desc_t tr = NRFX_SPIM_XFER_TRX(tx_buffer, sizeof(tx_buffer), rx_buffer, sizeof(rx_buffer));
    nrfx_spim_xfer(&spim, &tr, 0);

    LOG_INF("received %d %d", rx_buffer[0], rx_buffer[1]);
}

Then I Cross-tested with an nRF51822-based third-party development board, The SPI interface works, with successful communication.

Waveform under nrf51822 custom board

  1. Are there additional configurations (e.g., slew rate, pin control settings) to further optimize the GPIO output characteristics on the nRF5340?

  2. Could this be related to hardware design limitations (e.g., pull-up/down resistors, trace impedance) on the nRF5340 DK?

  3. Are there known workarounds or firmware adjustments to mitigate this issue?

Related