CC26xx Driver Library
[aux_adc.h] AUX Analog to Digital Converter

Functions

void AUXADCDisable (void)
 Disables the ADC. More...
 
void AUXADCEnableAsync (uint32_t refSource, uint32_t trigger)
 Enables the ADC for asynchronous operation. More...
 
void AUXADCEnableSync (uint32_t refSource, uint32_t sampleTime, uint32_t trigger)
 Enables the ADC for synchronous operation. More...
 
void AUXADCEnableSyncNoBugWorkaround (uint32_t refSource, uint32_t sampleTime, uint32_t trigger)
 Enables the ADC for synchronous operation. More...
 
void AUXADCDisableInputScaling (void)
 Disables scaling of the ADC input. More...
 
void AUXADCFlushFifo (void)
 Flushes the ADC FIFO. More...
 
static void AUXADCGenManualTrigger (void)
 Generates a single manual ADC trigger. More...
 
static uint32_t AUXADCGetFifoStatus (void)
 Returns flags indicating the status of the ADC FIFO. More...
 
uint32_t AUXADCReadFifo (void)
 Waits for and returns the first sample in the ADC FIFO. More...
 
uint32_t AUXADCPopFifo (void)
 Returns the first sample in the ADC FIFO, without waiting. More...
 
static void AUXADCSelectInput (uint32_t input)
 Selects internal or external input for the ADC. More...
 
int32_t AUXADCGetAdjustmentGain (uint32_t refSource)
 Returns the gain value used when adjusting for ADC gain/offset. More...
 
int32_t AUXADCGetAdjustmentOffset (uint32_t refSource)
 Returns the offset value used when adjusting for ADC gain/offset. More...
 
int32_t AUXADCValueToMicrovolts (int32_t fixedRefVoltage, int32_t adcValue)
 Converts an "adjusted" ADC value to microvolts. More...
 
int32_t AUXADCMicrovoltsToValue (int32_t fixedRefVoltage, int32_t microvolts)
 Converts a number of microvolts to corresponding "adjusted" ADC value. More...
 
int32_t AUXADCAdjustValueForGainAndOffset (int32_t adcValue, int32_t gain, int32_t offset)
 Performs ADC value gain and offset adjustment. More...
 
int32_t AUXADCUnadjustValueForGainAndOffset (int32_t adcValue, int32_t gain, int32_t offset)
 Performs the inverse of the ADC value gain and offset adjustment. More...
 

Detailed Description

Function Documentation

int32_t AUXADCAdjustValueForGainAndOffset ( int32_t  adcValue,
int32_t  gain,
int32_t  offset 
)

Performs ADC value gain and offset adjustment.

This function takes a measured ADC value compensates for the internal gain and offset in the ADC.

Parameters
adcValue12-bit ADC unadjusted value
gainGain adjustment value provided by AUXADCGetAdjustmentGain()
offsetOffset adjustment value provided by AUXADCGetAdjustmentOffset()
Returns
12-bit ADC adjusted value
339 {
340  // Apply gain and offset adjustment
341  adcValue = (((adcValue + offset) * gain) + 16384) / 32768;
342 
343  // Saturate
344  if (adcValue < 0) {
345  return 0;
346  } else if (adcValue > 4095) {
347  return 4095;
348  } else {
349  return adcValue;
350  }
351 }
void AUXADCDisable ( void  )

Disables the ADC.

This function must be called:

90 {
91  // Disable the ADC reference
93 
94  // Assert reset and disable the ADC
96 
97  // Ensure that scaling is enabled by default before next use of the ADC
99 
100  // Flush the FIFO before disabling the clocks
101  HWREGBITW(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL, 1) = 1; // CMD: EN(1) -> FLUSH(3)
102  HWREGBITW(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL, 1) = 0; // CMD: FLUSH(3) -> EN(1)
103 
104  // Disable the ADC clock (no need to wait since IOB_WUC_ADCCLKCTL_ACK goes low immediately)
106 
107  // Disable the ADC data interface
108  HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL) = 0;
109 }
static void ADI8BitsClear(uint32_t ui32Base, uint32_t ui32Reg, uint8_t ui8Val)
Clear specific bits in an 8 bit ADI register.
Definition: adi.h:514

Here is the call graph for this function:

void AUXADCDisableInputScaling ( void  )

Disables scaling of the ADC input.

