void nrfx_adc_irq_handler(void) { if (m_cb.p_buffer == NULL) { nrf_adc_event_clear(NRF_ADC_EVENT_END); NRFX_LOG_DEBUG("Event: %s.",NRFX_LOG_ERROR_STRING_GET(NRF_ADC_EVENT_END)); nrf_adc_int_disable(NRF_ADC_INT_END_MASK); nrf_adc_disable(); nrfx_adc_evt_t evt; evt.type = NRFX_ADC_EVT_SAMPLE; evt.data.sample.sample = (nrf_adc_value_t)nrf_adc_result_get(); NRFX_LOG_DEBUG("ADC data:"); NRFX_LOG_HEXDUMP_DEBUG((uint8_t *)(&evt.data.sample.sample), sizeof(nrf_adc_value_t)); m_cb.state = NRFX_DRV_STATE_INITIALIZED; m_cb.event_handler(&evt); } else if (adc_sample_process()) { NRFX_LOG_DEBUG("Event: %s.", NRFX_LOG_ERROR_STRING_GET(NRF_ADC_EVENT_END)); nrf_adc_int_disable(NRF_ADC_INT_END_MASK); nrfx_adc_evt_t evt; evt.type = NRFX_ADC_EVT_DONE; evt.data.done.p_buffer = m_cb.p_buffer; evt.data.done.size = m_cb.size; m_cb.state = NRFX_DRV_STATE_INITIALIZED; NRFX_LOG_DEBUG("ADC data:"); NRFX_LOG_HEXDUMP_DEBUG((uint8_t *)m_cb.p_buffer, m_cb.size * sizeof(nrf_adc_value_t)); m_cb.event_handler(&evt); } }
static bool adc_sample_process() { nrf_adc_event_clear(NRF_ADC_EVENT_END); nrf_adc_disable(); m_cb.p_buffer[m_cb.idx] = (nrf_adc_value_t)nrf_adc_result_get(); m_cb.idx++; if (m_cb.idx < m_cb.size) { bool task_trigger = false; if (m_cb.p_current_conv->p_next == NULL) { m_cb.p_current_conv = m_cb.p_head; } else { m_cb.p_current_conv = m_cb.p_current_conv->p_next; task_trigger = true; } nrf_adc_config_set(m_cb.p_current_conv->config.data); nrf_adc_enable(); if (task_trigger) { //nrf_adc_start(); nrf_adc_task_trigger(NRF_ADC_TASK_START); } return false; } else { return true; } }
static bool adc_sample_process() { nrf_adc_event_clear(NRF_ADC_EVENT_END); nrf_adc_disable(); m_cb.p_buffer[m_cb.idx] = (nrf_adc_value_t)nrf_adc_result_get(); m_cb.idx++; if (m_cb.idx < m_cb.size) { bool task_trigger = false; if (m_cb.p_current_conv->p_next == NULL) { // Make sure the list of channels has not been somehow removed // (it is when all channels are disabled). NRFX_ASSERT(m_cb.p_head); m_cb.p_current_conv = m_cb.p_head; } else { m_cb.p_current_conv = m_cb.p_current_conv->p_next; task_trigger = true; } nrf_adc_init(&m_cb.p_current_conv->config); nrf_adc_enable(); if (task_trigger) { nrf_adc_task_trigger(NRF_ADC_TASK_START); } return false; } else { return true; } }
nrfx_err_t nrfx_adc_sample_convert(nrfx_adc_channel_t const * const p_channel, nrf_adc_value_t * p_value) { nrfx_err_t err_code; NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); if (m_cb.state == NRFX_DRV_STATE_POWERED_ON) { err_code = NRFX_ERROR_BUSY; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } else { m_cb.state = NRFX_DRV_STATE_POWERED_ON; nrf_adc_config_set(p_channel->config.data); nrf_adc_enable(); nrf_adc_int_disable(NRF_ADC_INT_END_MASK); nrf_adc_start(); if (p_value) { while (!nrf_adc_event_check(NRF_ADC_EVENT_END)) {} nrf_adc_event_clear(NRF_ADC_EVENT_END); *p_value = (nrf_adc_value_t)nrf_adc_result_get(); nrf_adc_disable(); m_cb.state = NRFX_DRV_STATE_INITIALIZED; } else { NRFX_ASSERT(m_cb.event_handler); m_cb.p_buffer = NULL; nrf_adc_int_enable(NRF_ADC_INT_END_MASK); } err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } }