Microchip® Advanced Software Framework

adcife.h File Reference

Analog-to-Digital Converter driver for SAM4L.

Copyright (c) 2013-2018 Microchip Technology Inc. and its subsidiaries.

#include "compiler.h"
#include "pdca.h"
#include "sysclk.h"
#include "sleepmgr.h"
#include "conf_adcife.h"
#include "status_codes.h"

Data Structures

struct  adc_cdma_config
 Parameters for the configuration of the PDCA word. More...
 
struct  adc_cdma_first_config
 Parameters for the configuration of the First CDMA register. More...
 
struct  adc_cdma_second_config
 Parameters for the configuration of the Second CDMA register. More...
 
struct  adc_ch_config
 Parameters for the configuration of the Sequencer. More...
 
struct  adc_config
 ADC Configuration structure. More...
 
struct  adc_dev_inst
 ADC driver software instance structure. More...
 
struct  adc_pdca_config
 Parameters for the configuration of the PDCA word. More...
 
struct  adc_seq_config
 Parameters for the configuration of the Sequencer. More...
 

Macros

#define ADC_NUM_OF_ATTEMPTS   10000
 Time out value (number of attempts) More...
 
Prescaler Rate Slection
#define ADC_PRESCAL_DIV4   0
 
#define ADC_PRESCAL_DIV8   1
 
#define ADC_PRESCAL_DIV16   2
 
#define ADC_PRESCAL_DIV32   3
 
#define ADC_PRESCAL_DIV64   4
 
#define ADC_PRESCAL_DIV128   5
 
#define ADC_PRESCAL_DIV256   6
 
#define ADC_PRESCAL_DIV512   7
 
Clock Selection for sequencer/ADC cell
#define ADC_CLKSEL_GCLK   0
 
#define ADC_CLKSEL_APBCLK   1
 
ADC current reduction
#define ADC_SPEED_300K   0
 
#define ADC_SPEED_225K   1
 
#define ADC_SPEED_150K   2
 
#define ADC_SPEED_75K   3
 
ADC Reference selection
#define ADC_REFSEL_0   0
 
#define ADC_REFSEL_1   1
 
#define ADC_REFSEL_2   2
 
#define ADC_REFSEL_3   3
 
#define ADC_REFSEL_4   4
 
Zoom shift/unipolar reference source selection
#define ADC_ZOOMRANGE_0   0
 
#define ADC_ZOOMRANGE_1   1
 
#define ADC_ZOOMRANGE_2   2
 
#define ADC_ZOOMRANGE_3   3
 
#define ADC_ZOOMRANGE_4   4
 
MUX selection on Negative ADC input channel
#define ADC_MUXNEG_0   0
 
#define ADC_MUXNEG_1   1
 
#define ADC_MUXNEG_2   2
 
#define ADC_MUXNEG_3   3
 
#define ADC_MUXNEG_4   4
 
#define ADC_MUXNEG_5   5
 
#define ADC_MUXNEG_6   6
 
#define ADC_MUXNEG_7   7
 
MUX selection on Positive ADC input channel
#define ADC_MUXPOS_0   0
 
#define ADC_MUXPOS_1   1
 
#define ADC_MUXPOS_2   2
 
#define ADC_MUXPOS_3   3
 
#define ADC_MUXPOS_4   4
 
#define ADC_MUXPOS_5   5
 
#define ADC_MUXPOS_6   6
 
#define ADC_MUXPOS_7   7
 
#define ADC_MUXPOS_8   8
 
#define ADC_MUXPOS_9   9
 
#define ADC_MUXPOS_10   10
 
#define ADC_MUXPOS_11   11
 
#define ADC_MUXPOS_12   12
 
#define ADC_MUXPOS_13   13
 
#define ADC_MUXPOS_14   14
 
#define ADC_MUXPOS_15   15
 
Internal Voltage Sources Selection
#define ADC_INTERNAL_0   0
 
#define ADC_INTERNAL_1   1
 
#define ADC_INTERNAL_2   2
 
#define ADC_INTERNAL_3   3
 
Resolution
#define ADC_RES_8_BIT   1
 
#define ADC_RES_12_BIT   0
 
Gain Compensation
#define ADC_GCOMP_EN   1
 
#define ADC_GCOMP_DIS   0
 
Bipolar Mode
#define ADC_BIPOLAR_SINGLEENDED   0
 
#define ADC_BIPOLAR_DIFFERENTIAL   1
 
Half Word Left Adjust
#define ADC_HWLA_EN   1
 
