Hi I am currently runnign into a problem that my SPI driver does not fire a spi_event after a while.
The code is as follows:
static volatile bool spi_xfer_done;
void spi_event_handler(nrf_drv_spi_evt_t const *p_event,
void *p_context)
{
spi_xfer_done = true;
}
void spi_data_write(unsigned char data)
{
uint8_t rx;
spi_xfer_done = false;
nrf_gpio_pin_set(DISPLAY_DC); // DC = 1 for data packet
nrf_drv_spi_transfer(&spi, &data, 1, &rx, 0);
// hang in there
while (!spi_xfer_done)
{
__WFE();
}
return;
}
void spi_init()
{
// init SPI
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = DISPLAY_CS; // NRF_DRV_SPI_PIN_NOT_USED;
spi_config.mosi_pin = DISPLAY_SDI;
spi_config.miso_pin = NRF_DRV_SPI_PIN_NOT_USED;
spi_config.sck_pin = DISPLAY_SCLK;
spi_config.frequency = NRF_DRV_SPI_FREQ_1M;
spi_config.mode = NRF_DRV_SPI_MODE_0;
spi_config.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST;
nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL);
}
The thing is, it is working at first. My main function is as follows:
static void bsp_event_handler(bsp_event_t event)
{
switch (event)
{
case BSP_EVENT_KEY_3: // Button 4 pushed.
NRF_LOG_INFO("Button 4 pressed");
buttons |= 0x8;
display_clear(&dsp, COLOR_WHITE);
display_rect_fill(&dsp, 70, 70, 10, 10, COLOR_BLACK);
display_render(&dsp);
break;
default:
NRF_LOG_INFO("Button pressed");
break;
}
}
int main(void)
{
char loop;
// initialize logger
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
lfclk_config();
NRF_LOG_INFO("LFClock init done");
NRF_LOG_FLUSH();
APP_ERROR_CHECK(app_timer_init());
timer_interrupt_init();
nrf_pwr_mgmt_init();
APP_ERROR_CHECK(bsp_init(BSP_INIT_BUTTONS, bsp_event_handler));
// initalize the display
NRF_LOG_INFO("initialize display");
display_init(&dsp);
// draw splash screen
NRF_LOG_INFO("draw splash");
sw_splashscreen(&dsp);
display_render(&dsp);
APP_ERROR_CHECK(app_timer_start(m_timer, APP_TIMER_TICKS(5000), NULL));
while (true)
{
NRF_LOG_INFO("loop: %d", loop++);
NRF_LOG_FLUSH();
app_sched_execute();
nrf_pwr_mgmt_run();
}
}
It works at first, the diosplay is switched on and displays the slapsh image as intendet in main. But everything after that using the SPI transfer function casues to infinite loop in