By default, the ADC operates internally on a version of the input signal that has been scaled down by a factor 1408 / 4095. This function disables that scaling, allowing for a trade-off between dynamic range and and resolution.

Note
This function must only be called while the ADC is disabled, before calling AUXADCEnableSync() or AUXADCEnableAsync().
Different input maximum ratings apply when input scaling is disabled. Violating these may damage the device.
223 {
225 }
static void ADI8BitsSet(uint32_t ui32Base, uint32_t ui32Reg, uint8_t ui8Val)
Set specific bits in a single 8 bit ADI register.
Definition: adi.h:373

Here is the call graph for this function:

void AUXADCEnableAsync ( uint32_t  refSource,
uint32_t  trigger 
)

Enables the ADC for asynchronous operation.

In asynchronous operation, the ADC samples continuously between conversions.

The ADC trigger starts the conversion. Note that the first conversion may be invalid if the sampling period is too short.

ADC input scaling is enabled by default after device reset, and is also re- enabled by AUXADCDisable(). To disable input scaling, call AUXADCDisableInputScaling() before calling AUXADCEnableAsync().

Parameters
refSourceADC reference source:
triggerADC conversion trigger:
118 {
119  // Enable the ADC reference, with the following options:
120  // - SRC: Set when using relative reference
121  // - REF_ON_IDLE: Always cleared since there is no idle state in asynchronous operation
123 
124  // Enable the ADC clock
127 
128  // Enable the ADC data interface
129  if (trigger == AUXADC_TRIGGER_MANUAL) {
130  // Manual trigger: No need to configure event routing from GPT
132  } else {
133  // GPT trigger: Configure event routing via MCU_EV to the AUX domain
134  HWREG(EVENT_BASE + EVENT_O_AUXSEL0) = trigger;
136  }
137 
138  // Configure the ADC
140 
141  // Release reset and enable the ADC
143 }
static void ADI8BitsSet(uint32_t ui32Base, uint32_t ui32Reg, uint8_t ui8Val)
Set specific bits in a single 8 bit ADI register.
Definition: adi.h:373
#define AUXADC_TRIGGER_MANUAL
Definition: aux_adc.h:127

Here is the call graph for this function:

void AUXADCEnableSync ( uint32_t  refSource,
uint32_t  sampleTime,
uint32_t  trigger 
)

Enables the ADC for synchronous operation.

In synchronous operation, the ADC is idle between a conversion and subsequent samplings.

The ADC trigger starts sampling with specified duration, followed by the conversion. Note that the first conversion may be invalid if the initial sampling period is too short.

ADC input scaling is enabled by default after device reset, and is also re- enabled by AUXADCDisable(). To disable input scaling, call AUXADCDisableInputScaling() before calling AUXADCEnableSync().

Parameters
refSourceADC reference source:
sampleTimeADC sampling time:
triggerADC conversion trigger:
192 {
193  // The original AUXADCEnableSync() implementation requires a workaround,
194  // consisting of a delay, after its invocation. This delay is implemented by
195  // repeating the last ADI write operation three times.
196  //
197  // We need to make a call to the ROM symbol directly. Otherwise, the
198  // current build process will call the implementation in flash instead even
199  // if a ROM version is available.
200 #if defined(ROM_AUXADCEnableSyncNoBugWorkaround) && !defined(DRIVERLIB_NOROM) && !defined(DOXYGEN)
201  ROM_AUXADCEnableSyncNoBugWorkaround(refSource, sampleTime, trigger);
202 #else
203  AUXADCEnableSyncNoBugWorkaround(refSource, sampleTime, trigger);
204 #endif
205 
206 
207  // Repeat this write another three times to add a delay. This is required
208  // to prevent the device from hanging if we generate a manual ADC trigger
209  // immediately after enabling the ADC and the Sensor Controller turns on
210  // or off the XOSC_HF as a reference for the TDC at the same time.
214 }
static void ADI8BitsSet(uint32_t ui32Base, uint32_t ui32Reg, uint8_t ui8Val)
Set specific bits in a single 8 bit ADI register.
Definition: adi.h:373
void AUXADCEnableSyncNoBugWorkaround(uint32_t refSource, uint32_t sampleTime, uint32_t trigger)
Enables the ADC for synchronous operation.
Definition: aux_adc.c:153
#define ROM_AUXADCEnableSyncNoBugWorkaround
Definition: rom.h:720

