SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
Analog-to-digital Converter (ADC)

See Quickstart guide for SAM ADC driver. More...

Topics

 Legacy ADC group alias

Macros

#define ADC_WPMR_WPKEY_PASSWD   ADC_WPMR_WPKEY(0x414443u)

Functions

void adc_check (Adc *p_adc, const uint32_t ul_mck)
 Check ADC configurations.
void adc_configure_power_save (Adc *p_adc, const uint8_t uc_sleep, const uint8_t uc_fwup)
 Configures ADC power saving mode.
void adc_configure_sequence (Adc *p_adc, const enum adc_channel_num_t ch_list[], uint8_t uc_num)
 Configure conversion sequence.
void adc_configure_timing (Adc *p_adc, const uint8_t uc_tracking, const enum adc_settling_time_t settling, const uint8_t uc_transfer)
 Configure ADC timing.
void adc_configure_trigger (Adc *p_adc, const enum adc_trigger_t trigger, uint8_t uc_freerun)
 Configure conversion trigger and free run mode.
void adc_disable_all_channel (Adc *p_adc)
 Disable all ADC channel.
void adc_disable_anch (Adc *p_adc)
 Disable analog change.
void adc_disable_channel (Adc *p_adc, const enum adc_channel_num_t adc_ch)
 Disable the specified ADC channel.
void adc_disable_channel_differential_input (Adc *p_adc, const enum adc_channel_num_t channel)
 Disable differential input for the specified channel.
void adc_disable_channel_input_offset (Adc *p_adc, const enum adc_channel_num_t channel)
 Disable analog signal offset for the specified channel.
void adc_disable_interrupt (Adc *p_adc, const uint32_t ul_source)
 Disable ADC interrupts.
void adc_disable_tag (Adc *p_adc)
 Disable TAG option.
void adc_disable_ts (Adc *p_adc)
 Turn off temperature sensor.
void adc_enable_all_channel (Adc *p_adc)
 Enable all ADC channels.
void adc_enable_anch (Adc *p_adc)
 Enable analog change.
void adc_enable_channel (Adc *p_adc, const enum adc_channel_num_t adc_ch)
 Enable the specified ADC channel.
void adc_enable_channel_differential_input (Adc *p_adc, const enum adc_channel_num_t channel)
 Enable differential input for the specified channel.
void adc_enable_channel_input_offset (Adc *p_adc, const enum adc_channel_num_t channel)
 Enable analog signal offset for the specified channel.
void adc_enable_interrupt (Adc *p_adc, const uint32_t ul_source)
 Enable ADC interrupts.
void adc_enable_tag (Adc *p_adc)
 Enable TAG option so that the number of the last converted channel can be indicated.
void adc_enable_ts (Adc *p_adc)
 Turn on temperature sensor.
uint32_t adc_get_actual_adc_clock (const Adc *p_adc, const uint32_t ul_mck)
 Return the actual ADC clock.
uint32_t adc_get_channel_status (const Adc *p_adc, const enum adc_channel_num_t adc_ch)
 Read the ADC channel status.
uint32_t adc_get_channel_value (const Adc *p_adc, const enum adc_channel_num_t adc_ch)
 Read the ADC result data of the specified channel.
uint32_t adc_get_comparison_mode (const Adc *p_adc)
 Get comparison mode.
uint32_t adc_get_interrupt_mask (const Adc *p_adc)
 Read ADC interrupt mask.
uint32_t adc_get_latest_value (const Adc *p_adc)
 Read the last ADC result data.
uint32_t adc_get_overrun_status (const Adc *p_adc)
 Get ADC interrupt and overrun error status.
Pdc * adc_get_pdc_base (const Adc *p_adc)
 Get PDC registers base address.
uint32_t adc_get_status (const Adc *p_adc)
 Get ADC interrupt and overrun error status.
enum adc_channel_num_t adc_get_tag (const Adc *p_adc)
 Indicate the last converted channel.
uint32_t adc_get_writeprotect_status (const Adc *p_adc)
 Indicate write protect status.
uint32_t adc_init (Adc *p_adc, const uint32_t ul_mck, const uint32_t ul_adc_clock, const enum adc_startup_time startup)
 Initialize the given ADC with the specified ADC clock and startup time.
void adc_reset (Adc *p_adc)
 Reset ADC.
void adc_set_bias_current (Adc *p_adc, const uint8_t uc_ibctl)
 Adapt performance versus power consumption.
void adc_set_calibmode (Adc *p_adc)
 Set ADC auto calibration mode.
void adc_set_channel_input_gain (Adc *p_adc, const enum adc_channel_num_t channel, const enum adc_gainvalue_t gain)
 Configure input gain for the specified channel.
void adc_set_comparison_channel (Adc *p_adc, const enum adc_channel_num_t channel)
 Configure comparison selected channel.
void adc_set_comparison_mode (Adc *p_adc, const uint8_t uc_mode)
 Configure comparison mode.
void adc_set_comparison_window (Adc *p_adc, const uint16_t us_low_threshold, const uint16_t us_high_threshold)
 Configure ADC compare window.
void adc_set_resolution (Adc *p_adc, const enum adc_resolution_t resolution)
 Configure the conversion resolution.