#define ADC_HWLA_DIS   0
 
Window Monitor Mode
#define ADC_WM_OFF   0
 
#define ADC_WM_MODE_1   1
 
#define ADC_WM_MODE_2   2
 
#define ADC_WM_MODE_3   3
 
#define ADC_WM_MODE_4   4
 

Typedefs

typedef void(* adc_callback_t )(void)
 
typedef enum adc_interrupt_source adc_interrupt_source_t
 ADC interrupt source type. More...
 

Enumerations

enum  adc_gain_t {
  ADC_GAIN_1X = 0,
  ADC_GAIN_2X,
  ADC_GAIN_4X,
  ADC_GAIN_8X,
  ADC_GAIN_16X,
  ADC_GAIN_32X,
  ADC_GAIN_64X,
  ADC_GAIN_HALF
}
 Definitions for ADC gain. More...
 
enum  adc_interrupt_source {
  ADC_SEQ_SEOC = ADCIFE_IER_SEOC,
  ADC_SEQ_LOVR = ADCIFE_IER_LOVR,
  ADC_WINDOW_MONITOR = ADCIFE_IER_WM,
  ADC_SEQ_MTRG = ADCIFE_IER_SMTRG,
  ADC_TTO = ADCIFE_IER_TTO
}
 ADC interrupt source type. More...
 
enum  adc_trigger_t {
  ADC_TRIG_SW = 0,
  ADC_TRIG_INTL_TIMER,
  ADC_TRIG_INTL_TRIG_SRC,
  ADC_TRIG_CON,
  ADC_TRIG_EXT_PIN_RISE,
  ADC_TRIG_EXT_PIN_FALL,
  ADC_TRIG_EXT_PIN_BOTH
}
 Definitions for ADC trigger. More...
 

Functions

static void adc_ch_get_config_defaults (struct adc_ch_config *const cfg)
 Initializes an ADC channel configuration structure to defaults. More...
 
void adc_ch_set_config (struct adc_dev_inst *const dev_inst, struct adc_ch_config *cfg)
 Configure ADC channel with specified value. More...
 
static void adc_clear_status (struct adc_dev_inst *const dev_inst, const uint32_t status_flags)
 Clear ADC status. More...
 
static void adc_configure_calibration (struct adc_dev_inst *const dev_inst, const bool fcd, const bool biassel, const uint8_t biascal, const uint8_t calib)
 Configure ADC calibration mode with specified value. More...
 
static void adc_configure_gain (struct adc_dev_inst *const dev_inst, const enum adc_gain_t gain)
 Configure ADC gain with specified value. More...
 
static void adc_configure_itimer_period (struct adc_dev_inst *const dev_inst, const uint32_t period)
 Configure ADC internal timer with specified value. More...
 
static void adc_configure_trigger (struct adc_dev_inst *const dev_inst, const enum adc_trigger_t trigger)
 Configure ADC trigger source with specified value. More...
 
static void adc_configure_wm_mode (struct adc_dev_inst *const dev_inst, const uint8_t mode)
 Configure ADC window monitor mode with specified value. More...
 
static void adc_configure_wm_threshold (struct adc_dev_inst *const dev_inst, const uint16_t low_threshold, const uint16_t high_threshold)
 Configure ADC window monitor threshold with specified value. More...
 
void adc_disable (struct adc_dev_inst *const dev_inst)
 Disable ADC module. More...
 
static void adc_disable_interrupt (struct adc_dev_inst *const dev_inst, const adc_interrupt_source_t interrupt_source)
 Disable ADC interrupt. More...
 
status_code_t adc_enable (struct adc_dev_inst *const dev_inst)
 Enable ADC module. More...
 
static void adc_enable_interrupt (struct adc_dev_inst *const dev_inst, const adc_interrupt_source_t interrupt_source)
 Enable ADC interrupt. More...
 
static void adc_get_config_defaults (struct adc_config *const cfg)
 Initializes an ADC module configuration structure to defaults. More...
 
static adc_interrupt_source_t adc_get_interrupt_mask (struct adc_dev_inst *const dev_inst)
 Get ADC interrupt mask. More...
 
static uint8_t adc_get_last_conv_nchannel (struct adc_dev_inst *const dev_inst)
 Get last converted ADC negative channel. More...
 
static uint8_t adc_get_last_conv_pchannel (struct adc_dev_inst *const dev_inst)
 Get last ADC converted positive channel. More...
 
static uint16_t adc_get_last_conv_value (struct adc_dev_inst *const dev_inst)
 Get last ADC converted value. More...
 