Here is the call graph for this function:

void AUXADCEnableSyncNoBugWorkaround ( uint32_t  refSource,
uint32_t  sampleTime,
uint32_t  trigger 
)

Enables the ADC for synchronous operation.

The device can hang if we generate a manual ADC trigger immediately after enabling the ADC with this function and the Sensor Controller turns on or off the XOSC_HF as a reference for the TDC at the same time.

An application should be calling AUXADCEnableSync() instead.

In synchronous operation, the ADC is idle between a conversion and subsequent samplings.

The ADC trigger starts sampling with specified duration, followed by the conversion. Note that the first conversion may be invalid if the initial sampling period is too short.

ADC input scaling is enabled by default after device reset, and is also re- enabled by AUXADCDisable(). To disable input scaling, call AUXADCDisableInputScaling() before calling AUXADCEnableSync().

Parameters
refSourceADC reference source:
sampleTimeADC sampling time:
triggerADC conversion trigger:

Referenced by AUXADCEnableSync().

154 {
155  // Enable the ADC reference, with the following options:
156  // - SRC: Set when using relative reference
157  // - REF_ON_IDLE: Set when using fixed reference and sample time < 21.3 us
158  uint8_t adcref0 = refSource | ADI_4_AUX_ADCREF0_EN_M;
159  if (!refSource && (sampleTime < AUXADC_SAMPLE_TIME_21P3_US)) {
161  }
163 
164  // Enable the ADC clock
167 
168  // Enable the ADC data interface
169  if (trigger == AUXADC_TRIGGER_MANUAL) {
170  // Manual trigger: No need to configure event routing from GPT
172  } else {
173  // GPT trigger: Configure event routing via MCU_EV to the AUX domain
174  HWREG(EVENT_BASE + EVENT_O_AUXSEL0) = trigger;
176  }
177 
178  // Configure the ADC
180 
181  // Release reset and enable the ADC
183 }
#define AUXADC_SAMPLE_TIME_21P3_US
Definition: aux_adc.h:153
static void ADI8BitsSet(uint32_t ui32Base, uint32_t ui32Reg, uint8_t ui8Val)
Set specific bits in a single 8 bit ADI register.
Definition: adi.h:373
#define AUXADC_TRIGGER_MANUAL
Definition: aux_adc.h:127

Here is the call graph for this function:

void AUXADCFlushFifo ( void  )

Flushes the ADC FIFO.

This empties the FIFO and clears the underflow/overflow flags.

Note: This function must only be called while the ADC is enabled.

234 {
235  HWREGBITW(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL, 1) = 1; // CMD: EN(1) -> FLUSH(3)
236  HWREGBITW(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL, 1) = 0; // CMD: FLUSH(3) -> EN(1)
237 }
static void AUXADCGenManualTrigger ( void  )
inlinestatic

Generates a single manual ADC trigger.

For synchronous mode, the trigger starts sampling followed by conversion. For asynchronous mode, the trigger starts conversion.

369 {
370  HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCTRIG) = 0;
371 }
int32_t AUXADCGetAdjustmentGain ( uint32_t  refSource)

Returns the gain value used when adjusting for ADC gain/offset.

The function returns the gain value to be used with AUXADCAdjustValueForGainAndOffset() or AUXADCUnadjustValueForGainAndOffset(). The gain value is found during chip manufacturing and is stored in the factory configuration, FCFG1.

Parameters
refSourceADC reference source:
Returns
The gain value to be used in adjustments
274 {
275  int32_t gain;
276  if (refSource == AUXADC_REF_FIXED) {
277  // AUXADC_REF_FIXED ==> ABS_GAIN
279  } else {
280  // AUXADC_REF_VDDS_REL ==> REL_GAIN
282  }
283  return gain;
284 }
#define AUXADC_REF_FIXED
Definition: aux_adc.h:108
int32_t AUXADCGetAdjustmentOffset ( uint32_t  refSource)

Returns the offset value used when adjusting for ADC gain/offset.

The function returns the offset value to be used with AUXADCAdjustValueForGainAndOffset() or AUXADCUnadjustValueForGainAndOffset(). The offset value is found during chip manufacturing and is stored in the factory configuration, FCFG1.

