Howdy,
I am using NRF5 SDK v15.0.0 on an nRF52810 custom PCB and am having a problem where the specified event handler is not being called upon completion of an SPIM transfer. Using a scope I can see that the transfer is occuring, but then the code gets caught at line 319 of arm_startup_nrf52810.s. I may be reading this incorrectly, but it looks like a default IRQ handler...
The relevant portion of my sdk_config.h file (all legacy driver definitions were removed):
// <e> NRFX_SPIM_ENABLED - nrfx_spim - SPIM peripheral driver //========================================================== #ifndef NRFX_SPIM_ENABLED #define NRFX_SPIM_ENABLED 1 #endif // <q> NRFX_SPIM0_ENABLED - Enable SPIM0 instance #ifndef NRFX_SPIM0_ENABLED #define NRFX_SPIM0_ENABLED 1 #endif
Relevant SPI initialization code and SPI EVT handler code:
#define SPI_INSTANCE 0
volatile uint8_t spiActive = SPI_MSG_IDLE;
volatile spi_pending_t spiPending;
volatile uint8_t spiTX[SPI_BUFFER_SIZE];
volatile uint8_t spiRX[SPI_BUFFER_SIZE];
static const nrfx_spim_t spiMaster = NRFX_SPIM_INSTANCE(SPI_INSTANCE);
static bool volatile spiXferComplete = false;
void spi_event_handler(nrfx_spim_evt_t const *event, void *context);
uint8_t _send_spi_message(uint8_t message);
void spi_init(void)
{
uint32_t error;
nrfx_spim_config_t config = NRFX_SPIM_DEFAULT_CONFIG;
config.sck_pin = SPI0_CONFIG_SCK_PIN;
config.miso_pin = SPI0_CONFIG_MISO_PIN;
config.mosi_pin = SPI0_CONFIG_MOSI_PIN;
error = nrfx_spim_init(&spiMaster, &config, spi_event_handler, NULL);
APP_ERROR_CHECK(error);
spiPending.all = 0x0000;
}
void spi_event_handler(nrfx_spim_evt_t const *event, void *context)
{
if(event->type == NRFX_SPIM_EVENT_DONE)
{
spiXferComplete = true;
TASK_SET_SPI_COMPLETE();
}
}
Location where it hangs (hangs at the "B ." at the end):
Default_Handler PROC
EXPORT POWER_CLOCK_IRQHandler [WEAK]
EXPORT RADIO_IRQHandler [WEAK]
EXPORT UARTE0_IRQHandler [WEAK]
EXPORT TWIM0_TWIS0_IRQHandler [WEAK]
EXPORT SPIM0_SPIS0_IRQHandler [WEAK]
EXPORT GPIOTE_IRQHandler [WEAK]
EXPORT SAADC_IRQHandler [WEAK]
EXPORT TIMER0_IRQHandler [WEAK]
EXPORT TIMER1_IRQHandler [WEAK]
EXPORT TIMER2_IRQHandler [WEAK]
EXPORT RTC0_IRQHandler [WEAK]
EXPORT TEMP_IRQHandler [WEAK]
EXPORT RNG_IRQHandler [WEAK]
EXPORT ECB_IRQHandler [WEAK]
EXPORT CCM_AAR_IRQHandler [WEAK]
EXPORT WDT_IRQHandler [WEAK]
EXPORT RTC1_IRQHandler [WEAK]
EXPORT QDEC_IRQHandler [WEAK]
EXPORT COMP_IRQHandler [WEAK]
EXPORT SWI0_EGU0_IRQHandler [WEAK]
EXPORT SWI1_EGU1_IRQHandler [WEAK]
EXPORT SWI2_IRQHandler [WEAK]
EXPORT SWI3_IRQHandler [WEAK]
EXPORT SWI4_IRQHandler [WEAK]
EXPORT SWI5_IRQHandler [WEAK]
EXPORT PWM0_IRQHandler [WEAK]
EXPORT PDM_IRQHandler [WEAK]
POWER_CLOCK_IRQHandler
RADIO_IRQHandler
UARTE0_IRQHandler
TWIM0_TWIS0_IRQHandler
SPIM0_SPIS0_IRQHandler
GPIOTE_IRQHandler
SAADC_IRQHandler
TIMER0_IRQHandler
TIMER1_IRQHandler
TIMER2_IRQHandler
RTC0_IRQHandler
TEMP_IRQHandler
RNG_IRQHandler
ECB_IRQHandler
CCM_AAR_IRQHandler
WDT_IRQHandler
RTC1_IRQHandler
QDEC_IRQHandler
COMP_IRQHandler
SWI0_EGU0_IRQHandler
SWI1_EGU1_IRQHandler
SWI2_IRQHandler
SWI3_IRQHandler
SWI4_IRQHandler
SWI5_IRQHandler
PWM0_IRQHandler
PDM_IRQHandler
B .
Everything compiles fine (no warnings), it just doesn't call the spi_event_handler() with the DONE event... Any help would be appreciated.
Thanks,
-F