static uint32_t adc_get_status (struct adc_dev_inst *const dev_inst)
 Get ADC status. More...
 
static uint8_t adc_get_wm_mode (struct adc_dev_inst *const dev_inst)
 Get ADC window monitor mode. More...
 
status_code_t adc_init (struct adc_dev_inst *const dev_inst, Adcife *const adc, struct adc_config *const cfg)
 Initialize the ADC module. More...
 
static bool adc_is_busy_itimer (struct adc_dev_inst *const dev_inst)
 Check if internal timer is busy. More...
 
static void adc_pdca_get_config_defaults (struct adc_pdca_config *const cfg)
 Initializes an ADC PDCA configuration structure to defaults. More...
 
void adc_pdca_set_config (struct adc_pdca_config *cfg)
 Configure ADC sequencer support multi-channel mode. More...
 
void adc_set_callback (struct adc_dev_inst *const dev_inst, adc_interrupt_source_t source, adc_callback_t callback, uint8_t irq_line, uint8_t irq_level)
 Set callback for ADC. More...
 
void adc_set_config (struct adc_dev_inst *const dev_inst, struct adc_config *cfg)
 Configure ADC with specified value. More...
 
static void adc_start_itimer (struct adc_dev_inst *const dev_inst)
 Start the ADC internal timer. More...
 
static void adc_start_software_conversion (struct adc_dev_inst *const dev_inst)
 Start ADC software trigger conversion. More...
 
static void adc_stop_itimer (struct adc_dev_inst *const dev_inst)
 Stop the ADC internal timer. More...
 

#define ADC_BIPOLAR_DIFFERENTIAL   1

Referenced by run_adcife_diff_test().

#define ADC_BIPOLAR_SINGLEENDED   0
#define ADC_CLKSEL_APBCLK   1
#define ADC_CLKSEL_GCLK   0
#define ADC_GCOMP_EN   1
#define ADC_HWLA_EN   1
#define ADC_INTERNAL_0   0
#define ADC_INTERNAL_1   1
#define ADC_INTERNAL_2   2
#define ADC_MUXNEG_0   0
#define ADC_MUXNEG_2   2
#define ADC_MUXNEG_3   3
#define ADC_MUXNEG_4   4
#define ADC_MUXNEG_5   5
#define ADC_MUXNEG_6   6
#define ADC_MUXNEG_7   7
#define ADC_MUXPOS_0   0
#define ADC_MUXPOS_1   1
#define ADC_MUXPOS_10   10
#define ADC_MUXPOS_11   11
#define ADC_MUXPOS_12   12
#define ADC_MUXPOS_13   13
#define ADC_MUXPOS_14   14
#define ADC_MUXPOS_15   15
#define ADC_MUXPOS_3   3

Referenced by main(), run_adcife_wm_test(), and start_adc().

#define ADC_MUXPOS_4   4
#define ADC_MUXPOS_5   5
#define ADC_MUXPOS_6   6
#define ADC_MUXPOS_7   7
#define ADC_MUXPOS_8   8
#define ADC_MUXPOS_9   9
#define ADC_NUM_OF_ATTEMPTS   10000

Time out value (number of attempts)

Referenced by adc_enable(), and run_adcife_diff_test().

#define ADC_PRESCAL_DIV128   5
#define ADC_PRESCAL_DIV16   2
#define ADC_PRESCAL_DIV256   6
#define ADC_PRESCAL_DIV32   3
#define ADC_PRESCAL_DIV4   0
#define ADC_PRESCAL_DIV512   7
#define ADC_PRESCAL_DIV64   4
#define ADC_PRESCAL_DIV8   1
#define ADC_REFSEL_0   0
#define ADC_REFSEL_1   1

Referenced by adc_get_config_defaults().

#define ADC_REFSEL_2   2
#define ADC_REFSEL_3   3
#define ADC_REFSEL_4   4
#define ADC_RES_8_BIT   1
#define ADC_SPEED_150K   2
#define ADC_SPEED_225K   1
#define ADC_SPEED_300K   0
#define ADC_SPEED_75K   3
#define ADC_WM_MODE_1   1
#define ADC_WM_MODE_2   2
#define ADC_WM_MODE_3   3

Referenced by main(), and run_adcife_wm_test().

#define ADC_WM_MODE_4   4
#define ADC_WM_OFF   0
#define ADC_ZOOMRANGE_1   1
#define ADC_ZOOMRANGE_2   2
#define ADC_ZOOMRANGE_3   3
#define ADC_ZOOMRANGE_4   4