void adc_set_writeprotect (Adc *p_adc, const uint32_t ul_enable)
 Enable or disable write protection of ADC registers.
void adc_start (Adc *p_adc)
 Start analog-to-digital conversion.
void adc_start_sequencer (Adc *p_adc)
 Enable conversion sequencer.
void adc_stop_sequencer (Adc *p_adc)
 Disable conversion sequencer.
static uint32_t calcul_startup (const uint32_t ul_startup)
 calcul_startup

Detailed Description

See Quickstart guide for SAM ADC driver.

Driver for the Analog-to-digital Converter. This driver provides access to the main features of the ADC controller.

Macro Definition Documentation

◆ ADC_WPMR_WPKEY_PASSWD

#define ADC_WPMR_WPKEY_PASSWD   ADC_WPMR_WPKEY(0x414443u)

Definition at line 756 of file adc.c.

Referenced by adc_set_writeprotect().

Function Documentation

◆ adc_check()

void adc_check ( Adc * p_adc,
const uint32_t ul_mck )

Check ADC configurations.

Parameters
p_adcPointer to an ADC instance.
ul_mckMain clock of the device (in Hz).

Definition at line 838 of file adc.c.

839{
840 uint32_t ul_adcfreq;
841 uint32_t ul_prescal;
842 uint32_t ul_startup;
843
844 /* ADCClock = MCK / ( (PRESCAL+1) * 2 ) */
845 ul_prescal = ((p_adc->ADC_MR & ADC_MR_PRESCAL_Msk) >>
847 ul_adcfreq = ul_mck / ((ul_prescal + 1) * 2);
848 printf("ADC clock frequency = %d Hz\r\n", (int)ul_adcfreq);
849
850 if (ul_adcfreq < ADC_FREQ_MIN) {
851 printf("adc frequency too low (out of specification: %d Hz)\r\n",
852 (int)ADC_FREQ_MIN);
853 }
854 if (ul_adcfreq > ADC_FREQ_MAX) {
855 printf("adc frequency too high (out of specification: %d Hz)\r\n",
856 (int)ADC_FREQ_MAX);
857 }
858
859 ul_startup = ((p_adc->ADC_MR & ADC_MR_STARTUP_Msk) >>
861 if (!(p_adc->ADC_MR & ADC_MR_SLEEP_SLEEP)) {
862 /* 40ms */
863 if (ADC_STARTUP_NORM * ul_adcfreq / 1000000 >
864 calcul_startup(ul_startup)) {
865 printf("Startup time too small: %d, programmed: %d\r\n",
866 (int)(ADC_STARTUP_NORM * ul_adcfreq /
867 1000000),
868 (int)calcul_startup(ul_startup));
869 }
870 } else {
871 if (p_adc->ADC_MR & ADC_MR_FREERUN_ON) {
872 puts("FreeRun forbidden in sleep mode\r");
873 }
874#if !SAM4C && !SAM4CP && !SAM4CM
875 if (!(p_adc->ADC_MR & ADC_MR_FWUP_ON)) {
876 /* Sleep 40ms */
877 if (ADC_STARTUP_NORM * ul_adcfreq / 1000000 >
878 calcul_startup(ul_startup)) {
879 printf("Startup time too small: %d, programmed: %d\r\n",
880 (int)(ADC_STARTUP_NORM * ul_adcfreq / 1000000),
881 (int)(calcul_startup(ul_startup)));
882 }
883 } else {
884 if (p_adc->ADC_MR & ADC_MR_FWUP_ON) {
885 /* Fast Wake Up Sleep Mode: 12ms */
886 if (ADC_STARTUP_FAST * ul_adcfreq / 1000000 >
887 calcul_startup(ul_startup)) {
888 printf("Startup time too small: %d, programmed: %d\r\n",
889 (int)(ADC_STARTUP_NORM * ul_adcfreq / 1000000),
890 (int)(calcul_startup(ul_startup)));
891 }
892 }
893 }
894#endif
895 }
896}
#define ADC_STARTUP_NORM
Definition adc.h:59
#define ADC_FREQ_MIN
Definition adc.h:57
#define ADC_STARTUP_FAST
Definition adc.h:61
#define ADC_FREQ_MAX
Definition adc.h:52
#define ADC_MR_STARTUP_Msk
(ADC_MR) Start Up Time
#define ADC_MR_STARTUP_Pos
#define ADC_MR_SLEEP_SLEEP
(ADC_MR) Sleep Mode: The wake-up time can be modified by programming FWUP bit
#define ADC_MR_FREERUN_ON
(ADC_MR) Free Run Mode: Never wait for any trigger.
#define ADC_MR_FWUP_ON
(ADC_MR) If SLEEP is 1 then Fast Wake-up Sleep Mode: The Voltage reference is ON between conversions ...
#define ADC_MR_PRESCAL_Pos
#define ADC_MR_PRESCAL_Msk
(ADC_MR) Prescaler Rate Selection
static uint32_t calcul_startup(const uint32_t ul_startup)
calcul_startup
Definition adc.c:792
__IO uint32_t ADC_MR
(Adc Offset: 0x04) Mode Register

References ADC_FREQ_MAX, ADC_FREQ_MIN, Adc::ADC_MR, ADC_MR_FREERUN_ON, ADC_MR_FWUP_ON, ADC_MR_PRESCAL_Msk, ADC_MR_PRESCAL_Pos, ADC_MR_SLEEP_SLEEP, ADC_MR_STARTUP_Msk, ADC_MR_STARTUP_Pos, ADC_STARTUP_FAST, ADC_STARTUP_NORM, and calcul_startup().

◆ adc_configure_power_save()

void adc_configure_power_save ( Adc * p_adc,
const uint8_t uc_sleep,
const uint8_t uc_fwup )

Configures ADC power saving mode.

Parameters
p_adcPointer to an ADC instance.
uc_sleepADC_MR_SLEEP_NORMAL keeps the ADC Core and reference voltage circuitry ON between conversions. ADC_MR_SLEEP_SLEEP keeps the ADC Core and reference voltage circuitry OFF between conversions.
uc_fwupADC_MR_FWUP_OFF configures sleep mode as uc_sleep setting, ADC_MR_FWUP_ON keeps voltage reference ON and ADC Core OFF between conversions.

Definition at line 198 of file adc.c.

199{
200 p_adc->ADC_MR |= (((uc_sleep << 5) & ADC_MR_SLEEP) |
201 ((uc_fwup << 6) & ADC_MR_FWUP));
202}
#define ADC_MR_SLEEP
(ADC_MR) Sleep Mode
#define ADC_MR_FWUP
(ADC_MR) Fast Wake Up

References Adc::ADC_MR, ADC_MR_FWUP, and ADC_MR_SLEEP.

◆ adc_configure_sequence()

void adc_configure_sequence ( Adc * p_adc,
const enum adc_channel_num_t ch_list[],
uint8_t uc_num )

Configure conversion sequence.

Parameters
p_adcPointer to an ADC instance.
ch_listChannel sequence list.
uc_numNumber of channels in the list.

Definition at line 228 of file adc.c.

230{
231 uint8_t uc_counter;
232 volatile uint32_t *adc_seqr = &p_adc->ADC_SEQR1;
233
234 if (uc_num <= 8) {
235 for (uc_counter = 0; uc_counter < uc_num; uc_counter++) {
236 adc_seqr[0] |=
237 ch_list[uc_counter] << (4 * uc_counter);
238 }
239 } else {
240 for (uc_counter = 0; uc_counter < 8; uc_counter++) {
241 adc_seqr[0] |=
242 ch_list[uc_counter] << (4 * uc_counter);
243 }
244 for (uc_counter = 0; uc_counter < uc_num - 8; uc_counter++) {
245 adc_seqr[1] |=
246 ch_list[8 + uc_counter] << (4 * uc_counter);
247 }
248 }
249}
__IO uint32_t ADC_SEQR1
(Adc Offset: 0x08) Channel Sequence Register 1

References Adc::ADC_SEQR1.

◆ adc_configure_timing()

void adc_configure_timing ( Adc * p_adc,
const uint8_t uc_tracking,
const enum adc_settling_time_t settling,
const uint8_t uc_transfer )

Configure ADC timing.

Parameters
p_adcPointer to an ADC instance.
uc_trackingADC tracking time = uc_tracking / ADC clock.
settlingAnalog settling time = (settling + 1) / ADC clock.
uc_transferData transfer time = (uc_transfer * 2 + 3) / ADC clock.

Definition at line 261 of file adc.c.

263{
264 p_adc->ADC_MR |= ADC_MR_TRANSFER(uc_transfer)
265 | settling | ADC_MR_TRACKTIM(uc_tracking);
266}
#define ADC_MR_TRACKTIM(value)
#define ADC_MR_TRANSFER(value)

References Adc::ADC_MR, ADC_MR_TRACKTIM, and ADC_MR_TRANSFER.

◆ adc_configure_trigger()

void adc_configure_trigger ( Adc * p_adc,
const enum adc_trigger_t trigger,
uint8_t uc_freerun )

Configure conversion trigger and free run mode.

Parameters
p_adcPointer to an ADC instance.
triggerConversion trigger.
uc_freerunADC_MR_FREERUN_ON enables freerun mode, ADC_MR_FREERUN_OFF disables freerun mode.

Definition at line 168 of file adc.c.

170{
171 p_adc->ADC_MR |= trigger | ((uc_freerun << 7) & ADC_MR_FREERUN);
172}
#define ADC_MR_FREERUN
(ADC_MR) Free Run Mode

References Adc::ADC_MR, and ADC_MR_FREERUN.

◆ adc_disable_all_channel()

void adc_disable_all_channel ( Adc * p_adc)

Disable all ADC channel.

Parameters
p_adcPointer to an ADC instance.

Definition at line 382 of file adc.c.

383{
384#if SAM3S || SAM4S || SAM3N || SAM3XA
385 p_adc->ADC_CHDR = 0xFFFF;
386#elif SAM3U || SAM4C || SAM4CP || SAM4CM
387 p_adc->ADC_CHDR = 0xFF;
388#endif
389}
__O uint32_t ADC_CHDR
(Adc Offset: 0x14) Channel Disable Register

References Adc::ADC_CHDR.

◆ adc_disable_anch()

void adc_disable_anch ( Adc * p_adc)

Disable analog change.

Note
DIFF0, GAIN0 and OFF0 are used for all channels.
Parameters
p_adcPointer to an ADC instance.

Definition at line 311 of file adc.c.

312{
313 p_adc->ADC_MR &= ~ADC_MR_ANACH;
314}
#define ADC_MR_ANACH
(ADC_MR) Analog Change

References Adc::ADC_MR, and ADC_MR_ANACH.

◆ adc_disable_channel()

void adc_disable_channel ( Adc * p_adc,
const enum adc_channel_num_t adc_ch )

Disable the specified ADC channel.

Parameters
p_adcPointer to an ADC instance.
adc_chADC channel number.

Definition at line 372 of file adc.c.

373{
374 p_adc->ADC_CHDR = 1 << adc_ch;
375}

References Adc::ADC_CHDR.

◆ adc_disable_channel_differential_input()

void adc_disable_channel_differential_input ( Adc * p_adc,
const enum adc_channel_num_t channel )

Disable differential input for the specified channel.

Parameters
p_adcPointer to an ADC instance.
channelADC channel number.

Definition at line 568 of file adc.c.

569{
570 uint32_t ul_temp;
571 ul_temp = p_adc->ADC_COR;
572 p_adc->ADC_COR &= 0xfffeffffu << channel;
573 p_adc->ADC_COR |= ul_temp;
574}
__IO uint32_t ADC_COR
(Adc Offset: 0x4C) Channel Offset Register

References Adc::ADC_COR.

◆ adc_disable_channel_input_offset()

void adc_disable_channel_input_offset ( Adc * p_adc,
const enum adc_channel_num_t channel )

Disable analog signal offset for the specified channel.

Parameters
p_adcPointer to an ADC instance.
channelADC channel number.

Definition at line 593 of file adc.c.

594{
595 uint32_t ul_temp;
596 ul_temp = p_adc->ADC_COR;
597 p_adc->ADC_COR &= (0xfffffffeu << channel);
598 p_adc->ADC_COR |= ul_temp;
599}

References Adc::ADC_COR.

◆ adc_disable_interrupt()

void adc_disable_interrupt ( Adc * p_adc,
const uint32_t ul_source )

Disable ADC interrupts.

Parameters
p_adcPointer to an ADC instance.
ul_sourceInterrupts to be disabled.

Definition at line 663 of file adc.c.

664{
665 p_adc->ADC_IDR = ul_source;
666}
__O uint32_t ADC_IDR
(Adc Offset: 0x28) Interrupt Disable Register

References Adc::ADC_IDR.

◆ adc_disable_tag()

void adc_disable_tag ( Adc * p_adc)

Disable TAG option.

Parameters
p_adcPointer to an ADC instance.

Definition at line 453 of file adc.c.

454{
455 p_adc->ADC_EMR &= ~ADC_EMR_TAG;
456}
#define ADC_EMR_TAG
(ADC_EMR) TAG of the ADC_LDCR register
__IO uint32_t ADC_EMR
(Adc Offset: 0x40) Extended Mode Register

References Adc::ADC_EMR, and ADC_EMR_TAG.

◆ adc_disable_ts()

void adc_disable_ts ( Adc * p_adc)

Turn off temperature sensor.

Parameters
p_adcPointer to an ADC instance.

Definition at line 748 of file adc.c.

749{
750 p_adc->ADC_ACR &= ~ADC_ACR_TSON;
751}
#define ADC_ACR_TSON
(ADC_ACR) Temperature Sensor On
__IO uint32_t ADC_ACR
(Adc Offset: 0x94) Analog Control Register

References Adc::ADC_ACR, and ADC_ACR_TSON.

◆ adc_enable_all_channel()

void adc_enable_all_channel ( Adc * p_adc)

Enable all ADC channels.

Parameters
p_adcPointer to an ADC instance.

Definition at line 357 of file adc.c.

358{
359#if SAM3S || SAM4S || SAM3N || SAM3XA
360 p_adc->ADC_CHER = 0xFFFF;
361#elif SAM3U || SAM4C || SAM4CP || SAM4CM
362 p_adc->ADC_CHER = 0xFF;
363#endif
364}
__O uint32_t ADC_CHER
(Adc Offset: 0x10) Channel Enable Register

References Adc::ADC_CHER.

◆ adc_enable_anch()

void adc_enable_anch ( Adc * p_adc)

Enable analog change.

Note
It allows different analog settings for each channel.
Parameters
p_adcPointer to an ADC instance.

Definition at line 299 of file adc.c.

300{
301 p_adc->ADC_MR |= ADC_MR_ANACH;
302}

References Adc::ADC_MR, and ADC_MR_ANACH.

◆ adc_enable_channel()

void adc_enable_channel ( Adc * p_adc,
const enum adc_channel_num_t adc_ch )

Enable the specified ADC channel.

Parameters
p_adcPointer to an ADC instance.
adc_chADC channel number.

Definition at line 347 of file adc.c.

348{
349 p_adc->ADC_CHER = 1 << adc_ch;
350}

References Adc::ADC_CHER.

◆ adc_enable_channel_differential_input()

void adc_enable_channel_differential_input ( Adc * p_adc,
const enum adc_channel_num_t channel )

Enable differential input for the specified channel.

Parameters
p_adcPointer to an ADC instance.
channelADC channel number.

Definition at line 557 of file adc.c.

558{
559 p_adc->ADC_COR |= 0x01u << (16 + channel);
560}

References Adc::ADC_COR.

◆ adc_enable_channel_input_offset()

void adc_enable_channel_input_offset ( Adc * p_adc,
const enum adc_channel_num_t channel )

Enable analog signal offset for the specified channel.

Parameters
p_adcPointer to an ADC instance.
channelADC channel number.

Definition at line 582 of file adc.c.

583{
584 p_adc->ADC_COR |= 0x01u << channel;
585}

References Adc::ADC_COR.

◆ adc_enable_interrupt()

void adc_enable_interrupt ( Adc * p_adc,
const uint32_t ul_source )

Enable ADC interrupts.

Parameters
p_adcPointer to an ADC instance.
ul_sourceInterrupts to be enabled.

Definition at line 652 of file adc.c.

653{
654 p_adc->ADC_IER = ul_source;
655}
__O uint32_t ADC_IER
(Adc Offset: 0x24) Interrupt Enable Register

References Adc::ADC_IER.

◆ adc_enable_tag()

void adc_enable_tag ( Adc * p_adc)

Enable TAG option so that the number of the last converted channel can be indicated.

Parameters
p_adcPointer to an ADC instance.

Definition at line 443 of file adc.c.

444{
445 p_adc->ADC_EMR |= ADC_EMR_TAG;
446}

References Adc::ADC_EMR, and ADC_EMR_TAG.

◆ adc_enable_ts()

void adc_enable_ts ( Adc * p_adc)

Turn on temperature sensor.

Parameters
p_adcPointer to an ADC instance.

Definition at line 738 of file adc.c.

739{
740 p_adc->ADC_ACR |= ADC_ACR_TSON;
741}

References Adc::ADC_ACR, and ADC_ACR_TSON.

◆ adc_get_actual_adc_clock()

uint32_t adc_get_actual_adc_clock ( const Adc * p_adc,
const uint32_t ul_mck )

Return the actual ADC clock.

Parameters
p_adcPointer to an ADC instance.
ul_mckMain clock of the device (in Hz).
Returns
The actual ADC clock (in Hz).

Definition at line 635 of file adc.c.

636{
637 uint32_t ul_adcfreq;
638 uint32_t ul_prescal;
639
640 /* ADCClock = MCK / ( (PRESCAL+1) * 2 ) */
641 ul_prescal = ((p_adc->ADC_MR & ADC_MR_PRESCAL_Msk) >> ADC_MR_PRESCAL_Pos);
642 ul_adcfreq = ul_mck / ((ul_prescal + 1) * 2);
643 return ul_adcfreq;
644}

References Adc::ADC_MR, ADC_MR_PRESCAL_Msk, and ADC_MR_PRESCAL_Pos.

◆ adc_get_channel_status()

uint32_t adc_get_channel_status ( const Adc * p_adc,
const enum adc_channel_num_t adc_ch )

Read the ADC channel status.

Parameters
p_adcPointer to an ADC instance.
adc_chADC channel number.
Return values
1if channel is enabled.
0if channel is disabled.

Definition at line 400 of file adc.c.

401{
402 return p_adc->ADC_CHSR & (1 << adc_ch);
403}
__I uint32_t ADC_CHSR
(Adc Offset: 0x18) Channel Status Register

References Adc::ADC_CHSR.

◆ adc_get_channel_value()

uint32_t adc_get_channel_value ( const Adc * p_adc,
const enum adc_channel_num_t adc_ch )

Read the ADC result data of the specified channel.

Parameters
p_adcPointer to an ADC instance.
adc_chADC channel number.
Returns
ADC value of the specified channel.

Definition at line 413 of file adc.c.

414{
415 uint32_t ul_data = 0;
416
417 if (15 >= adc_ch) {
418 ul_data = *(p_adc->ADC_CDR + adc_ch);
419 }
420
421 return ul_data;
422}
__I uint32_t ADC_CDR[16]
(Adc Offset: 0x50) Channel Data Register

References Adc::ADC_CDR.

◆ adc_get_comparison_mode()

uint32_t adc_get_comparison_mode ( const Adc * p_adc)

Get comparison mode.

Parameters
p_adcPointer to an ADC instance.
Return values
Comparemode value.

Definition at line 513 of file adc.c.

514{
515 return p_adc->ADC_EMR & ADC_EMR_CMPMODE_Msk;
516}
#define ADC_EMR_CMPMODE_Msk
(ADC_EMR) Comparison Mode

References Adc::ADC_EMR, and ADC_EMR_CMPMODE_Msk.

◆ adc_get_interrupt_mask()

uint32_t adc_get_interrupt_mask ( const Adc * p_adc)

Read ADC interrupt mask.

Parameters
p_adcPointer to an ADC instance.
Returns
The interrupt mask value.

Definition at line 713 of file adc.c.

714{
715 return p_adc->ADC_IMR;
716}
__I uint32_t ADC_IMR
(Adc Offset: 0x2C) Interrupt Mask Register

References Adc::ADC_IMR.

◆ adc_get_latest_value()

uint32_t adc_get_latest_value ( const Adc * p_adc)

Read the last ADC result data.

Parameters
p_adcPointer to an ADC instance.
Returns
ADC latest value.

Definition at line 431 of file adc.c.

432{
433 return p_adc->ADC_LCDR;
434}
__I uint32_t ADC_LCDR
(Adc Offset: 0x20) Last Converted Data Register

References Adc::ADC_LCDR.

◆ adc_get_overrun_status()

uint32_t adc_get_overrun_status ( const Adc * p_adc)

Get ADC interrupt and overrun error status.

Parameters
p_adcPointer to an ADC instance.
Returns
ADC status structure.

Definition at line 688 of file adc.c.

689{
690 return p_adc->ADC_OVER;
691}
__I uint32_t ADC_OVER
(Adc Offset: 0x3C) Overrun Status Register

References Adc::ADC_OVER.

◆ adc_get_pdc_base()

Pdc * adc_get_pdc_base ( const Adc * p_adc)

Get PDC registers base address.

Parameters
p_adcPointer to an ADC instance.
Returns
ADC PDC register base address.

Definition at line 906 of file adc.c.

907{
908 UNUSED(p_adc);
909 return PDC_ADC;
910}
#define PDC_ADC
(PDC_ADC ) Base Address
Definition sam4sd32c.h:431

References PDC_ADC.

◆ adc_get_status()

uint32_t adc_get_status ( const Adc * p_adc)

Get ADC interrupt and overrun error status.

Parameters
p_adcPointer to an ADC instance.
Returns
ADC status structure.

Definition at line 676 of file adc.c.

677{
678 return p_adc->ADC_ISR;
679}
__I uint32_t ADC_ISR
(Adc Offset: 0x30) Interrupt Status Register

References Adc::ADC_ISR.

◆ adc_get_tag()

enum adc_channel_num_t adc_get_tag ( const Adc * p_adc)

Indicate the last converted channel.

Note
If TAG option is NOT enabled before, an incorrect channel number is returned.
Parameters
p_adcPointer to an ADC instance.
Returns
The last converted channel number.

Definition at line 468 of file adc.c.

469{
470 return (enum adc_channel_num_t)
472}
adc_channel_num_t
Definition adc.h:141
#define ADC_LCDR_CHNB_Msk
(ADC_LCDR) Channel Number
#define ADC_LCDR_CHNB_Pos

References Adc::ADC_LCDR, ADC_LCDR_CHNB_Msk, and ADC_LCDR_CHNB_Pos.

◆ adc_get_writeprotect_status()

uint32_t adc_get_writeprotect_status ( const Adc * p_adc)

Indicate write protect status.

Parameters
p_adcPointer to an ADC instance.
Returns
0 if no write protect violation occurred, or 16-bit write protect violation source.

Definition at line 777 of file adc.c.

778{
779 uint32_t reg_value;
780
781 reg_value = p_adc->ADC_WPSR;
782 if (reg_value & ADC_WPSR_WPVS) {
783 return (reg_value & ADC_WPSR_WPVSRC_Msk) >> ADC_WPSR_WPVSRC_Pos;
784 } else {
785 return 0;
786 }
787}
#define ADC_WPSR_WPVSRC_Pos
#define ADC_WPSR_WPVSRC_Msk
(ADC_WPSR) Write Protect Violation Source
#define ADC_WPSR_WPVS
(ADC_WPSR) Write Protect Violation Status
__I uint32_t ADC_WPSR
(Adc Offset: 0xE8) Write Protect Status Register

References Adc::ADC_WPSR, ADC_WPSR_WPVS, ADC_WPSR_WPVSRC_Msk, and ADC_WPSR_WPVSRC_Pos.

◆ adc_init()

uint32_t adc_init ( Adc * p_adc,
const uint32_t ul_mck,
const uint32_t ul_adc_clock,
const enum adc_startup_time startup )

Initialize the given ADC with the specified ADC clock and startup time.

Parameters
p_adcPointer to an ADC instance.
ul_mckMain clock of the device (value in Hz).
ul_adc_clockAnalog-to-Digital conversion clock (value in Hz).
startupADC start up time. Please refer to the product datasheet for details.
Returns
0 on success.

Definition at line 70 of file adc.c.

72{
73 uint32_t ul_prescal;
74
75 /* Reset the controller. */
76 p_adc->ADC_CR = ADC_CR_SWRST;
77
78 /* Reset Mode Register. */
79 p_adc->ADC_MR = 0;
80
81 /* Reset PDC transfer. */
83 p_adc->ADC_RCR = 0;
84 p_adc->ADC_RNCR = 0;
85
86 ul_prescal = ul_mck / (2 * ul_adc_clock) - 1;
87 p_adc->ADC_MR |= ADC_MR_PRESCAL(ul_prescal) | startup;
88 return 0;
89}
#define ADC_MR_PRESCAL(value)
#define ADC_CR_SWRST
(ADC_CR) Software Reset
#define ADC_PTCR_TXTDIS
(ADC_PTCR) Transmitter Transfer Disable
#define ADC_PTCR_RXTDIS
(ADC_PTCR) Receiver Transfer Disable
__O uint32_t ADC_PTCR
(Adc Offset: 0x120) Transfer Control Register
__IO uint32_t ADC_RCR
(Adc Offset: 0x104) Receive Counter Register
__O uint32_t ADC_CR
(Adc Offset: 0x00) Control Register
__IO uint32_t ADC_RNCR
(Adc Offset: 0x114) Receive Next Counter Register

References Adc::ADC_CR, ADC_CR_SWRST, Adc::ADC_MR, ADC_MR_PRESCAL, Adc::ADC_PTCR, ADC_PTCR_RXTDIS, ADC_PTCR_TXTDIS, Adc::ADC_RCR, and Adc::ADC_RNCR.

◆ adc_reset()

void adc_reset ( Adc * p_adc)

Reset ADC.

Parameters
p_adcPointer to an ADC instance.

Definition at line 336 of file adc.c.

337{
338 p_adc->ADC_CR = ADC_CR_SWRST;
339}

References Adc::ADC_CR, and ADC_CR_SWRST.

◆ adc_set_bias_current()

void adc_set_bias_current ( Adc * p_adc,
const uint8_t uc_ibctl )

Adapt performance versus power consumption.

Note
Please refer to ADC Characteristics in the product datasheet for more details.
Parameters
p_adcPointer to an ADC instance.
uc_ibctlADC Bias current control.

Definition at line 728 of file adc.c.

729{
730 p_adc->ADC_ACR |= ADC_ACR_IBCTL(uc_ibctl);
731}
#define ADC_ACR_IBCTL(value)

References Adc::ADC_ACR, and ADC_ACR_IBCTL.

◆ adc_set_calibmode()

void adc_set_calibmode ( Adc * p_adc)

Set ADC auto calibration mode.

Parameters
p_adcPointer to an ADC instance.

Definition at line 621 of file adc.c.

622{
623 p_adc->ADC_CR |= ADC_CR_AUTOCAL;
624}
#define ADC_CR_AUTOCAL
(ADC_CR) Automatic Calibration of ADC

References Adc::ADC_CR, and ADC_CR_AUTOCAL.

◆ adc_set_channel_input_gain()

void adc_set_channel_input_gain ( Adc * p_adc,
const enum adc_channel_num_t channel,
const enum adc_gainvalue_t gain )

Configure input gain for the specified channel.

Parameters
p_adcPointer to an ADC instance.
channelADC channel number.
gainGain value for the input.

Definition at line 608 of file adc.c.

610{
611 p_adc->ADC_CGR |= (0x03u << (2 * channel)) & (gain << (2 * channel));
612}
__IO uint32_t ADC_CGR
(Adc Offset: 0x48) Channel Gain Register

References Adc::ADC_CGR.

◆ adc_set_comparison_channel()

void adc_set_comparison_channel ( Adc * p_adc,
const enum adc_channel_num_t channel )

Configure comparison selected channel.

Parameters
p_adcPointer to an ADC instance.
channelADC channel number.

Definition at line 538 of file adc.c.

539{
540 if (channel < 16) {
541 p_adc->ADC_EMR &= (uint32_t) ~ (ADC_EMR_CMPALL);
542 p_adc->ADC_EMR &= (uint32_t) ~ (ADC_EMR_CMPSEL_Msk);
543 p_adc->ADC_EMR |= (channel << ADC_EMR_CMPSEL_Pos);
544 } else {
545 p_adc->ADC_EMR |= ADC_EMR_CMPALL;
546 }
547}
#define ADC_EMR_CMPSEL_Pos
#define ADC_EMR_CMPSEL_Msk
(ADC_EMR) Comparison Selected Channel
#define ADC_EMR_CMPALL
(ADC_EMR) Compare All Channels

References Adc::ADC_EMR, ADC_EMR_CMPALL, ADC_EMR_CMPSEL_Msk, and ADC_EMR_CMPSEL_Pos.

◆ adc_set_comparison_mode()

void adc_set_comparison_mode ( Adc * p_adc,
const uint8_t uc_mode )

Configure comparison mode.

Parameters
p_adcPointer to an ADC instance.
uc_modeADC comparison mode.

Definition at line 500 of file adc.c.

501{
502 p_adc->ADC_EMR &= (uint32_t) ~ (ADC_EMR_CMPMODE_Msk);
503 p_adc->ADC_EMR |= (uc_mode & ADC_EMR_CMPMODE_Msk);
504}

References Adc::ADC_EMR, and ADC_EMR_CMPMODE_Msk.

◆ adc_set_comparison_window()

void adc_set_comparison_window ( Adc * p_adc,
const uint16_t us_low_threshold,
const uint16_t us_high_threshold )

Configure ADC compare window.

Parameters
p_adcPointer to an ADC instance.
us_low_thresholdLow threshold of compare window.
us_high_thresholdHigh threshold of compare window.

Definition at line 525 of file adc.c.

527{
528 p_adc->ADC_CWR = ADC_CWR_LOWTHRES(us_low_threshold) |
529 ADC_CWR_HIGHTHRES(us_high_threshold);
530}
#define ADC_CWR_LOWTHRES(value)
#define ADC_CWR_HIGHTHRES(value)
__IO uint32_t ADC_CWR
(Adc Offset: 0x44) Compare Window Register

References Adc::ADC_CWR, ADC_CWR_HIGHTHRES, and ADC_CWR_LOWTHRES.

◆ adc_set_resolution()

void adc_set_resolution ( Adc * p_adc,
const enum adc_resolution_t resolution )

Configure the conversion resolution.

Parameters
p_adcPointer to an ADC instance.
resolutionADC resolution.

Definition at line 134 of file adc.c.

135{
136#if SAM4C || SAM4CP || SAM4CM
137 p_adc->ADC_EMR &= ~ADC_EMR_OSR_Msk;
138 switch (resolution) {
139 case ADC_8_BITS:
140 p_adc->ADC_MR |= ADC_MR_LOWRES;
141 break;
142 case ADC_10_BITS:
143 p_adc->ADC_MR &= ~ADC_MR_LOWRES;
144 break;
145 case ADC_11_BITS:
146 case ADC_12_BITS:
147 p_adc->ADC_MR &= ~ADC_MR_LOWRES;
148 p_adc->ADC_EMR |= resolution;
149 break;
150 }
151#else
152 p_adc->ADC_MR &= ~ADC_MR_LOWRES;
153 p_adc->ADC_MR |= resolution;
154#endif
155}
@ ADC_10_BITS
Definition adc.h:66
@ ADC_12_BITS
Definition adc.h:67
#define ADC_MR_LOWRES
(ADC_MR) Resolution

References ADC_10_BITS, ADC_12_BITS, Adc::ADC_EMR, Adc::ADC_MR, and ADC_MR_LOWRES.

◆ adc_set_writeprotect()

void adc_set_writeprotect ( Adc * p_adc,
const uint32_t ul_enable )

Enable or disable write protection of ADC registers.

Parameters
p_adcPointer to an ADC instance.
ul_enable1 to enable, 0 to disable.

Definition at line 764 of file adc.c.

765{
766 p_adc->ADC_WPMR = ADC_WPMR_WPKEY_PASSWD | (ul_enable & ADC_WPMR_WPEN);
767}
#define ADC_WPMR_WPEN
(ADC_WPMR) Write Protect Enable
#define ADC_WPMR_WPKEY_PASSWD
Definition adc.c:756
__IO uint32_t ADC_WPMR
(Adc Offset: 0xE4) Write Protect Mode Register

References Adc::ADC_WPMR, ADC_WPMR_WPEN, and ADC_WPMR_WPKEY_PASSWD.

◆ adc_start()

void adc_start ( Adc * p_adc)

Start analog-to-digital conversion.

Note
If one of the hardware event is selected as ADC trigger, this function can NOT start analog to digital conversion.
Parameters
p_adcPointer to an ADC instance.

Definition at line 326 of file adc.c.

327{
328 p_adc->ADC_CR = ADC_CR_START;
329}
#define ADC_CR_START
(ADC_CR) Start Conversion

References Adc::ADC_CR, and ADC_CR_START.

◆ adc_start_sequencer()

void adc_start_sequencer ( Adc * p_adc)

Enable conversion sequencer.

Parameters
p_adcPointer to an ADC instance.

Definition at line 479 of file adc.c.

480{
481 p_adc->ADC_MR |= ADC_MR_USEQ;
482}
#define ADC_MR_USEQ
(ADC_MR) Use Sequence Enable

References Adc::ADC_MR, and ADC_MR_USEQ.

◆ adc_stop_sequencer()

void adc_stop_sequencer ( Adc * p_adc)

Disable conversion sequencer.

Parameters
p_adcPointer to an ADC instance.

Definition at line 489 of file adc.c.

490{
491 p_adc->ADC_MR &= ~ADC_MR_USEQ;
492}

References Adc::ADC_MR, and ADC_MR_USEQ.

◆ calcul_startup()

uint32_t calcul_startup ( const uint32_t ul_startup)
static

calcul_startup

Definition at line 792 of file adc.c.

793{
794 uint32_t ul_startup_value = 0;
795
796 if (ul_startup == 0)
797 ul_startup_value = 0;
798 else if (ul_startup == 1)
799 ul_startup_value = 8;
800 else if (ul_startup == 2)
801 ul_startup_value = 16;
802 else if (ul_startup == 3)
803 ul_startup_value = 24;
804 else if (ul_startup == 4)
805 ul_startup_value = 64;
806 else if (ul_startup == 5)
807 ul_startup_value = 80;
808 else if (ul_startup == 6)
809 ul_startup_value = 96;
810 else if (ul_startup == 7)
811 ul_startup_value = 112;
812 else if (ul_startup == 8)
813 ul_startup_value = 512;
814 else if (ul_startup == 9)
815 ul_startup_value = 576;
816 else if (ul_startup == 10)
817 ul_startup_value = 640;
818 else if (ul_startup == 11)
819 ul_startup_value = 704;
820 else if (ul_startup == 12)
821 ul_startup_value = 768;
822 else if (ul_startup == 13)
823 ul_startup_value = 832;
824 else if (ul_startup == 14)
825 ul_startup_value = 896;
826 else if (ul_startup == 15)
827 ul_startup_value = 960;
828
829 return ul_startup_value;
830}

Referenced by adc_check().