Hey all,
I am trying to run the "nrfx_spim" example on my nRF52840 USB Dongle (Makerdiary nRF52840 USB dongle), however it is not working. It looks like the code is never reaching the interrupt handler "spim_event_handler()". The example code is using SPI3 to run this example, and I confirmed that NRFX_SPIM3 is enabled in the sdk_config.h.
This is a dongle, so I don't have a way of seeing any of the NRF_LOG entries unfortunately.
nrfx_spim_config_t spi_config = NRFX_SPIM_DEFAULT_CONFIG; spi_config.frequency = NRF_SPIM_FREQ_1M; spi_config.ss_pin = NRFX_SPIM_SS_PIN; spi_config.miso_pin = NRFX_SPIM_MISO_PIN; spi_config.mosi_pin = NRFX_SPIM_MOSI_PIN; spi_config.sck_pin = NRFX_SPIM_SCK_PIN; spi_config.dcx_pin = NRFX_SPIM_DCX_PIN; spi_config.use_hw_ss = true; spi_config.ss_active_high = true; spi_config.mode = NRF_SPIM_MODE_1; APP_ERROR_CHECK(nrfx_spim_init(&spi, &spi_config, spim_event_handler, NULL));
Here is the interrupt handler:
void spim_event_handler(nrfx_spim_evt_t const * p_event,
void * p_context)
{
bsp_board_led_invert(BSP_BOARD_LED_1);
spi_xfer_done = true;
NRF_LOG_INFO("Transfer completed.");
if (m_rx_buf[0] != 0)
{
NRF_LOG_INFO(" Received:");
NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
}
}
Here is the main loop that is supposed to send out a packet every 200 ms:
while (1)
{
// Reset rx buffer and transfer done flag
memset(m_rx_buf, 0, m_length);
spi_xfer_done = false;
APP_ERROR_CHECK(nrfx_spim_xfer(&spi, &xfer_desc, 0));
while (!spi_xfer_done)
{
__WFE();
}
NRF_LOG_FLUSH();
bsp_board_led_invert(BSP_BOARD_LED_1);
nrf_delay_ms(200);
}
I checked the SPI lines on my oscilloscope, and I see that the SS pin goes high (I have it set to active high polarity), the SPI clock runs, and I can see data being pushed out on the MOSI pin. However, after the transaction ends, the SS pin does not go back low, and the interrupt handler does not trigger. I reckon the issue is with the end of the transaction, but can't figure out what's wrong. I hope someone can help, thanks!