Hi,
I'm new to the nRF Connect SDK but I'm developing a project with the NRF54L15. Currently I'm testing the SPI peripherals and I'm having trouble with the SPIM peripheral glitching out. Here is a simple program that has the problem:
#include <nrfx_spim.h>
#include <zephyr/kernel.h>
#define SPIM_INST_IDX 21
static uint8_t m_tx_buffer[] = "Hello World!";
static uint8_t m_rx_buffer[sizeof(m_tx_buffer)];
static volatile bool spim_done = false;
static void spim_handler(nrfx_spim_evt_t const* p_event, void* p_context) {
if (p_event->type == NRFX_SPIM_EVENT_DONE) {
spim_done = true;
}
}
int main(void) {
nrfx_err_t status;
IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_SPIM_INST_GET(SPIM_INST_IDX)),
IRQ_PRIO_LOWEST, NRFX_SPIM_INST_HANDLER_GET(SPIM_INST_IDX), 0,
0);
nrfx_spim_t spim_inst = NRFX_SPIM_INSTANCE(SPIM_INST_IDX);
nrfx_spim_config_t spim_config = NRFX_SPIM_DEFAULT_CONFIG(
NRF_PIN_PORT_TO_PIN_NUMBER(6, 2), NRF_PIN_PORT_TO_PIN_NUMBER(8, 2),
NRF_PIN_PORT_TO_PIN_NUMBER(9, 2), NRF_PIN_PORT_TO_PIN_NUMBER(10, 2));
void* p_context = "Test context";
status = nrfx_spim_init(&spim_inst, &spim_config, spim_handler, p_context);
NRFX_ASSERT(status == NRFX_SUCCESS);
while (1) {
spim_done = false;
nrfx_spim_xfer_desc_t spim_xfer_desc = NRFX_SPIM_XFER_TRX(
m_tx_buffer, sizeof(m_tx_buffer), m_rx_buffer, sizeof(m_rx_buffer));
status = nrfx_spim_xfer(&spim_inst, &spim_xfer_desc, 0);
NRFX_ASSERT(status == NRFX_SUCCESS);
while (!spim_done) {
k_sleep(K_MSEC(1));
}
k_sleep(K_MSEC(1000));
}
return 0;
}
Here is an image of the output when it doesn't work. The first transmission after reset will be ok and the rest will be corrupted:

If I replace k_sleep(K_MSEC(1)); with k_yield(); it starts working. If I just have an empty while loop it also works. Here is an image of the signal when it works:

Completely removing the while loop and just calling the long sleep directly also makes it not work, so it seems that the problem is calling k_sleep() while the transfer is still happening. Is this something that is expected? If yes, where could I read up more about why this is the case, and learn some more about the inner workings?
Best regards,
Sašo Domadenik
