Hello,
I use SDK15.2, SES4.12 and custom board with nRF52840.
I have a strip of ws2812b LED's connected to my device. I've made a simple RGB animation, each frame of which is transferred via SPIM. It works fine.
Now I need to add some USB HID functionality. I have simple custom descriptor with one output report. And it works fine too, if there is no SPIM transfer.
When I try to run both SPIM and USB, my code breaks somewhere with no call stack available. If I manually break the execution, it breaks on line 72 in ses_startup_nrf52840.s file, here is a snippet from there:
.thumb_func .weak HardFault_Handler HardFault_Handler: b .
Here is my main
int main(void) { nrf_gpio_cfg_output( LOGO ); Logo_Initialize(LOGO); init_hid(); RGB_Refresh(); while (true) { while (app_usbd_event_queue_process()) { /* Nothing to do */ } /* Sleep CPU only if there was no interrupt since last loop processing */ __WFE(); } }
SPIM part:
void spim_event_handler(nrfx_spim_evt_t const * p_event, void * p_context) { NRF_LOG_INFO("Transfer completed."); nrf_delay_ms(10); RGB_Refresh(); } void Logo_Initialize(uint8_t logo_pin) { uint8_t m_rx_buf[DATA_LENGTH]; nrfx_spim_xfer_desc_t xfer_desc = NRFX_SPIM_XFER_TRX(m_tx_buf, DATA_LENGTH, m_rx_buf, DATA_LENGTH); nrfx_spim_config_t spi_config = NRFX_SPIM_DEFAULT_CONFIG; spi_config.frequency = NRF_SPIM_FREQ_4M; spi_config.mosi_pin = logo_pin; spi_config.use_hw_ss = true; spi_config.ss_active_high = false; APP_ERROR_CHECK(nrfx_spim_init(&spi, &spi_config, spim_event_handler, NULL)); transfer_descriptor = &xfer_desc; NRF_LOG_INFO("NRFX SPIM example started."); bitmanio_init_array8(&bio_arr, m_tx_buf, CODED_BYTES_PER_RGB_BYTE); //animation array initialization here } void RGB_Refresh() { //get next frame here APP_ERROR_CHECK(nrfx_spim_xfer_dcx(&spi, transfer_descriptor, 0, 15)); }
Basically now I can have either RGB_Refresh() call or app_usbd_event_queue_process() call in my main function, but not both.