Hi, everyone,
I'm trying to assign an SPI End Event to a DPPI channel on nRF5340dk to trigger a counter automatically. However, the value of the counter never increases.
If I assign the count task of the counter to a GPIOTE in event, the counter value increases successfully. So I think the assignment of the SPI End Event must have something wrong.
Here's part of my code:
nrfx_spim_t spi = NRFX_SPIM_INSTANCE(4);
nrfx_timer_t spi_counter = NRFX_TIMER_INSTANCE(2);
uint8_t dppi_channel_drdy;
uint8_t dppi_channel_spi_end;
void gpiote_in_init(void)
{
if ( nrfx_gpiote_is_init() == false )
{
IRQ_CONNECT(DT_IRQN(DT_NODELABEL(gpiote)),
DT_IRQ(DT_NODELABEL(gpiote), priority),
nrfx_isr, nrfx_gpiote_irq_handler, 0);
nrfx_err_t err = nrfx_gpiote_init(0);
if (err != NRFX_SUCCESS) {
printk("nrfx_gpiote_init error: %08x \n", err);
return m_rx_buf;
}
}
// err_code
nrfx_err_t err;
// gpiote in: DRDY_PIN - hitolo
nrfx_gpiote_in_config_t config_in_hitolo = NRFX_GPIOTE_CONFIG_IN_SENSE_HITOLO(true);
err = nrfx_gpiote_in_init(GPIOTE_PIN, &config_in_hitolo, NULL);
if (err != NRFX_SUCCESS)
printk("DRDY_init error: %08x \n", err);
}
void spi_init(void)
{
// err_code
nrfx_err_t err;
//SPI
/*
IRQ_DIRECT_CONNECT(SPIM4_IRQn, 0,
nrfx_spim_4_irq_handler, 0);
irq_enable(SPIM4_IRQn);
*/
nrfx_spim_config_t spi_config = NRFX_SPIM_DEFAULT_CONFIG(SCK_PIN, MOSI_PIN, MISO_PIN, NRFX_SPIM_PIN_NOT_USED);
spi_config.mode = NRF_SPIM_MODE_1;
spi_config.frequency = NRF_SPIM_FREQ_2M;
err = nrfx_spim_init(&spi, &spi_config, NULL, NULL);
NRF_SPIM4->PSEL.CSN = CS_PIN;
if (err != NRFX_SUCCESS)
printk("spi_driver_init error: %08x \n", err);
}
void spi_counter_init(void)
{
IRQ_CONNECT(DT_IRQN(DT_NODELABEL(timer2)),
DT_IRQ(DT_NODELABEL(timer2), priority),
nrfx_isr, nrfx_timer_2_irq_handler, 0);
nrfx_timer_config_t counter_cfg = NRFX_TIMER_DEFAULT_CONFIG;
counter_cfg.mode = NRF_TIMER_MODE_COUNTER;
counter_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32;
nrfx_timer_uninit(&spi_counter);
nrfx_err_t err = nrfx_timer_init(&spi_counter, &counter_cfg, spi_counter_event_handler);
if (err != NRFX_SUCCESS)
printk("spi_counter_init error: %08x \n", err);
}
void dppi_init(void)
{
//dppi channel 1: drdy->spi start
nrfx_err_t err = nrfx_dppi_channel_alloc(&dppi_channel_drdy);
if (err != NRFX_SUCCESS)
printk("dppi1_init error: %08x \n", err);
nrf_gpiote_publish_set(NRF_GPIOTE, nrfx_gpiote_in_event_get(GPIOTE_PIN), dppi_channel_drdy);
nrf_spim_subscribe_set(NRF_SPIM4, nrfx_spim_start_task_get(&spi), dppi_channel_drdy);
//nrf_timer_subscribe_set(NRF_TIMER2, NRF_TIMER_TASK_COUNT, dppi_channel_drdy);
err = nrfx_dppi_channel_enable(dppi_channel_drdy);
if (err != NRFX_SUCCESS)
printk("dppi1_enable error: %08x \n", err);
//dppi channel 2: spi_end->counter + 1
err = nrfx_dppi_channel_alloc(&dppi_channel_spi_end);
if (err != NRFX_SUCCESS)
printk("dppi2_init error: %08x \n", err);
nrf_spim_publish_set(NRF_SPIM4, nrfx_spim_end_event_get(&spi), dppi_channel_spi_end);
nrf_timer_subscribe_set(NRF_TIMER2, NRF_TIMER_TASK_COUNT, dppi_channel_spi_end);
err = nrfx_dppi_channel_enable(dppi_channel_spi_end);
if (err != NRFX_SUCCESS)
printk("dppi2_enable error: %08x \n", err);
}
void main(void){
gpiote_in_init();
spi_init();
spi_counter_init();
dppi_init();
//......
}
Also, the GPIOTE in event can trigger the spi start task successfully.
So I wonder if there are additionly steps to assign an SPI End Event to a DPPI channel.