Hi, I am trying intialize the RTC in ncs using nrfx drivers and then connect it tick event to a saadc sampling event using a ppi channel.
I learnt that RTC0 and RTC1 are used internally and only option available is RTC 2 though this ticket.
const nrfx_rtc_t rtc = NRFX_RTC_INSTANCE(2);
static void rtc_handler(nrfx_rtc_int_type_t int_type)
{
switch (int_type)
{
case NRFX_RTC_INT_TICK:
printk("tick interrupt received\n");
break;
case NRFX_RTC_INT_COMPARE0:
{
printk("compare 0 event received\n");
err_code = nrfx_rtc_cc_set(&rtc, 0, 1, true);
if(err_code!=NRFX_SUCCESS)
{
printk(" compare channel initialization error %d",err_code);
}
}
default:
printk("rtc interrupt %d\n", int_type);
break;
}
}
void rtc_init()
{
uint32_t err_code;
//Initialize RTC instance
nrfx_rtc_config_t config = NRFX_RTC_DEFAULT_CONFIG;
config.prescaler = RTC_FREQ_TO_PRESCALER(8);
IRQ_CONNECT(DT_IRQN(DT_NODELABEL(rtc2)),
DT_IRQ(DT_NODELABEL(rtc2), priority),
rtc_handler, NULL, 0);
err_code = nrfx_rtc_init(&rtc, &config, rtc_handler);
if(err_code!=NRFX_SUCCESS)
{
printk(" rtc initialization error %d",err_code);
}
//Enable tick event & interrupt
nrfx_rtc_tick_enable(&rtc, true);
//Set compare channel to trigger interrupt after COMPARE_COUNTERTIME seconds
err_code = nrfx_rtc_cc_set(&rtc, 0, 1, true);
if(err_code!=NRFX_SUCCESS)
{
printk(" compare channel initialization error %d",err_code);
}
nrfx_rtc_enable(&rtc);
}
void ppi_init(void)
{
// Trigger task sample from timer
nrfx_err_t err_code = nrfx_ppi_channel_alloc(&m_timer_saadc_ppi_channel);
if(err_code!=NRFX_SUCCESS)
{
printk(" PPI channel allocation error %d",err_code);
}
err_code = nrfx_ppi_channel_assign(m_timer_saadc_ppi_channel,
nrfx_rtc_event_address_get(&rtc, NRF_RTC_EVENT_COMPARE_0),
nrf_saadc_task_address_get((NRF_SAADC_Type *)0x40007000,NRF_SAADC_TASK_SAMPLE));
if(err_code!=NRFX_SUCCESS)
{
printk(" PPI channel assignment error %d",err_code);
}
err_code = nrfx_ppi_channel_enable(m_timer_saadc_ppi_channel);
if(err_code!=NRFX_SUCCESS)
{
printk(" PPI channel enable error %d",err_code);
}
}
main()
{
..
..
rtc_init();
ppi_inti();
..
..
}
This is my implementation. what am i doing wrong here?
Is there any drivers for using PPI through Zephyr drivers ? other than PPI TRACE. PPI is completely absent in zephyr drivers. I wonder why. If Nordic develops a way to integrate PPI like device drivers model, it would be a lot easier.
Thanks in advance.