SAM4SD32 (SAM4S-EK2)
Loading...
Searching...
No Matches
adc.c
Go to the documentation of this file.
1
33/*
34 * Support and FAQ: visit <a href="https://www.microchip.com/support/">Microchip Support</a>
35 */
36
37#include "adc.h"
38#include <status_codes.h>
40
41#ifdef __cplusplus
42extern "C" {
43#endif
46
57
58#if SAM3S || SAM4S || SAM3N || SAM3XA || SAM4C || SAM4CP || SAM4CM
70uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck,
71 const uint32_t ul_adc_clock, const enum adc_startup_time startup)
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}
90#elif SAM3U
104uint32_t adc_init(Adc *p_adc, const uint32_t ul_mck, const uint32_t ul_adc_clock,
105 const uint32_t ul_startuptime)
106{
107 uint32_t ul_prescal, ul_startup;
108 p_adc->ADC_CR = ADC_CR_SWRST;
109
110 /* Reset Mode Register. */
111 p_adc->ADC_MR = 0;
112
113 /* Reset PDC transfer. */
115 p_adc->ADC_RCR = 0;
116 p_adc->ADC_RNCR = 0;
117 ul_prescal = ul_mck / (2 * ul_adc_clock) - 1;
118 ul_startup = ((ul_adc_clock / 1000000) * ul_startuptime / 8) - 1;
119 p_adc->ADC_MR |= ADC_MR_PRESCAL(ul_prescal) |
120 ((ul_startup << ADC_MR_STARTUP_Pos) &
122 return 0;
123}
124
125#endif
126
134void adc_set_resolution(Adc *p_adc, const enum adc_resolution_t resolution)
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}
156
157
158#if SAM3S || SAM4S || SAM3N || SAM3XA || SAM4C || SAM4CP || SAM4CM
168void adc_configure_trigger(Adc *p_adc, const enum adc_trigger_t trigger,
169 uint8_t uc_freerun)
170{
171 p_adc->ADC_MR |= trigger | ((uc_freerun << 7) & ADC_MR_FREERUN);
172}
173#elif SAM3U
180void adc_configure_trigger(Adc *p_adc, const enum adc_trigger_t trigger)
181{
182 p_adc->ADC_MR |= trigger;
183}
184#endif
185
186#if SAM3S8 || SAM4S || SAM3N || SAM3SD8
198void adc_configure_power_save(Adc *p_adc, const uint8_t uc_sleep, const uint8_t uc_fwup)
199{
200 p_adc->ADC_MR |= (((uc_sleep << 5) & ADC_MR_SLEEP) |
201 ((uc_fwup << 6) & ADC_MR_FWUP));
202}
203#elif SAM3U || SAM4C || SAM4CP || SAM4CM
214void adc_configure_power_save(Adc *p_adc, const uint8_t uc_sleep)
215{
216 p_adc->ADC_MR |= ((uc_sleep << 5) & ADC_MR_SLEEP);
217}
218#endif
219
220#if SAM3S || SAM4S || SAM3N || SAM3XA || SAM4C || SAM4CP || SAM4CM
228void adc_configure_sequence(Adc *p_adc, const enum adc_channel_num_t ch_list[],
229 uint8_t uc_num)
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}
250#endif
251
252#if SAM3S || SAM4S || SAM3XA
261void adc_configure_timing(Adc *p_adc, const uint8_t uc_tracking,
262 const enum adc_settling_time_t settling,const uint8_t uc_transfer)
263{
264 p_adc->ADC_MR |= ADC_MR_TRANSFER(uc_transfer)
265 | settling | ADC_MR_TRACKTIM(uc_tracking);
266}
267#elif SAM3N || SAM4C || SAM4CP || SAM4CM
274void adc_configure_timing(Adc *p_adc, const uint8_t uc_tracking)
275{
276 p_adc->ADC_MR |= ADC_MR_TRACKTIM(uc_tracking);
277}
278#elif SAM3U
285void adc_configure_timing(Adc *p_adc, const uint32_t ul_sh)
286{
287 p_adc->ADC_MR |= ADC_MR_SHTIM(ul_sh);
288}
289#endif
290
291#if SAM3S || SAM4S || SAM3XA
300{
301 p_adc->ADC_MR |= ADC_MR_ANACH;
302}
303
312{
313 p_adc->ADC_MR &= ~ADC_MR_ANACH;
314}
315#endif
316
325
326void adc_start(Adc *p_adc)
327{
328 p_adc->ADC_CR = ADC_CR_START;
329}
330
336void adc_reset(Adc *p_adc)
337{
338 p_adc->ADC_CR = ADC_CR_SWRST;
339}
340
347void adc_enable_channel(Adc *p_adc, const enum adc_channel_num_t adc_ch)
348{
349 p_adc->ADC_CHER = 1 << adc_ch;
350}
351
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}
365
372void adc_disable_channel(Adc *p_adc, const enum adc_channel_num_t adc_ch)
373{
374 p_adc->ADC_CHDR = 1 << adc_ch;
375}
376
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}
390
400uint32_t adc_get_channel_status(const Adc *p_adc, const enum adc_channel_num_t adc_ch)
401{
402 return p_adc->ADC_CHSR & (1 << adc_ch);
403}
404
413uint32_t adc_get_channel_value(const Adc *p_adc, const enum adc_channel_num_t adc_ch)
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}
423
431uint32_t adc_get_latest_value(const Adc *p_adc)
432{
433 return p_adc->ADC_LCDR;
434}
435
436#if SAM3S || SAM4S || SAM3N || SAM3XA || SAM4C || SAM4CP || SAM4CM
443void adc_enable_tag(Adc *p_adc)
444{
445 p_adc->ADC_EMR |= ADC_EMR_TAG;
446}
447
454{
455 p_adc->ADC_EMR &= ~ADC_EMR_TAG;
456}
457
469{
470 return (enum adc_channel_num_t)
472}
473
480{
481 p_adc->ADC_MR |= ADC_MR_USEQ;
482}
483
490{
491 p_adc->ADC_MR &= ~ADC_MR_USEQ;
492}
493
500void adc_set_comparison_mode(Adc *p_adc, const uint8_t uc_mode)
501{
502 p_adc->ADC_EMR &= (uint32_t) ~ (ADC_EMR_CMPMODE_Msk);
503 p_adc->ADC_EMR |= (uc_mode & ADC_EMR_CMPMODE_Msk);
504}
505
513uint32_t adc_get_comparison_mode(const Adc *p_adc)
514{
515 return p_adc->ADC_EMR & ADC_EMR_CMPMODE_Msk;
516}
517
525void adc_set_comparison_window(Adc *p_adc, const uint16_t us_low_threshold,
526 const uint16_t us_high_threshold)
527{
528 p_adc->ADC_CWR = ADC_CWR_LOWTHRES(us_low_threshold) |
529 ADC_CWR_HIGHTHRES(us_high_threshold);
530}
531
538void adc_set_comparison_channel(Adc *p_adc, const enum adc_channel_num_t channel)
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}
548#endif
549
550#if SAM3S || SAM4S || SAM3XA
558{
559 p_adc->ADC_COR |= 0x01u << (16 + channel);
560}
561
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}
575
583{
584 p_adc->ADC_COR |= 0x01u << channel;
585}
586
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}
600
608void adc_set_channel_input_gain(Adc *p_adc, const enum adc_channel_num_t channel,
609 const enum adc_gainvalue_t gain)
610{
611 p_adc->ADC_CGR |= (0x03u << (2 * channel)) & (gain << (2 * channel));
612}
613#endif
614
615#if SAM3S8 || SAM3SD8 || SAM4S
622{
623 p_adc->ADC_CR |= ADC_CR_AUTOCAL;
624}
625#endif
626
635uint32_t adc_get_actual_adc_clock(const Adc *p_adc, const uint32_t ul_mck)
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}
645
652void adc_enable_interrupt(Adc *p_adc, const uint32_t ul_source)
653{
654 p_adc->ADC_IER = ul_source;
655}
656
663void adc_disable_interrupt(Adc *p_adc, const uint32_t ul_source)
664{
665 p_adc->ADC_IDR = ul_source;
666}
667
668#if SAM3S || SAM4S || SAM3N || SAM3XA || SAM4C || SAM4CP || SAM4CM
676uint32_t adc_get_status(const Adc *p_adc)
677{
678 return p_adc->ADC_ISR;
679}
680
688uint32_t adc_get_overrun_status(const Adc *p_adc)
689{
690 return p_adc->ADC_OVER;
691}
692#elif SAM3U
700uint32_t adc_get_status(const Adc *p_adc)
701{
702 return p_adc->ADC_SR;
703}
704#endif
705
713uint32_t adc_get_interrupt_mask(const Adc *p_adc)
714{
715 return p_adc->ADC_IMR;
716}
717
718#if SAM3S || SAM4S || SAM3XA
728void adc_set_bias_current(Adc *p_adc, const uint8_t uc_ibctl)
729{
730 p_adc->ADC_ACR |= ADC_ACR_IBCTL(uc_ibctl);
731}
732
738void adc_enable_ts(Adc *p_adc)
739{
740 p_adc->ADC_ACR |= ADC_ACR_TSON;
741}
742
748void adc_disable_ts(Adc *p_adc)
749{
750 p_adc->ADC_ACR &= ~ADC_ACR_TSON;
751}
752#endif
753
754#if SAM3S || SAM4S || SAM3N || SAM3XA || SAM4C || SAM4CP || SAM4CM
755#ifndef ADC_WPMR_WPKEY_PASSWD
756#define ADC_WPMR_WPKEY_PASSWD ADC_WPMR_WPKEY(0x414443u)
757#endif
764void adc_set_writeprotect(Adc *p_adc, const uint32_t ul_enable)
765{
766 p_adc->ADC_WPMR = ADC_WPMR_WPKEY_PASSWD | (ul_enable & ADC_WPMR_WPEN);
767}
768
777uint32_t adc_get_writeprotect_status(const Adc *p_adc)
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}
788
792static uint32_t calcul_startup(const uint32_t ul_startup)
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}
831
838void adc_check(Adc *p_adc, const uint32_t ul_mck)
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}
897#endif
898
906Pdc *adc_get_pdc_base(const Adc *p_adc)
907{
908 UNUSED(p_adc);
909 return PDC_ADC;
910}
911
912#if SAM4C || SAM4CP || SAM4CM
920void adc_set_averaging_trigger(Adc *p_adc, bool multi)
921{
922 if (multi) {
923 p_adc->ADC_EMR &= ~ADC_EMR_ASTE;
924 } else {
925 p_adc->ADC_EMR |= ADC_EMR_ASTE;
926 }
927}
928
936void adc_set_comparison_filter(Adc *p_adc, uint8_t filter)
937{
938 p_adc->ADC_EMR &= ~ADC_EMR_CMPFILTER_Msk;
939 p_adc->ADC_EMR |= ADC_EMR_CMPFILTER(filter);
940}
941
947void adc_enable_ts(Adc *p_adc)
948{
949 p_adc->ADC_TEMPMR |= ADC_TEMPMR_TEMPON;
950}
951
957void adc_disable_ts(Adc *p_adc)
958{
959 p_adc->ADC_TEMPMR &= ~ADC_TEMPMR_TEMPON;
960}
961
970void adc_configure_ts_comparison(Adc *p_adc, enum adc_temp_cmp_mode mode,
971 uint16_t low_threshold, uint16_t high_threshold)
972{
973 uint32_t tmp = p_adc->ADC_TEMPMR;
974 tmp &= ~ADC_TEMPMR_TEMPCMPMOD_Msk;
975 tmp |= mode;
976
977 p_adc->ADC_TEMPCWR = ADC_TEMPCWR_TLOWTHRES(low_threshold) |
978 ADC_TEMPCWR_THIGHTHRES(high_threshold);
979 p_adc->ADC_TEMPMR = tmp;
980}
981
990enum status_code adc_set_internal_reference_voltage(Adc *p_adc,
991 struct adc_internal_ref *ref)
992{
993 uint32_t tmp = 0;
994
995 if (ref->adc_force_internal_ref && ref->adc_internal_ref_on) {
996 return ERR_INVALID_ARG;
997 }
998 tmp = (ref->adc_internal_ref_change_enable ? ADC_ACR_IRVCE_SELECTION : 0) |
999 ADC_ACR_IRVS(ref->volt) |
1000 (ref->adc_force_internal_ref ? ADC_ACR_FORCEREF : 0) |
1001 (ref->adc_internal_ref_on ? ADC_ACR_ONREF : 0);
1002 p_adc->ADC_ACR = tmp;
1003 return STATUS_OK;
1004}
1005#endif
1006
1008
1010
1011#ifdef __cplusplus
1012}
1013#endif
Analog-to-Digital Converter (ADC/ADC12B) driver for SAM.
#define ADC_STARTUP_NORM
Definition adc.h:59
adc_gainvalue_t
Definition adc.h:178
adc_trigger_t
Definition adc.h:90
adc_channel_num_t
Definition adc.h:141
adc_settling_time_t
Definition adc.h:187
adc_startup_time
Definitions for ADC Start Up Time.
Definition adc.h:197
#define ADC_FREQ_MIN
Definition adc.h:57
#define ADC_STARTUP_FAST
Definition adc.h:61
#define ADC_FREQ_MAX
Definition adc.h:52
adc_resolution_t
Definition adc.h:65
@ ADC_10_BITS
Definition adc.h:66
@ ADC_12_BITS
Definition adc.h:67
#define ADC_CWR_LOWTHRES(value)
#define ADC_EMR_CMPSEL_Pos
#define ADC_CWR_HIGHTHRES(value)
#define ADC_MR_PRESCAL(value)
#define ADC_MR_FREERUN
(ADC_MR) Free Run Mode
#define ADC_MR_STARTUP_Msk
(ADC_MR) Start Up Time
#define ADC_CR_SWRST
(ADC_CR) Software Reset
#define ADC_MR_LOWRES
(ADC_MR) Resolution
#define ADC_MR_SLEEP
(ADC_MR) Sleep Mode
#define ADC_WPMR_WPEN
(ADC_WPMR) Write Protect Enable
#define ADC_CR_START
(ADC_CR) Start Conversion
#define ADC_PTCR_TXTDIS
(ADC_PTCR) Transmitter Transfer Disable
#define ADC_LCDR_CHNB_Msk
(ADC_LCDR) Channel Number
#define ADC_WPSR_WPVSRC_Pos
#define ADC_MR_STARTUP_Pos
#define ADC_EMR_CMPSEL_Msk
(ADC_EMR) Comparison Selected Channel
#define ADC_MR_USEQ
(ADC_MR) Use Sequence Enable
#define ADC_EMR_CMPALL
(ADC_EMR) Compare All Channels
#define ADC_LCDR_CHNB_Pos
#define ADC_WPSR_WPVSRC_Msk
(ADC_WPSR) Write Protect Violation Source
#define ADC_ACR_TSON
(ADC_ACR) Temperature Sensor On
#define ADC_CR_AUTOCAL
(ADC_CR) Automatic Calibration of ADC
#define ADC_MR_ANACH
(ADC_MR) Analog Change
#define ADC_MR_SLEEP_SLEEP
(ADC_MR) Sleep Mode: The wake-up time can be modified by programming FWUP bit
#define ADC_MR_TRACKTIM(value)
#define ADC_MR_TRANSFER(value)
#define ADC_EMR_TAG
(ADC_EMR) TAG of the ADC_LDCR register
#define ADC_MR_FREERUN_ON
(ADC_MR) Free Run Mode: Never wait for any trigger.
#define ADC_ACR_IBCTL(value)
#define ADC_WPSR_WPVS
(ADC_WPSR) Write Protect Violation Status
#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_PTCR_RXTDIS
(ADC_PTCR) Receiver Transfer Disable
#define ADC_MR_PRESCAL_Pos
#define ADC_EMR_CMPMODE_Msk
(ADC_EMR) Comparison Mode
#define ADC_MR_FWUP
(ADC_MR) Fast Wake Up
#define ADC_MR_PRESCAL_Msk
(ADC_MR) Prescaler Rate Selection
void adc_disable_ts(Adc *p_adc)
Turn off temperature sensor.
Definition adc.c:748
void adc_configure_trigger(Adc *p_adc, const enum adc_trigger_t trigger, uint8_t uc_freerun)
Configure conversion trigger and free run mode.
Definition adc.c:168
uint32_t adc_get_latest_value(const Adc *p_adc)
Read the last ADC result data.
Definition adc.c:431
void adc_disable_channel_differential_input(Adc *p_adc, const enum adc_channel_num_t channel)
Disable differential input for the specified channel.
Definition adc.c:568
void adc_set_comparison_channel(Adc *p_adc, const enum adc_channel_num_t channel)
Configure comparison selected channel.
Definition adc.c:538
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.
Definition adc.c:261
void adc_set_resolution(Adc *p_adc, const enum adc_resolution_t resolution)
Configure the conversion resolution.
Definition adc.c:134
void adc_start_sequencer(Adc *p_adc)
Enable conversion sequencer.
Definition adc.c:479
uint32_t adc_get_writeprotect_status(const Adc *p_adc)
Indicate write protect status.
Definition adc.c:777
void adc_set_calibmode(Adc *p_adc)
Set ADC auto calibration mode.
Definition adc.c:621
void adc_stop_sequencer(Adc *p_adc)
Disable conversion sequencer.
Definition adc.c:489
void adc_set_bias_current(Adc *p_adc, const uint8_t uc_ibctl)
Adapt performance versus power consumption.
Definition adc.c:728
void adc_configure_sequence(Adc *p_adc, const enum adc_channel_num_t ch_list[], uint8_t uc_num)
Configure conversion sequence.
Definition adc.c:228
enum adc_channel_num_t adc_get_tag(const Adc *p_adc)
Indicate the last converted channel.
Definition adc.c:468
void adc_disable_channel_input_offset(Adc *p_adc, const enum adc_channel_num_t channel)
Disable analog signal offset for the specified channel.
Definition adc.c:593
uint32_t adc_get_status(const Adc *p_adc)
Get ADC interrupt and overrun error status.
Definition adc.c:676
uint32_t adc_get_overrun_status(const Adc *p_adc)
Get ADC interrupt and overrun error status.
Definition adc.c:688
void adc_disable_all_channel(Adc *p_adc)
Disable all ADC channel.
Definition adc.c:382
void adc_disable_tag(Adc *p_adc)
Disable TAG option.
Definition adc.c:453
#define ADC_WPMR_WPKEY_PASSWD
Definition adc.c:756
void adc_disable_channel(Adc *p_adc, const enum adc_channel_num_t adc_ch)
Disable the specified ADC channel.
Definition adc.c:372
void adc_disable_interrupt(Adc *p_adc, const uint32_t ul_source)
Disable ADC interrupts.
Definition adc.c:663
void adc_start(Adc *p_adc)
Start analog-to-digital conversion.
Definition adc.c:326
void adc_reset(Adc *p_adc)
Reset ADC.
Definition adc.c:336
uint32_t adc_get_interrupt_mask(const Adc *p_adc)
Read ADC interrupt mask.
Definition adc.c:713
void adc_enable_tag(Adc *p_adc)
Enable TAG option so that the number of the last converted channel can be indicated.
Definition adc.c:443
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.
Definition adc.c:70
void adc_set_comparison_mode(Adc *p_adc, const uint8_t uc_mode)
Configure comparison mode.
Definition adc.c:500
void adc_disable_anch(Adc *p_adc)
Disable analog change.
Definition adc.c:311
void adc_enable_channel_differential_input(Adc *p_adc, const enum adc_channel_num_t channel)
Enable differential input for the specified channel.
Definition adc.c:557
void adc_enable_all_channel(Adc *p_adc)
Enable all ADC channels.
Definition adc.c:357
static uint32_t calcul_startup(const uint32_t ul_startup)
calcul_startup
Definition adc.c:792
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.
Definition adc.c:608
void adc_enable_interrupt(Adc *p_adc, const uint32_t ul_source)
Enable ADC interrupts.
Definition adc.c:652
void adc_enable_anch(Adc *p_adc)
Enable analog change.
Definition adc.c:299
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.
Definition adc.c:413
void adc_configure_power_save(Adc *p_adc, const uint8_t uc_sleep, const uint8_t uc_fwup)
Configures ADC power saving mode.
Definition adc.c:198
uint32_t adc_get_actual_adc_clock(const Adc *p_adc, const uint32_t ul_mck)
Return the actual ADC clock.
Definition adc.c:635
void adc_set_writeprotect(Adc *p_adc, const uint32_t ul_enable)
Enable or disable write protection of ADC registers.
Definition adc.c:764
Pdc * adc_get_pdc_base(const Adc *p_adc)
Get PDC registers base address.
Definition adc.c:906
void adc_enable_channel(Adc *p_adc, const enum adc_channel_num_t adc_ch)
Enable the specified ADC channel.
Definition adc.c:347
void adc_check(Adc *p_adc, const uint32_t ul_mck)
Check ADC configurations.
Definition adc.c:838
void adc_enable_channel_input_offset(Adc *p_adc, const enum adc_channel_num_t channel)
Enable analog signal offset for the specified channel.
Definition adc.c:582
void adc_set_comparison_window(Adc *p_adc, const uint16_t us_low_threshold, const uint16_t us_high_threshold)
Configure ADC compare window.
Definition adc.c:525
uint32_t adc_get_comparison_mode(const Adc *p_adc)
Get comparison mode.
Definition adc.c:513
uint32_t adc_get_channel_status(const Adc *p_adc, const enum adc_channel_num_t adc_ch)
Read the ADC channel status.
Definition adc.c:400
void adc_enable_ts(Adc *p_adc)
Turn on temperature sensor.
Definition adc.c:738
#define PDC_ADC
(PDC_ADC ) Base Address
Definition sam4sd32c.h:431
Adc hardware registers.
__I uint32_t ADC_WPSR
(Adc Offset: 0xE8) Write Protect Status Register
__IO uint32_t ADC_EMR
(Adc Offset: 0x40) Extended Mode Register
__O uint32_t ADC_PTCR
(Adc Offset: 0x120) Transfer Control Register
__IO uint32_t ADC_MR
(Adc Offset: 0x04) Mode Register
__I uint32_t ADC_CHSR
(Adc Offset: 0x18) Channel Status Register
__O uint32_t ADC_IDR
(Adc Offset: 0x28) Interrupt Disable Register
__I uint32_t ADC_ISR
(Adc Offset: 0x30) Interrupt Status Register
__IO uint32_t ADC_RCR
(Adc Offset: 0x104) Receive Counter Register
__O uint32_t ADC_CHER
(Adc Offset: 0x10) Channel Enable Register
__O uint32_t ADC_IER
(Adc Offset: 0x24) Interrupt Enable Register
__I uint32_t ADC_IMR
(Adc Offset: 0x2C) Interrupt Mask Register
__IO uint32_t ADC_CWR
(Adc Offset: 0x44) Compare Window Register
__IO uint32_t ADC_COR
(Adc Offset: 0x4C) Channel Offset Register
__O uint32_t ADC_CR
(Adc Offset: 0x00) Control Register
__I uint32_t ADC_LCDR
(Adc Offset: 0x20) Last Converted Data Register
__I uint32_t ADC_OVER
(Adc Offset: 0x3C) Overrun Status Register
__IO uint32_t ADC_CGR
(Adc Offset: 0x48) Channel Gain Register
__IO uint32_t ADC_SEQR1
(Adc Offset: 0x08) Channel Sequence Register 1
__IO uint32_t ADC_WPMR
(Adc Offset: 0xE4) Write Protect Mode Register
__IO uint32_t ADC_RNCR
(Adc Offset: 0x114) Receive Next Counter Register
__IO uint32_t ADC_ACR
(Adc Offset: 0x94) Analog Control Register
__I uint32_t ADC_CDR[16]
(Adc Offset: 0x50) Channel Data Register
__O uint32_t ADC_CHDR
(Adc Offset: 0x14) Channel Disable Register