Parameters
refSourceADC reference source:
Returns
The offset value to be used in adjustments
293 {
294  int8_t offset;
295  if ( refSource == AUXADC_REF_FIXED ) {
296  // AUXADC_REF_FIXED ==> ABS_OFFSET
298  } else {
299  // AUXADC_REF_VDDS_REL ==> REL_OFFSET
301  }
302  return offset;
303 }
#define AUXADC_REF_FIXED
Definition: aux_adc.h:108
static uint32_t AUXADCGetFifoStatus ( void  )
inlinestatic

Returns flags indicating the status of the ADC FIFO.

The flags indicate FIFO empty, full and almost full, and whether overflow/underflow has occurred.

Returns
A combination (bitwise OR) of the following flags:
391 {
392  return HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCFIFOSTAT);
393 }
int32_t AUXADCMicrovoltsToValue ( int32_t  fixedRefVoltage,
int32_t  microvolts 
)

Converts a number of microvolts to corresponding "adjusted" ADC value.

This function can only be used when measuring with fixed ADC reference (AUXADC_REF_FIXED). The specified reference voltage accounts for whether the sampled ADC input is scaled down before conversion or not.

Parameters
fixedRefVoltageFixed reference voltage, in microvolts
microvoltsThe number of microvolts
Returns
The corresponding expected ADC value (adjusted for ADC gain/offset)
325 {
326  // Chop off 4 bits during calculations to avoid 32-bit overflow
327  fixedRefVoltage >>= 4;
328  microvolts >>= 4;
329  return ((microvolts * 4095) + (fixedRefVoltage / 2)) / fixedRefVoltage;
330 }
uint32_t AUXADCPopFifo ( void  )

Returns the first sample in the ADC FIFO, without waiting.

This function does not wait, and must only be called when there is at least one sample in the ADC FIFO. Otherwise the call will generate FIFO underflow (AUXADC_FIFO_UNDERFLOW_M).

Returns
The first (12-bit) sample from the ADC FIFO, or an undefined value if the FIFO is empty
260  {
261 
262  // Return the first sample from the FIFO. If the FIFO is empty, this
263  // generates ADC FIFO underflow
264  return HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCFIFO);
265 }
uint32_t AUXADCReadFifo ( void  )

Waits for and returns the first sample in the ADC FIFO.

This function waits until there is at least one sample in the ADC FIFO. It then pops and returns the first sample from the FIFO.

Note
This procedure will deadlock if called without setting up ADC trigger generation in advance. The trigger can either be manual or periodical (using a GPT).
Returns
The first (12-bit) sample from the ADC FIFO
245  {
246 
247  // Wait until there is at least one sample in the FIFO
249 
250  // Return the first sample from the FIFO
251  return HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCFIFO);
252 }
static void AUXADCSelectInput ( uint32_t  input)
inlinestatic

Selects internal or external input for the ADC.

Note that calling this function also selects the same input for AUX_COMPB.

Parameters
inputInternal/external input selection:
448 {
450 }
#define HapiSelectADCCompBInput(a)
Definition: rom.h:157
int32_t AUXADCUnadjustValueForGainAndOffset ( int32_t  adcValue,
int32_t  gain,
int32_t  offset 
)

Performs the inverse of the ADC value gain and offset adjustment.

This function finds the expected measured ADC value, without gain and offset compensation, for a given "ideal" ADC value. The function can for example be used to find ADC value thresholds to be used in Sensor Controller task configurations.

Parameters
adcValue12-bit ADC adjusted value
gainGain adjustment value provided by AUXADCGetAdjustmentGain()
offsetOffset adjustment value provided by AUXADCGetAdjustmentOffset()
Returns
12-bit ADC unadjusted value
360 {
361  // Apply inverse gain and offset adjustment
362  adcValue = (((adcValue * 32768) + (gain / 2)) / gain) - offset;
363 
364  // Saturate
365  if (adcValue < 0) {
366  return 0;
367  } else if (adcValue > 4095) {
368  return 4095;
369  } else {
370  return adcValue;
371  }
372 }
int32_t AUXADCValueToMicrovolts ( int32_t  fixedRefVoltage,
int32_t  adcValue 
)

Converts an "adjusted" ADC value to microvolts.

This function can only be used when measuring with fixed ADC reference (AUXADC_REF_FIXED). The specified reference voltage accounts for whether the sampled ADC input is scaled down before conversion or not.