typedef void(* adc_callback_t)(void)

ADC interrupt source type.

enum adc_gain_t

Definitions for ADC gain.

Enumerator
ADC_GAIN_1X 
ADC_GAIN_2X 
ADC_GAIN_4X 
ADC_GAIN_8X 
ADC_GAIN_16X 
ADC_GAIN_32X 
ADC_GAIN_64X 
ADC_GAIN_HALF 

ADC interrupt source type.

Enumerator
ADC_SEQ_SEOC 
ADC_SEQ_LOVR 
ADC_WINDOW_MONITOR 
ADC_SEQ_MTRG 
ADC_TTO 

Definitions for ADC trigger.

Enumerator
ADC_TRIG_SW 
ADC_TRIG_INTL_TIMER 
ADC_TRIG_INTL_TRIG_SRC 
ADC_TRIG_CON 
ADC_TRIG_EXT_PIN_RISE 
ADC_TRIG_EXT_PIN_FALL 
ADC_TRIG_EXT_PIN_BOTH 

static void adc_ch_get_config_defaults ( struct adc_ch_config *const  cfg)
inlinestatic

Initializes an ADC channel configuration structure to defaults.

Initializes a given ADC channel configuration structure to a set of known default values. This function should be called on all new instances of these configuration structures before being modified by the user application.

The default configuration is as follows:

  • Hardware Left Adjustment Disabled
  • Single Ended Mode Selected
  • Gain x1 Selected
  • Gain Compensation Disabled
  • Software Trigger Selected
  • 12-bits resolution Selected
  • Enable the internal voltage sources
  • Mus Pos 2 / Mux Neg 1 selected
  • All modes except zoom and unipolar with hysteresis
Parameters
cfgADC channel configuration structure to initialize to default value

References ADC_BIPOLAR_SINGLEENDED, ADC_GAIN_1X, ADC_GCOMP_DIS, ADC_HWLA_DIS, ADC_INTERNAL_3, ADC_MUXNEG_1, ADC_MUXPOS_2, ADC_RES_12_BIT, ADC_TRIG_SW, ADC_ZOOMRANGE_0, Assert, adc_seq_config::bipolar, adc_seq_config::gain, adc_seq_config::gcomp, adc_ch_config::high_threshold, adc_seq_config::hwla, adc_seq_config::internal, adc_ch_config::internal_timer_max_count, adc_ch_config::low_threshold, adc_seq_config::muxneg, adc_seq_config::muxpos, adc_seq_config::res, adc_ch_config::seq_cfg, adc_seq_config::trgsel, adc_ch_config::window_mode, and adc_seq_config::zoomrange.

static void adc_clear_status ( struct adc_dev_inst *const  dev_inst,
const uint32_t  status_flags 
)
inlinestatic

Clear ADC status.

Parameters
dev_instDevice structure pointer.
status_flagsstatus flag.

References adc_dev_inst::hw_dev.

Referenced by adcife_read_conv_result(), adcife_set_conv_flag(), adcife_set_wm_flag(), adcife_wm_handler(), and main().

static void adc_configure_calibration ( struct adc_dev_inst *const  dev_inst,
const bool  fcd,
const bool  biassel,
const uint8_t  biascal,
const uint8_t  calib 
)
inlinestatic

Configure ADC calibration mode with specified value.

Parameters
dev_instDevice structure pointer.
fcdFlash Calibration Done.
biasselSelect bias mode.
biascalBias calibration.
calibCalibration value.

References adc_dev_inst::hw_dev.

static void adc_configure_gain ( struct adc_dev_inst *const  dev_inst,
const enum adc_gain_t  gain 
)
inlinestatic

Configure ADC gain with specified value.

Parameters
dev_instDevice structure pointer.
gaingain value.

References adc_dev_inst::hw_dev.

Referenced by main(), run_adcife_diff_test(), run_adcife_itimer_trig_test(), run_adcife_multichannel_test(), run_adcife_wm_test(), and start_adc().

static void adc_configure_itimer_period ( struct adc_dev_inst *const  dev_inst,
const uint32_t  period 
)
inlinestatic

Configure ADC internal timer with specified value.

Parameters
dev_instDevice structure pointer.
periodInternal Timer Max Counter

References adc_dev_inst::hw_dev.

Referenced by run_adcife_itimer_trig_test(), and start_adc().

static void adc_configure_trigger ( struct adc_dev_inst *const  dev_inst,
const enum adc_trigger_t  trigger 
)
inlinestatic

Configure ADC trigger source with specified value.

