Feedback
Feedback

If you are having issues with the exercises, please create a ticket on DevZone: devzone.nordicsemi.com
Click or drag files to this area to upload. You can upload up to 2 files.

Choosing between Zephyr ADC API and nrfx SAADC driver API

In nRF Connect SDK, there are two ways to interact with the SAADC peripheral:

  • Using the Zephyr API.
  • Using the nrfx drivers (nrfx SAADC API) directly.

The Zephyr ADC API is the recommended API to be used whenever it can adequately address the use case. However, in scenarios where the Zephyr API has limitations, the nrfx SAADC API can be a suitable alternative. This section will describe the drawbacks of using nrfx SAADC driver directly and describe some use-cases where it could be relevant.

Advantages of Zephyr API

High portability – Zephyr driver implementations are written to be platform agnostic. If you are switching to another chip variant, chip family, or chip vendor, the Zephyr APIs should work without modifications, while the nrfx SAADC driver API could require major changes to port the functionality to a new platform.

Uses Zephyr power management features – nrfx drivers are written to be OS agnostic and do not integrate any RTOS-specific power management features. While Zephyr drivers have been written to make use of and support automatic power management features in Zephyr, this must be handled manually in the application if using nrfx drivers.

nrfx SAADC use-cases

High sample rate

Some use cases require very fast sampling of the analog input(s). If each sample is triggered from software, this will cause many interrupts/wakeups of the CPU just to trigger the samples. The SAADC peripheral in nRF52/nRF53/nRF91 Series chips supports a maximum sample rate of 200 ksps, or 5us interval. Future chip variants may support even faster sample rates. It is impractical to trigger the sampling from software/CPU at such high sample rates, as this will take CPU time away from other running tasks in the application.

Precise sample interval

If you have a use case where you need to sample an analog input at a very precise interval or a specific point in time, triggering sampling from software might not be accurate enough in a single-core SoC running protocol stacks at high priority. If another interrupt/thread has a higher priority than the ADC sampling thread, the triggering of the sampling will be delayed until the higher priority task is done.

Both the above-mentioned use cases can be solved using the DPPI/PPI peripheral in Nordic chips. (D)PPI is signaling between peripherals implemented purely in hardware to trigger tasks when events occur, eliminating the need to involve the CPU to perform operations. Since the signaling is implemented in hardware, there is no interrupt delay or chance of being delayed by other higher-priority tasks. (D)PPI is a Nordic Semiconductor specific HW feature which there is no current support for in the Zephyr driver APIs.

The nrfx SAADC driver can be combined with nrfx (D)PPI driver in nRF Connect SDK to support the described use cases. In exercises 2 and 3, you will learn how to use the nrfx SAADC API in nRF Connect SDK.

The nrfx SAADC driver has two different operation modes:

The simple mode allows obtaining a single sample from each requested channel. The conversion can be done in a blocking or non-blocking manner. Sampling is initiated by a function call from software.

The advanced mode allows performing double-buffered conversions of arbitrary length. The conversions can be done in a blocking or non-blocking manner. The advanced mode can be configured to trigger sampling using an internal timer or externally (for example, by using the TIMER and/or the PPI/DPPI). The advanced mode supports double-buffering and can be configured to switch buffers externally using PPI channel. This is useful when requiring true continuous sampling without any delays by CPU to handle buffer switching.

Note

In the nRF Connect SDK, there are examples that demonstrate how to use the nrfx drivers directly for various peripherals.
These examples can be found here: <installation_path>\modules\hal\nordic\nrfx\samples.

In some scenarios, using the nrfx drivers directly may be the only viable option. For instance, Zephyr RTOS, may not have certain functionalities implemented, like the I2C target (deprecated term: slave) API. In such cases, the only way to utilize these functionalities is by directly employing the nrfx TWIS driver.

However, in other scenarios, such as with the ADC, as previously discussed, you have a choice. You can either use the nrfx drivers directly for complete control over the peripheral functionality, or choose a more portable approach. This means you have to weigh the benefits of portability/automated power management against the advantages of having absolute control over the peripheral.

Register an account
Already have an account? Log in
(All fields are required unless specified optional)

  • 8 or more characters
  • Upper and lower case letters
  • At least one number or special character

Forgot your password?
Enter the email associated with your account, and we will send you a link to reset your password.