This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

About SAADC, Easy-DMA and channels (nRF5_SDK)

There's an example saadc_pca10036 in the SDK. I am wondering how this piece of code works in that example:

void saadc_init(void)
{
    ret_code_t err_code;
    nrf_saadc_channel_config_t channel_config =
            NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
    err_code = nrf_drv_saadc_init(NULL, saadc_callback);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_channel_init(0, &channel_config);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0],SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);
    
    err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1],SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);
}

Specifically, why there are two calls of same function, nrf_drv_saadc_buffer_convert()? Does it set some kind of double-buffering?

In my case, I have four ADC-inputs I want to sample 200 times per second each. How should I configure the SAADC subsystem?

EDIT: Also, how do I know which channel was triggered when I get into the callback (below)?

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
   if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
   ...
Parents
  • It is still unclear for me how to set-up several channels. For example, if I need two channels, the code is maybe something like this:

    #define CHANNELS       2
    #define BUFFERSIZE   128
    int16_t Buffers[CHANNELS][2][BUFFERSIZE];
    
    void init_adc(void)
    {
        nrf_drv_saadc_init(NULL, saadc_callback);
    
        // set up first channel
        nrf_saadc_channel_config_t channel_config =
             NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
        nrf_drv_saadc_channel_init(0, &channel_config);
        // set-up double buffering for the first channel
        nrf_drv_saadc_buffer_convert(Buffers[0][0], BUFFERSIZE);
        nrf_drv_saadc_buffer_convert(Buffers[0][1], BUFFERSIZE);
    
        // set up second channel
        nrf_saadc_channel_config_t channel_config =
            NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);
        nrf_drv_saadc_channel_init(1, &channel_config);
        // set-up double buffering for the second channel
        nrf_drv_saadc_buffer_convert(Buffers[1][0], BUFFERSIZE);
        nrf_drv_saadc_buffer_convert(Buffers[1][1], BUFFERSIZE);
    }
    

    And the event handler:

    static
      void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
      {
          if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
          {
              nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, BUFFERSIZE);
              // TODO: How do I know which of the two channels was triggered?
          }
      }
    

    As said in the TODO-line, how do I know which of the two channels was triggered? Do I need to compare the pointer p_event->data.done.p_buffer against the pointers I set earlier with the call to *_buffer_convert() at my init_adc()?

  • Thanks for comment. How do I enable scan mode?

Reply Children
No Data
Related