Parameters
dev_instDevice structure pointer.
triggertrigger source selection.

References adc_dev_inst::hw_dev.

Referenced by main(), run_adcife_diff_test(), run_adcife_itimer_trig_test(), run_adcife_multichannel_test(), run_adcife_wm_test(), and start_adc().

static void adc_configure_wm_mode ( struct adc_dev_inst *const  dev_inst,
const uint8_t  mode 
)
inlinestatic

Configure ADC window monitor mode with specified value.

Parameters
dev_instDevice structure pointer.
modeWindow Monitor Mode.

References adc_dev_inst::hw_dev.

Referenced by adc_ch_set_config(), and main().

static void adc_configure_wm_threshold ( struct adc_dev_inst *const  dev_inst,
const uint16_t  low_threshold,
const uint16_t  high_threshold 
)
inlinestatic

Configure ADC window monitor threshold with specified value.

Parameters
dev_instDevice structure pointer.
low_thresholdLow Threshold value.
high_thresholdHighThreshold value.

References adc_dev_inst::hw_dev.

Referenced by adc_ch_set_config(), and main().

static void adc_disable_interrupt ( struct adc_dev_inst *const  dev_inst,
const adc_interrupt_source_t  interrupt_source 
)
inlinestatic

Disable ADC interrupt.

Parameters
dev_instDevice structure pointer.
interrupt_sourceinterrupt source.

References adc_dev_inst::hw_dev.

Referenced by adcife_set_conv_flag(), adcife_set_wm_flag(), adcife_wm_handler(), main(), and start_adc().

static void adc_enable_interrupt ( struct adc_dev_inst *const  dev_inst,
const adc_interrupt_source_t  interrupt_source 
)
inlinestatic

Enable ADC interrupt.

Parameters
dev_instDevice structure pointer.
interrupt_sourceinterrupt source.

References adc_dev_inst::hw_dev.

Referenced by adc_set_callback(), main(), and run_adcife_wm_test().

static void adc_get_config_defaults ( struct adc_config *const  cfg)
inlinestatic

Initializes an ADC module configuration structure to defaults.

Initializes a given ADC module configuration structure to a set of known default values. This function should be called on all new instances of these configuration structures before being modified by the user application.

The default configuration is as follows:

Parameters
cfgADC module configuration structure to initialize to default value

References ADC_CLKSEL_APBCLK, ADC_PRESCAL_DIV16, ADC_REFSEL_1, ADC_SPEED_150K, Assert, adc_config::clksel, adc_config::prescal, adc_config::refsel, adc_config::speed, and adc_config::start_up.

static adc_interrupt_source_t adc_get_interrupt_mask ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Get ADC interrupt mask.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

static uint8_t adc_get_last_conv_nchannel ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Get last converted ADC negative channel.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

static uint8_t adc_get_last_conv_pchannel ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Get last ADC converted positive channel.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

static uint16_t adc_get_last_conv_value ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Get last ADC converted value.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

Referenced by adcife_read_conv_result(), adcife_wm_handler(), display_info(), and run_adcife_diff_test().

static uint32_t adc_get_status ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Get ADC status.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

Referenced by adcife_read_conv_result(), adcife_set_conv_flag(), adcife_wm_handler(), and run_adcife_diff_test().

static uint8_t adc_get_wm_mode ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Get ADC window monitor mode.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

Referenced by adcife_wm_handler(), display_info(), and get_wm_mode().

static bool adc_is_busy_itimer ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Check if internal timer is busy.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

static void adc_pdca_get_config_defaults ( struct adc_pdca_config *const  cfg)
inlinestatic

Initializes an ADC PDCA configuration structure to defaults.

Initializes a given ADC PDCA configuration structure to a set of known default values. This function should be called on all new instances of these configuration structures before being modified by the user application.

Parameters
cfgADC PDCA configuration structure to initialize to default value

References Assert, adc_pdca_config::buffer, adc_pdca_config::cdma_cfg, adc_pdca_config::nb_channels, NULL, adc_pdca_config::pdc_rx_channel, and adc_pdca_config::wm.

static void adc_start_itimer ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Start the ADC internal timer.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

Referenced by run_adcife_itimer_trig_test(), and start_adc().

static void adc_start_software_conversion ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Start ADC software trigger conversion.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.

Referenced by main().

static void adc_stop_itimer ( struct adc_dev_inst *const  dev_inst)
inlinestatic

Stop the ADC internal timer.

Parameters
dev_instDevice structure pointer.

References adc_dev_inst::hw_dev.