Parameters
fixedRefVoltageFixed reference voltage, in microvolts
adcValueThe ADC value
Returns
The corresponding number of microvolts
312 {
313  // Chop off 4 bits during calculations to avoid 32-bit overflow
314  fixedRefVoltage >>= 4;
315  return (((adcValue * fixedRefVoltage) + 2047) / 4095) << 4;
316 }

Macro Definition Documentation

#define AUXADC_FIFO_ALMOST_FULL_M   (AUX_ANAIF_ADCFIFOSTAT_ALMOST_FULL_M)
#define AUXADC_FIFO_EMPTY_M   (AUX_ANAIF_ADCFIFOSTAT_EMPTY_M)
#define AUXADC_FIFO_FULL_M   (AUX_ANAIF_ADCFIFOSTAT_FULL_M)
#define AUXADC_FIFO_OVERFLOW_M   (AUX_ANAIF_ADCFIFOSTAT_OVERFLOW_M)
#define AUXADC_FIFO_UNDERFLOW_M   (AUX_ANAIF_ADCFIFOSTAT_UNDERFLOW_M)
#define AUXADC_FIXED_REF_VOLTAGE_NORMAL   4300000
#define AUXADC_FIXED_REF_VOLTAGE_UNSCALED   1478500
#define AUXADC_REF_FIXED   (0 << ADI_4_AUX_ADCREF0_SRC_S)
#define AUXADC_REF_VDDS_REL   (1 << ADI_4_AUX_ADCREF0_SRC_S)
#define AUXADC_SAMPLE_TIME_10P6_US   5
#define AUXADC_SAMPLE_TIME_10P9_MS   15
#define AUXADC_SAMPLE_TIME_170_US   9
#define AUXADC_SAMPLE_TIME_1P37_MS   12
#define AUXADC_SAMPLE_TIME_21P3_US   6
#define AUXADC_SAMPLE_TIME_2P73_MS   13
#define AUXADC_SAMPLE_TIME_2P7_US   3
#define AUXADC_SAMPLE_TIME_341_US   10
#define AUXADC_SAMPLE_TIME_42P6_US   7
#define AUXADC_SAMPLE_TIME_5P3_US   4
#define AUXADC_SAMPLE_TIME_5P46_MS   14
#define AUXADC_SAMPLE_TIME_682_US   11
#define AUXADC_SAMPLE_TIME_85P3_US   8
#define AUXADC_TRIGGER_GPT0A   (EVENT_AUXSEL0_EV_GPT0A)
#define AUXADC_TRIGGER_GPT0A_CMP   (EVENT_AUXSEL0_EV_GPT0A_CMP)
#define AUXADC_TRIGGER_GPT0B   (EVENT_AUXSEL0_EV_GPT0B)
#define AUXADC_TRIGGER_GPT0B_CMP   (EVENT_AUXSEL0_EV_GPT0B_CMP)
#define AUXADC_TRIGGER_GPT1A   (EVENT_AUXSEL0_EV_GPT1A)
#define AUXADC_TRIGGER_GPT1A_CMP   (EVENT_AUXSEL0_EV_GPT1A_CMP)
#define AUXADC_TRIGGER_GPT1B   (EVENT_AUXSEL0_EV_GPT1B)
#define AUXADC_TRIGGER_GPT1B_CMP   (EVENT_AUXSEL0_EV_GPT1B_CMP)
#define AUXADC_TRIGGER_GPT2A   (EVENT_AUXSEL0_EV_GPT2A)
#define AUXADC_TRIGGER_GPT2A_CMP   (EVENT_AUXSEL0_EV_GPT2A_CMP)
#define AUXADC_TRIGGER_GPT2B   (EVENT_AUXSEL0_EV_GPT2B)
#define AUXADC_TRIGGER_GPT2B_CMP   (EVENT_AUXSEL0_EV_GPT2B_CMP)
#define AUXADC_TRIGGER_GPT3A   (EVENT_AUXSEL0_EV_GPT3A)
#define AUXADC_TRIGGER_GPT3A_CMP   (EVENT_AUXSEL0_EV_GPT3A_CMP)
#define AUXADC_TRIGGER_GPT3B   (EVENT_AUXSEL0_EV_GPT3B)
#define AUXADC_TRIGGER_GPT3B_CMP   (EVENT_AUXSEL0_EV_GPT3B_CMP)
#define AUXADC_TRIGGER_MANUAL   (EVENT_AUXSEL0_EV_NONE)