mbed official / mbed-dev

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
149:156823d33999
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 107:414e9c822e99 1 /**
mbed_official 107:414e9c822e99 2 * \file
mbed_official 107:414e9c822e99 3 *
mbed_official 107:414e9c822e99 4 * \brief ADC Controller driver.
mbed_official 107:414e9c822e99 5 *
mbed_official 107:414e9c822e99 6 * Copyright (c) 2013-2015 Atmel Corporation. All rights reserved.
mbed_official 107:414e9c822e99 7 *
mbed_official 107:414e9c822e99 8 * \asf_license_start
mbed_official 107:414e9c822e99 9 *
mbed_official 107:414e9c822e99 10 * \page License
mbed_official 107:414e9c822e99 11 *
mbed_official 107:414e9c822e99 12 * Redistribution and use in source and binary forms, with or without
mbed_official 107:414e9c822e99 13 * modification, are permitted provided that the following conditions are met:
mbed_official 107:414e9c822e99 14 *
mbed_official 107:414e9c822e99 15 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 107:414e9c822e99 16 * this list of conditions and the following disclaimer.
mbed_official 107:414e9c822e99 17 *
mbed_official 107:414e9c822e99 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 107:414e9c822e99 19 * this list of conditions and the following disclaimer in the documentation
mbed_official 107:414e9c822e99 20 * and/or other materials provided with the distribution.
mbed_official 107:414e9c822e99 21 *
mbed_official 107:414e9c822e99 22 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 107:414e9c822e99 23 * from this software without specific prior written permission.
mbed_official 107:414e9c822e99 24 *
mbed_official 107:414e9c822e99 25 * 4. This software may only be redistributed and used in connection with an
mbed_official 107:414e9c822e99 26 * Atmel microcontroller product.
mbed_official 107:414e9c822e99 27 *
mbed_official 107:414e9c822e99 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 107:414e9c822e99 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 107:414e9c822e99 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 107:414e9c822e99 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 107:414e9c822e99 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 107:414e9c822e99 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 107:414e9c822e99 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 107:414e9c822e99 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 107:414e9c822e99 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 107:414e9c822e99 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 107:414e9c822e99 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 107:414e9c822e99 39 *
mbed_official 107:414e9c822e99 40 * \asf_license_stop
mbed_official 107:414e9c822e99 41 *
mbed_official 107:414e9c822e99 42 */
mbed_official 107:414e9c822e99 43 /*
mbed_official 107:414e9c822e99 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 107:414e9c822e99 45 */
mbed_official 107:414e9c822e99 46
mbed_official 107:414e9c822e99 47 #ifndef ADC2_H_INCLUDED
mbed_official 107:414e9c822e99 48 #define ADC2_H_INCLUDED
mbed_official 107:414e9c822e99 49
mbed_official 107:414e9c822e99 50 #include "compiler.h"
mbed_official 107:414e9c822e99 51 #include "status_codes.h"
mbed_official 107:414e9c822e99 52
mbed_official 107:414e9c822e99 53 #if (SAM4N)
mbed_official 107:414e9c822e99 54 #define TEMP_SENSOR
mbed_official 107:414e9c822e99 55 #define SLEEP_MODE_ADC SLEEPMGR_SLEEP_WFI
mbed_official 107:414e9c822e99 56 #endif
mbed_official 107:414e9c822e99 57
mbed_official 107:414e9c822e99 58 #if (SAMG)
mbed_official 107:414e9c822e99 59 #define NO_TEMP_SENSOR
mbed_official 107:414e9c822e99 60 #define SLEEP_MODE_ADC SLEEPMGR_ACTIVE
mbed_official 107:414e9c822e99 61 #endif
mbed_official 107:414e9c822e99 62
mbed_official 107:414e9c822e99 63 /** Write Protect Key */
mbed_official 107:414e9c822e99 64 #ifndef ADC_WPMR_WPKEY_PASSWD
mbed_official 107:414e9c822e99 65 #define ADC_WPMR_WPKEY_PASSWD (0x414443u << 8)
mbed_official 107:414e9c822e99 66 #endif
mbed_official 107:414e9c822e99 67
mbed_official 107:414e9c822e99 68 /** Definitions for ADC resolution */
mbed_official 107:414e9c822e99 69 enum adc_resolution {
mbed_official 107:414e9c822e99 70 #if SAMG55
mbed_official 107:414e9c822e99 71 ADC_12_BITS = ADC_EMR_OSR_NO_AVERAGE, /* ADC 12-bit resolution */
mbed_official 107:414e9c822e99 72 ADC_13_BITS = ADC_EMR_OSR_OSR4, /* ADC 13-bit resolution */
mbed_official 107:414e9c822e99 73 ADC_14_BITS = ADC_EMR_OSR_OSR16, /* ADC 14-bit resolution */
mbed_official 107:414e9c822e99 74 ADC_15_BITS = ADC_EMR_OSR_OSR64, /* ADC 15-bit resolution */
mbed_official 107:414e9c822e99 75 ADC_16_BITS = ADC_EMR_OSR_OSR256, /* ADC 16-bit resolution */
mbed_official 107:414e9c822e99 76 #else
mbed_official 107:414e9c822e99 77 ADC_8_BITS = ADC_MR_LOWRES_BITS_8, /* ADC 8-bit resolution */
mbed_official 107:414e9c822e99 78 ADC_10_BITS = ADC_MR_LOWRES_BITS_10, /* ADC 10-bit resolution */
mbed_official 107:414e9c822e99 79 ADC_11_BITS = ADC_EMR_OSR_OSR4, /* ADC 11-bit resolution */
mbed_official 107:414e9c822e99 80 ADC_12_BITS = ADC_EMR_OSR_OSR16 /* ADC 12-bit resolution */
mbed_official 107:414e9c822e99 81 #endif
mbed_official 107:414e9c822e99 82 };
mbed_official 107:414e9c822e99 83
mbed_official 107:414e9c822e99 84 /** Definitions for ADC power mode */
mbed_official 107:414e9c822e99 85 enum adc_power_mode {
mbed_official 107:414e9c822e99 86 /* ADC core on and reference voltage circuitry on */
mbed_official 107:414e9c822e99 87 ADC_POWER_MODE_0 = 0,
mbed_official 107:414e9c822e99 88 /* ADC core off and reference voltage circuitry off */
mbed_official 107:414e9c822e99 89 ADC_POWER_MODE_1
mbed_official 107:414e9c822e99 90 };
mbed_official 107:414e9c822e99 91
mbed_official 107:414e9c822e99 92 /** Definitions for ADC trigger */
mbed_official 107:414e9c822e99 93 enum adc_trigger {
mbed_official 107:414e9c822e99 94 /* Starting a conversion is only possible by software. */
mbed_official 107:414e9c822e99 95 ADC_TRIG_SW = ADC_MR_TRGEN_DIS,
mbed_official 107:414e9c822e99 96 /* External trigger */
mbed_official 107:414e9c822e99 97 ADC_TRIG_EXT = ADC_MR_TRGSEL_ADC_TRIG0 | ADC_MR_TRGEN,
mbed_official 107:414e9c822e99 98 /* TIO Output of the Timer Counter Channel 0 */
mbed_official 107:414e9c822e99 99 ADC_TRIG_TIO_CH_0 = ADC_MR_TRGSEL_ADC_TRIG1 | ADC_MR_TRGEN,
mbed_official 107:414e9c822e99 100 /* TIO Output of the Timer Counter Channel 1 */
mbed_official 107:414e9c822e99 101 ADC_TRIG_TIO_CH_1 = ADC_MR_TRGSEL_ADC_TRIG2 | ADC_MR_TRGEN,
mbed_official 107:414e9c822e99 102 /* TIO Output of the Timer Counter Channel 2 */
mbed_official 107:414e9c822e99 103 ADC_TRIG_TIO_CH_2 = ADC_MR_TRGSEL_ADC_TRIG3 | ADC_MR_TRGEN,
mbed_official 107:414e9c822e99 104 #if (SAMG)
mbed_official 107:414e9c822e99 105 /* RTCOUT0 */
mbed_official 107:414e9c822e99 106 ADC_TRIG_RTC_0 = ADC_MR_TRGSEL_ADC_TRIG4 | ADC_MR_TRGEN,
mbed_official 107:414e9c822e99 107 /* RTTINC */
mbed_official 107:414e9c822e99 108 ADC_TRIG_RTT = ADC_MR_TRGSEL_ADC_TRIG5 | ADC_MR_TRGEN,
mbed_official 107:414e9c822e99 109 #endif
mbed_official 107:414e9c822e99 110 /* Freerun mode conversion. */
mbed_official 107:414e9c822e99 111 ADC_TRIG_FREERUN = 0xFF
mbed_official 107:414e9c822e99 112 };
mbed_official 107:414e9c822e99 113
mbed_official 107:414e9c822e99 114 /** Definitions for ADC channel number */
mbed_official 107:414e9c822e99 115 enum adc_channel_num {
mbed_official 107:414e9c822e99 116 ADC_CHANNEL_0 = 0,
mbed_official 107:414e9c822e99 117 ADC_CHANNEL_1,
mbed_official 107:414e9c822e99 118 ADC_CHANNEL_2,
mbed_official 107:414e9c822e99 119 ADC_CHANNEL_3,
mbed_official 107:414e9c822e99 120 ADC_CHANNEL_4,
mbed_official 107:414e9c822e99 121 ADC_CHANNEL_5,
mbed_official 107:414e9c822e99 122 ADC_CHANNEL_6,
mbed_official 107:414e9c822e99 123 ADC_CHANNEL_7,
mbed_official 107:414e9c822e99 124 #if (SAM4N)
mbed_official 107:414e9c822e99 125 ADC_CHANNEL_8,
mbed_official 107:414e9c822e99 126 ADC_CHANNEL_9,
mbed_official 107:414e9c822e99 127 ADC_CHANNEL_10,
mbed_official 107:414e9c822e99 128 ADC_CHANNEL_11,
mbed_official 107:414e9c822e99 129 ADC_CHANNEL_12,
mbed_official 107:414e9c822e99 130 ADC_CHANNEL_13,
mbed_official 107:414e9c822e99 131 ADC_CHANNEL_14,
mbed_official 107:414e9c822e99 132 ADC_CHANNEL_15,
mbed_official 107:414e9c822e99 133 #endif
mbed_official 107:414e9c822e99 134 #ifdef TEMP_SENSOR
mbed_official 107:414e9c822e99 135 ADC_TEMPERATURE_SENSOR,
mbed_official 107:414e9c822e99 136 #endif
mbed_official 107:414e9c822e99 137 ADC_CHANNEL_ALL = 0xFFFF
mbed_official 107:414e9c822e99 138 };
mbed_official 107:414e9c822e99 139
mbed_official 107:414e9c822e99 140 /** Definitions for ADC Start Up Time */
mbed_official 107:414e9c822e99 141 enum adc_startup_time {
mbed_official 107:414e9c822e99 142 ADC_STARTUP_TIME_0 = ADC_MR_STARTUP_SUT0,
mbed_official 107:414e9c822e99 143 ADC_STARTUP_TIME_1 = ADC_MR_STARTUP_SUT8,
mbed_official 107:414e9c822e99 144 ADC_STARTUP_TIME_2 = ADC_MR_STARTUP_SUT16,
mbed_official 107:414e9c822e99 145 ADC_STARTUP_TIME_3 = ADC_MR_STARTUP_SUT24,
mbed_official 107:414e9c822e99 146 ADC_STARTUP_TIME_4 = ADC_MR_STARTUP_SUT64,
mbed_official 107:414e9c822e99 147 ADC_STARTUP_TIME_5 = ADC_MR_STARTUP_SUT80,
mbed_official 107:414e9c822e99 148 ADC_STARTUP_TIME_6 = ADC_MR_STARTUP_SUT96,
mbed_official 107:414e9c822e99 149 ADC_STARTUP_TIME_7 = ADC_MR_STARTUP_SUT112,
mbed_official 107:414e9c822e99 150 ADC_STARTUP_TIME_8 = ADC_MR_STARTUP_SUT512,
mbed_official 107:414e9c822e99 151 ADC_STARTUP_TIME_9 = ADC_MR_STARTUP_SUT576,
mbed_official 107:414e9c822e99 152 ADC_STARTUP_TIME_10 = ADC_MR_STARTUP_SUT640,
mbed_official 107:414e9c822e99 153 ADC_STARTUP_TIME_11 = ADC_MR_STARTUP_SUT704,
mbed_official 107:414e9c822e99 154 ADC_STARTUP_TIME_12 = ADC_MR_STARTUP_SUT768,
mbed_official 107:414e9c822e99 155 ADC_STARTUP_TIME_13 = ADC_MR_STARTUP_SUT832,
mbed_official 107:414e9c822e99 156 ADC_STARTUP_TIME_14 = ADC_MR_STARTUP_SUT896,
mbed_official 107:414e9c822e99 157 ADC_STARTUP_TIME_15 = ADC_MR_STARTUP_SUT960
mbed_official 107:414e9c822e99 158 };
mbed_official 107:414e9c822e99 159
mbed_official 107:414e9c822e99 160 /** Definitions for Comparison Mode */
mbed_official 107:414e9c822e99 161 enum adc_cmp_mode {
mbed_official 107:414e9c822e99 162 ADC_CMP_MODE_0 = ADC_EMR_CMPMODE_LOW,
mbed_official 107:414e9c822e99 163 ADC_CMP_MODE_1 = ADC_EMR_CMPMODE_HIGH,
mbed_official 107:414e9c822e99 164 ADC_CMP_MODE_2 = ADC_EMR_CMPMODE_IN,
mbed_official 107:414e9c822e99 165 ADC_CMP_MODE_3 = ADC_EMR_CMPMODE_OUT
mbed_official 107:414e9c822e99 166 };
mbed_official 107:414e9c822e99 167
mbed_official 107:414e9c822e99 168 #ifdef TEMP_SENSOR
mbed_official 107:414e9c822e99 169 /** Definitions for Temperature Comparison Mode */
mbed_official 107:414e9c822e99 170 enum adc_temp_cmp_mode {
mbed_official 107:414e9c822e99 171 ADC_TEMP_CMP_MODE_0 = ADC_TEMPMR_TEMPCMPMOD_LOW,
mbed_official 107:414e9c822e99 172 ADC_TEMP_CMP_MODE_1 = ADC_TEMPMR_TEMPCMPMOD_HIGH,
mbed_official 107:414e9c822e99 173 ADC_TEMP_CMP_MODE_2 = ADC_TEMPMR_TEMPCMPMOD_IN,
mbed_official 107:414e9c822e99 174 ADC_TEMP_CMP_MODE_3 = ADC_TEMPMR_TEMPCMPMOD_OUT
mbed_official 107:414e9c822e99 175 };
mbed_official 107:414e9c822e99 176 #endif
mbed_official 107:414e9c822e99 177 #if (SAMG)
mbed_official 107:414e9c822e99 178 /** Definitions for Last Channel Specific Measurement Comparison Mode */
mbed_official 107:414e9c822e99 179 enum adc_last_channel_cmp_mode {
mbed_official 107:414e9c822e99 180 ADC_LAST_CHANNEL_CMP_MODE_0 = ADC_LCTMR_CMPMOD_LOW,
mbed_official 107:414e9c822e99 181 ADC_LAST_CHANNEL_CMP_MODE_1 = ADC_LCTMR_CMPMOD_HIGH,
mbed_official 107:414e9c822e99 182 ADC_LAST_CHANNEL_CMP_MODE_2 = ADC_LCTMR_CMPMOD_IN,
mbed_official 107:414e9c822e99 183 ADC_LAST_CHANNEL_CMP_MODE_3 = ADC_LCTMR_CMPMOD_OUT
mbed_official 107:414e9c822e99 184 };
mbed_official 107:414e9c822e99 185 #endif
mbed_official 107:414e9c822e99 186
mbed_official 107:414e9c822e99 187 /** Definitions for Reference Voltage Selection */
mbed_official 107:414e9c822e99 188 enum adc_refer_voltage_source {
mbed_official 107:414e9c822e99 189 ADC_REFER_VOL_EXTERNAL = 0,
mbed_official 107:414e9c822e99 190 ADC_REFER_VOL_STUCK_AT_MIN,
mbed_official 107:414e9c822e99 191 ADC_REFER_VOL_VDDANA,
mbed_official 107:414e9c822e99 192 ADC_REFER_VOL_IRVS
mbed_official 107:414e9c822e99 193 };
mbed_official 107:414e9c822e99 194
mbed_official 107:414e9c822e99 195 /**
mbed_official 107:414e9c822e99 196 * \brief ADC Enhanced configuration structure.
mbed_official 107:414e9c822e99 197 *
mbed_official 107:414e9c822e99 198 * Configuration structure for a ADC Enhanced instance.
mbed_official 107:414e9c822e99 199 * This structure could be initialized by the \ref ADC_get_config_defaults()
mbed_official 107:414e9c822e99 200 * function before being modified by the user application.
mbed_official 107:414e9c822e99 201 */
mbed_official 107:414e9c822e99 202 struct adc_config {
mbed_official 107:414e9c822e99 203 /** Resolution */
mbed_official 107:414e9c822e99 204 enum adc_resolution resolution;
mbed_official 107:414e9c822e99 205 /** Master Clock */
mbed_official 107:414e9c822e99 206 uint32_t mck;
mbed_official 107:414e9c822e99 207 /** ADC Clock */
mbed_official 107:414e9c822e99 208 uint32_t adc_clock;
mbed_official 107:414e9c822e99 209 /** Start Up Time */
mbed_official 107:414e9c822e99 210 enum adc_startup_time startup_time;
mbed_official 107:414e9c822e99 211 /** Tracking Time = (tracktim+1) / ADC clock */
mbed_official 107:414e9c822e99 212 uint8_t tracktim;
mbed_official 107:414e9c822e99 213 /** Transfer Period */
mbed_official 107:414e9c822e99 214 uint8_t transfer;
mbed_official 107:414e9c822e99 215 /** Use Sequence Enable */
mbed_official 107:414e9c822e99 216 bool useq;
mbed_official 107:414e9c822e99 217 /** TAG of ADC_LDCR register */
mbed_official 107:414e9c822e99 218 bool tag;
mbed_official 107:414e9c822e99 219 /** Averaging on Single Trigger Event */
mbed_official 107:414e9c822e99 220 bool aste;
mbed_official 107:414e9c822e99 221 };
mbed_official 107:414e9c822e99 222
mbed_official 107:414e9c822e99 223 #ifdef TEMP_SENSOR
mbed_official 107:414e9c822e99 224 /** ADC Temperature Sensor configuration structure.*/
mbed_official 107:414e9c822e99 225 struct adc_temp_sensor_config {
mbed_official 107:414e9c822e99 226 /** Temperature Sensor On */
mbed_official 107:414e9c822e99 227 bool tempon;
mbed_official 107:414e9c822e99 228 /** Temperature Comparison Mode */
mbed_official 107:414e9c822e99 229 enum adc_temp_cmp_mode mode;
mbed_official 107:414e9c822e99 230 /** Temperature Low Threshold */
mbed_official 107:414e9c822e99 231 uint16_t low_threshold;
mbed_official 107:414e9c822e99 232 /** Temperature High Threshold */
mbed_official 107:414e9c822e99 233 uint16_t high_threshold;
mbed_official 107:414e9c822e99 234 };
mbed_official 107:414e9c822e99 235 #endif
mbed_official 107:414e9c822e99 236
mbed_official 107:414e9c822e99 237 #if (SAMG)
mbed_official 107:414e9c822e99 238 /** ADC Last Channel Specific Measurement configuration structure.*/
mbed_official 107:414e9c822e99 239 struct adc_last_channel_config {
mbed_official 107:414e9c822e99 240 /** Specific Measurement On */
mbed_official 107:414e9c822e99 241 bool dual_trig_on;
mbed_official 107:414e9c822e99 242 /** Specific Measurement Comparison Mode */
mbed_official 107:414e9c822e99 243 enum adc_last_channel_cmp_mode mode;
mbed_official 107:414e9c822e99 244 /** Specific Measurement Low Threshold */
mbed_official 107:414e9c822e99 245 uint16_t low_threshold;
mbed_official 107:414e9c822e99 246 /** Specific Measurement High Threshold */
mbed_official 107:414e9c822e99 247 uint16_t high_threshold;
mbed_official 107:414e9c822e99 248 };
mbed_official 107:414e9c822e99 249 #endif
mbed_official 107:414e9c822e99 250
mbed_official 107:414e9c822e99 251 /** ADC interrupt source type */
mbed_official 107:414e9c822e99 252 enum adc_interrupt_source {
mbed_official 107:414e9c822e99 253 ADC_INTERRUPT_EOC_0 = 0,
mbed_official 107:414e9c822e99 254 ADC_INTERRUPT_EOC_1,
mbed_official 107:414e9c822e99 255 ADC_INTERRUPT_EOC_2,
mbed_official 107:414e9c822e99 256 ADC_INTERRUPT_EOC_3,
mbed_official 107:414e9c822e99 257 ADC_INTERRUPT_EOC_4,
mbed_official 107:414e9c822e99 258 ADC_INTERRUPT_EOC_5,
mbed_official 107:414e9c822e99 259 ADC_INTERRUPT_EOC_6,
mbed_official 107:414e9c822e99 260 ADC_INTERRUPT_EOC_7,
mbed_official 107:414e9c822e99 261 #if (SAM4N)
mbed_official 107:414e9c822e99 262 ADC_INTERRUPT_EOC_8,
mbed_official 107:414e9c822e99 263 ADC_INTERRUPT_EOC_9,
mbed_official 107:414e9c822e99 264 ADC_INTERRUPT_EOC_10,
mbed_official 107:414e9c822e99 265 ADC_INTERRUPT_EOC_11,
mbed_official 107:414e9c822e99 266 ADC_INTERRUPT_EOC_12,
mbed_official 107:414e9c822e99 267 ADC_INTERRUPT_EOC_13,
mbed_official 107:414e9c822e99 268 ADC_INTERRUPT_EOC_14,
mbed_official 107:414e9c822e99 269 ADC_INTERRUPT_EOC_15,
mbed_official 107:414e9c822e99 270 ADC_INTERRUPT_EOC_16,
mbed_official 107:414e9c822e99 271 #endif
mbed_official 107:414e9c822e99 272 #ifdef TEMP_SENSOR
mbed_official 107:414e9c822e99 273 ADC_INTERRUPT_TEMP_CHANGE,
mbed_official 107:414e9c822e99 274 #endif
mbed_official 107:414e9c822e99 275 ADC_INTERRUPT_END_CAL,
mbed_official 107:414e9c822e99 276 ADC_INTERRUPT_DATA_READY,
mbed_official 107:414e9c822e99 277 ADC_INTERRUPT_OVERRUN_ERROR,
mbed_official 107:414e9c822e99 278 ADC_INTERRUPT_COMP_ERROR,
mbed_official 107:414e9c822e99 279 ADC_INTERRUPT_END_RXBUF,
mbed_official 107:414e9c822e99 280 ADC_INTERRUPT_RXBUF_FULL,
mbed_official 107:414e9c822e99 281 ADC_INTERRUPT_ALL = 0xFFFFFFFF
mbed_official 107:414e9c822e99 282 };
mbed_official 107:414e9c822e99 283
mbed_official 107:414e9c822e99 284 typedef void (*adc_callback_t)(void);
mbed_official 107:414e9c822e99 285
mbed_official 107:414e9c822e99 286 void adc_get_config_defaults(struct adc_config *const cfg);
mbed_official 107:414e9c822e99 287 enum status_code adc_init(Adc *const adc, struct adc_config *const config);
mbed_official 107:414e9c822e99 288
mbed_official 107:414e9c822e99 289 #ifdef TEMP_SENSOR
mbed_official 107:414e9c822e99 290 void adc_temp_sensor_get_config_defaults(
mbed_official 107:414e9c822e99 291 struct adc_temp_sensor_config *const cfg);
mbed_official 107:414e9c822e99 292 void adc_temp_sensor_set_config(Adc *const adc,
mbed_official 107:414e9c822e99 293 struct adc_temp_sensor_config *config);
mbed_official 107:414e9c822e99 294 #endif
mbed_official 107:414e9c822e99 295 #if (SAMG)
mbed_official 107:414e9c822e99 296 void adc_last_channel_get_config_defaults(
mbed_official 107:414e9c822e99 297 struct adc_last_channel_config *const cfg);
mbed_official 107:414e9c822e99 298 void adc_last_channel_set_config(Adc *const adc,
mbed_official 107:414e9c822e99 299 struct adc_last_channel_config *config);
mbed_official 107:414e9c822e99 300 #endif
mbed_official 107:414e9c822e99 301
mbed_official 107:414e9c822e99 302 void adc_configure_sequence(Adc *const adc,
mbed_official 107:414e9c822e99 303 const enum adc_channel_num ch_list[], const uint8_t uc_num);
mbed_official 107:414e9c822e99 304 void adc_enable(void);
mbed_official 107:414e9c822e99 305 void adc_disable(void);
mbed_official 107:414e9c822e99 306 void adc_set_callback(Adc *const adc, enum adc_interrupt_source source,
mbed_official 107:414e9c822e99 307 adc_callback_t callback, uint8_t irq_level);
mbed_official 107:414e9c822e99 308
mbed_official 107:414e9c822e99 309 /**
mbed_official 107:414e9c822e99 310 * \internal
mbed_official 107:414e9c822e99 311 * \brief ADC channel sanity check
mbed_official 107:414e9c822e99 312 *
mbed_official 107:414e9c822e99 313 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 314 * \param channel Adc channel number.
mbed_official 107:414e9c822e99 315 *
mbed_official 107:414e9c822e99 316 */
mbed_official 107:414e9c822e99 317 static inline void adc_ch_sanity_check(Adc *const adc,
mbed_official 107:414e9c822e99 318 const enum adc_channel_num channel)
mbed_official 107:414e9c822e99 319 {
mbed_official 107:414e9c822e99 320 if (adc == ADC) {
mbed_official 107:414e9c822e99 321 Assert((channel < NB_CH_ADC)
mbed_official 107:414e9c822e99 322 #ifdef TEMP_SENSOR
mbed_official 107:414e9c822e99 323 ||(channel == ADC_TEMPERATURE_SENSOR)
mbed_official 107:414e9c822e99 324 #endif
mbed_official 107:414e9c822e99 325 );
mbed_official 107:414e9c822e99 326 }
mbed_official 107:414e9c822e99 327
mbed_official 107:414e9c822e99 328 UNUSED(channel);
mbed_official 107:414e9c822e99 329 }
mbed_official 107:414e9c822e99 330
mbed_official 107:414e9c822e99 331 #if (SAMG)
mbed_official 107:414e9c822e99 332 #if SAMG55
mbed_official 107:414e9c822e99 333 /**
mbed_official 107:414e9c822e99 334 * \brief Configure ADC clock to mck.
mbed_official 107:414e9c822e99 335 *
mbed_official 107:414e9c822e99 336 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 337 *
mbed_official 107:414e9c822e99 338 */
mbed_official 107:414e9c822e99 339 static inline void adc_select_clock_source_mck(Adc *const adc)
mbed_official 107:414e9c822e99 340 {
mbed_official 107:414e9c822e99 341 uint32_t reg;
mbed_official 107:414e9c822e99 342
mbed_official 107:414e9c822e99 343 reg = adc->ADC_EMR;
mbed_official 107:414e9c822e99 344
mbed_official 107:414e9c822e99 345 reg &= ~ADC_EMR_SRCCLK_PMC_PCK;
mbed_official 107:414e9c822e99 346
mbed_official 107:414e9c822e99 347 adc->ADC_EMR = reg;
mbed_official 107:414e9c822e99 348 }
mbed_official 107:414e9c822e99 349
mbed_official 107:414e9c822e99 350 /**
mbed_official 107:414e9c822e99 351 * \brief Configure ADC clock to pck.
mbed_official 107:414e9c822e99 352 *
mbed_official 107:414e9c822e99 353 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 354 *
mbed_official 107:414e9c822e99 355 */
mbed_official 107:414e9c822e99 356 static inline void adc_select_clock_source_pck(Adc *const adc)
mbed_official 107:414e9c822e99 357 {
mbed_official 107:414e9c822e99 358 uint32_t reg;
mbed_official 107:414e9c822e99 359
mbed_official 107:414e9c822e99 360 reg = adc->ADC_EMR;
mbed_official 107:414e9c822e99 361
mbed_official 107:414e9c822e99 362 reg |= ADC_EMR_SRCCLK_PMC_PCK;
mbed_official 107:414e9c822e99 363
mbed_official 107:414e9c822e99 364 adc->ADC_EMR = reg;
mbed_official 107:414e9c822e99 365 }
mbed_official 107:414e9c822e99 366
mbed_official 107:414e9c822e99 367 #else
mbed_official 107:414e9c822e99 368 /**
mbed_official 107:414e9c822e99 369 * \brief Configure ADC clock to MCK.
mbed_official 107:414e9c822e99 370 *
mbed_official 107:414e9c822e99 371 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 372 *
mbed_official 107:414e9c822e99 373 */
mbed_official 107:414e9c822e99 374 static inline void adc_set_clock_mck(Adc *const adc)
mbed_official 107:414e9c822e99 375 {
mbed_official 107:414e9c822e99 376 uint32_t reg;
mbed_official 107:414e9c822e99 377
mbed_official 107:414e9c822e99 378 reg = adc->ADC_EMR;
mbed_official 107:414e9c822e99 379
mbed_official 107:414e9c822e99 380 reg |= ADC_MR_DIV1;
mbed_official 107:414e9c822e99 381
mbed_official 107:414e9c822e99 382 adc->ADC_MR = reg;
mbed_official 107:414e9c822e99 383 }
mbed_official 107:414e9c822e99 384
mbed_official 107:414e9c822e99 385 /**
mbed_official 107:414e9c822e99 386 * \brief Configure ADC clock to MCK/3.
mbed_official 107:414e9c822e99 387 *
mbed_official 107:414e9c822e99 388 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 389 *
mbed_official 107:414e9c822e99 390 */
mbed_official 107:414e9c822e99 391 static inline void adc_set_clock_mck_div3(Adc *const adc)
mbed_official 107:414e9c822e99 392 {
mbed_official 107:414e9c822e99 393 uint32_t reg;
mbed_official 107:414e9c822e99 394
mbed_official 107:414e9c822e99 395 reg = adc->ADC_MR;
mbed_official 107:414e9c822e99 396
mbed_official 107:414e9c822e99 397 reg &= ~ADC_MR_DIV1;
mbed_official 107:414e9c822e99 398 reg |= ADC_MR_DIV3;
mbed_official 107:414e9c822e99 399
mbed_official 107:414e9c822e99 400 adc->ADC_MR = reg;
mbed_official 107:414e9c822e99 401 }
mbed_official 107:414e9c822e99 402 #endif
mbed_official 107:414e9c822e99 403 #endif
mbed_official 107:414e9c822e99 404
mbed_official 107:414e9c822e99 405 /**
mbed_official 107:414e9c822e99 406 * \brief Configure conversion trigger and free run mode.
mbed_official 107:414e9c822e99 407 *
mbed_official 107:414e9c822e99 408 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 409 * \param trigger Conversion trigger.
mbed_official 107:414e9c822e99 410 *
mbed_official 107:414e9c822e99 411 */
mbed_official 107:414e9c822e99 412 static inline void adc_set_trigger(Adc *const adc,
mbed_official 107:414e9c822e99 413 const enum adc_trigger trigger)
mbed_official 107:414e9c822e99 414 {
mbed_official 107:414e9c822e99 415 uint32_t reg;
mbed_official 107:414e9c822e99 416
mbed_official 107:414e9c822e99 417 reg = adc->ADC_MR;
mbed_official 107:414e9c822e99 418
mbed_official 107:414e9c822e99 419 if (trigger == ADC_TRIG_FREERUN) {
mbed_official 107:414e9c822e99 420 reg |= ADC_MR_FREERUN_ON;
mbed_official 107:414e9c822e99 421 } else {
mbed_official 107:414e9c822e99 422 reg &= ~(ADC_MR_TRGSEL_Msk | ADC_MR_TRGEN | ADC_MR_FREERUN_ON);
mbed_official 107:414e9c822e99 423 reg |= trigger;
mbed_official 107:414e9c822e99 424 }
mbed_official 107:414e9c822e99 425
mbed_official 107:414e9c822e99 426 adc->ADC_MR = reg;
mbed_official 107:414e9c822e99 427 }
mbed_official 107:414e9c822e99 428
mbed_official 107:414e9c822e99 429 void adc_set_resolution(Adc *const adc,
mbed_official 107:414e9c822e99 430 const enum adc_resolution res);
mbed_official 107:414e9c822e99 431
mbed_official 107:414e9c822e99 432 void adc_set_comparison_mode(Adc *const adc,
mbed_official 107:414e9c822e99 433 const enum adc_cmp_mode mode,
mbed_official 107:414e9c822e99 434 const enum adc_channel_num channel,
mbed_official 107:414e9c822e99 435 uint8_t cmp_filter);
mbed_official 107:414e9c822e99 436
mbed_official 107:414e9c822e99 437 /**
mbed_official 107:414e9c822e99 438 * \brief Get comparison mode.
mbed_official 107:414e9c822e99 439 *
mbed_official 107:414e9c822e99 440 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 441 *
mbed_official 107:414e9c822e99 442 * \retval Compare mode value.
mbed_official 107:414e9c822e99 443 */
mbed_official 107:414e9c822e99 444 static inline enum adc_cmp_mode adc_get_comparison_mode(Adc *const adc)
mbed_official 107:414e9c822e99 445 {
mbed_official 107:414e9c822e99 446 return (enum adc_cmp_mode)(adc->ADC_EMR & ADC_EMR_CMPMODE_Msk);
mbed_official 107:414e9c822e99 447 }
mbed_official 107:414e9c822e99 448
mbed_official 107:414e9c822e99 449 /**
mbed_official 107:414e9c822e99 450 * \brief Configure ADC compare window.
mbed_official 107:414e9c822e99 451 *
mbed_official 107:414e9c822e99 452 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 453 * \param us_low_threshold Low threshold of compare window.
mbed_official 107:414e9c822e99 454 * \param us_high_threshold High threshold of compare window.
mbed_official 107:414e9c822e99 455 */
mbed_official 107:414e9c822e99 456 static inline void adc_set_comparison_window(Adc *const adc,
mbed_official 107:414e9c822e99 457 const uint16_t us_low_threshold,
mbed_official 107:414e9c822e99 458 const uint16_t us_high_threshold)
mbed_official 107:414e9c822e99 459 {
mbed_official 107:414e9c822e99 460 adc->ADC_CWR = ADC_CWR_LOWTHRES(us_low_threshold) |
mbed_official 107:414e9c822e99 461 ADC_CWR_HIGHTHRES(us_high_threshold);
mbed_official 107:414e9c822e99 462 }
mbed_official 107:414e9c822e99 463
mbed_official 107:414e9c822e99 464 /**
mbed_official 107:414e9c822e99 465 * \brief Enable or disable write protection of ADC registers.
mbed_official 107:414e9c822e99 466 *
mbed_official 107:414e9c822e99 467 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 468 * \param is_enable 1 to enable, 0 to disable.
mbed_official 107:414e9c822e99 469 */
mbed_official 107:414e9c822e99 470 static inline void adc_set_writeprotect(Adc *const adc,
mbed_official 107:414e9c822e99 471 const bool is_enable)
mbed_official 107:414e9c822e99 472 {
mbed_official 107:414e9c822e99 473 if (is_enable) {
mbed_official 107:414e9c822e99 474 adc->ADC_WPMR = ADC_WPMR_WPEN | ADC_WPMR_WPKEY_PASSWD;
mbed_official 107:414e9c822e99 475 } else {
mbed_official 107:414e9c822e99 476 adc->ADC_WPMR = ADC_WPMR_WPKEY_PASSWD;
mbed_official 107:414e9c822e99 477 }
mbed_official 107:414e9c822e99 478 }
mbed_official 107:414e9c822e99 479
mbed_official 107:414e9c822e99 480 /**
mbed_official 107:414e9c822e99 481 * \brief Indicate write protect status.
mbed_official 107:414e9c822e99 482 *
mbed_official 107:414e9c822e99 483 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 484 *
mbed_official 107:414e9c822e99 485 * \return 0 if no write protect violation occurred, or 16-bit write protect
mbed_official 107:414e9c822e99 486 * violation source.
mbed_official 107:414e9c822e99 487 */
mbed_official 107:414e9c822e99 488 static inline uint32_t adc_get_writeprotect_status(Adc *const adc)
mbed_official 107:414e9c822e99 489 {
mbed_official 107:414e9c822e99 490 uint32_t reg_value;
mbed_official 107:414e9c822e99 491
mbed_official 107:414e9c822e99 492 reg_value = adc->ADC_WPSR;
mbed_official 107:414e9c822e99 493 if (reg_value & ADC_WPSR_WPVS) {
mbed_official 107:414e9c822e99 494 return (reg_value & ADC_WPSR_WPVSRC_Msk) >> ADC_WPSR_WPVSRC_Pos;
mbed_official 107:414e9c822e99 495 } else {
mbed_official 107:414e9c822e99 496 return 0;
mbed_official 107:414e9c822e99 497 }
mbed_official 107:414e9c822e99 498 }
mbed_official 107:414e9c822e99 499
mbed_official 107:414e9c822e99 500 /**
mbed_official 107:414e9c822e99 501 * \brief Get ADC overrun error status.
mbed_official 107:414e9c822e99 502 *
mbed_official 107:414e9c822e99 503 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 504 *
mbed_official 107:414e9c822e99 505 * \return ADC overrun error status.
mbed_official 107:414e9c822e99 506 */
mbed_official 107:414e9c822e99 507 static inline uint32_t adc_get_overrun_status(Adc *const adc)
mbed_official 107:414e9c822e99 508 {
mbed_official 107:414e9c822e99 509 return adc->ADC_OVER;
mbed_official 107:414e9c822e99 510 }
mbed_official 107:414e9c822e99 511
mbed_official 107:414e9c822e99 512 /**
mbed_official 107:414e9c822e99 513 * \brief Set ADC averaging on single trigger event
mbed_official 107:414e9c822e99 514 *
mbed_official 107:414e9c822e99 515 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 516 */
mbed_official 107:414e9c822e99 517 static inline void adc_average_on_single_trigger(Adc *const adc)
mbed_official 107:414e9c822e99 518 {
mbed_official 107:414e9c822e99 519 adc->ADC_EMR |= ADC_EMR_ASTE_SINGLE_TRIG_AVERAGE;
mbed_official 107:414e9c822e99 520 }
mbed_official 107:414e9c822e99 521
mbed_official 107:414e9c822e99 522 /**
mbed_official 107:414e9c822e99 523 * \brief Set ADC averaging on serval trigger events
mbed_official 107:414e9c822e99 524 *
mbed_official 107:414e9c822e99 525 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 526 */
mbed_official 107:414e9c822e99 527 static inline void adc_average_on_multi_trigger(Adc *const adc)
mbed_official 107:414e9c822e99 528 {
mbed_official 107:414e9c822e99 529 adc->ADC_EMR &= ~ADC_EMR_ASTE_SINGLE_TRIG_AVERAGE;
mbed_official 107:414e9c822e99 530 }
mbed_official 107:414e9c822e99 531
mbed_official 107:414e9c822e99 532 /**
mbed_official 107:414e9c822e99 533 * \brief Start analog-to-digital conversion.
mbed_official 107:414e9c822e99 534 *
mbed_official 107:414e9c822e99 535 * \note If one of the hardware event is selected as ADC trigger,
mbed_official 107:414e9c822e99 536 * this function can NOT start analog to digital conversion.
mbed_official 107:414e9c822e99 537 *
mbed_official 107:414e9c822e99 538 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 539 */
mbed_official 107:414e9c822e99 540 static inline void adc_start_software_conversion(Adc *const adc)
mbed_official 107:414e9c822e99 541 {
mbed_official 107:414e9c822e99 542 adc->ADC_CR = ADC_CR_START;
mbed_official 107:414e9c822e99 543 }
mbed_official 107:414e9c822e99 544
mbed_official 107:414e9c822e99 545 void adc_set_power_mode(Adc *const adc,
mbed_official 107:414e9c822e99 546 const enum adc_power_mode mode);
mbed_official 107:414e9c822e99 547
mbed_official 107:414e9c822e99 548 /**
mbed_official 107:414e9c822e99 549 * \brief Enable the specified ADC channel.
mbed_official 107:414e9c822e99 550 *
mbed_official 107:414e9c822e99 551 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 552 * \param adc_ch Adc channel number.
mbed_official 107:414e9c822e99 553 */
mbed_official 107:414e9c822e99 554 static inline void adc_channel_enable(Adc *const adc,
mbed_official 107:414e9c822e99 555 const enum adc_channel_num adc_ch)
mbed_official 107:414e9c822e99 556 {
mbed_official 107:414e9c822e99 557 if (adc_ch != ADC_CHANNEL_ALL) {
mbed_official 107:414e9c822e99 558 adc_ch_sanity_check(adc, adc_ch);
mbed_official 107:414e9c822e99 559 }
mbed_official 107:414e9c822e99 560
mbed_official 107:414e9c822e99 561 adc->ADC_CHER = (adc_ch == ADC_CHANNEL_ALL) ?
mbed_official 107:414e9c822e99 562 ADC_CHANNEL_ALL : 1 << adc_ch;
mbed_official 107:414e9c822e99 563 }
mbed_official 107:414e9c822e99 564
mbed_official 107:414e9c822e99 565 /**
mbed_official 107:414e9c822e99 566 * \brief Disable the specified ADC channel.
mbed_official 107:414e9c822e99 567 *
mbed_official 107:414e9c822e99 568 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 569 * \param adc_ch Adc channel number.
mbed_official 107:414e9c822e99 570 */
mbed_official 107:414e9c822e99 571 static inline void adc_channel_disable(Adc *const adc,
mbed_official 107:414e9c822e99 572 const enum adc_channel_num adc_ch)
mbed_official 107:414e9c822e99 573 {
mbed_official 107:414e9c822e99 574 if (adc_ch != ADC_CHANNEL_ALL) {
mbed_official 107:414e9c822e99 575 adc_ch_sanity_check(adc, adc_ch);
mbed_official 107:414e9c822e99 576 }
mbed_official 107:414e9c822e99 577
mbed_official 107:414e9c822e99 578 adc->ADC_CHDR = (adc_ch == ADC_CHANNEL_ALL) ?
mbed_official 107:414e9c822e99 579 ADC_CHANNEL_ALL : 1 << adc_ch;
mbed_official 107:414e9c822e99 580 }
mbed_official 107:414e9c822e99 581
mbed_official 107:414e9c822e99 582 /**
mbed_official 107:414e9c822e99 583 * \brief Get the ADC channel status.
mbed_official 107:414e9c822e99 584 *
mbed_official 107:414e9c822e99 585 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 586 * \param adc_ch Adc channel number.
mbed_official 107:414e9c822e99 587 *
mbed_official 107:414e9c822e99 588 * \retval 1 if channel is enabled.
mbed_official 107:414e9c822e99 589 * \retval 0 if channel is disabled.
mbed_official 107:414e9c822e99 590 */
mbed_official 107:414e9c822e99 591 static inline uint32_t adc_channel_get_status(Adc *const adc,
mbed_official 107:414e9c822e99 592 const enum adc_channel_num adc_ch)
mbed_official 107:414e9c822e99 593 {
mbed_official 107:414e9c822e99 594 adc_ch_sanity_check(adc, adc_ch);
mbed_official 107:414e9c822e99 595
mbed_official 107:414e9c822e99 596 return adc->ADC_CHSR & (1 << adc_ch);
mbed_official 107:414e9c822e99 597 }
mbed_official 107:414e9c822e99 598
mbed_official 107:414e9c822e99 599 /**
mbed_official 107:414e9c822e99 600 * \brief Read the Converted Data of the selected channel.
mbed_official 107:414e9c822e99 601 *
mbed_official 107:414e9c822e99 602 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 603 * \param adc_ch Adc channel number.
mbed_official 107:414e9c822e99 604 *
mbed_official 107:414e9c822e99 605 * \return ADC converted value of the selected channel.
mbed_official 107:414e9c822e99 606 */
mbed_official 107:414e9c822e99 607 static inline uint32_t adc_channel_get_value(Adc *const adc,
mbed_official 107:414e9c822e99 608 enum adc_channel_num adc_ch)
mbed_official 107:414e9c822e99 609 {
mbed_official 107:414e9c822e99 610 adc_ch_sanity_check(adc, adc_ch);
mbed_official 107:414e9c822e99 611
mbed_official 107:414e9c822e99 612 return adc->ADC_CDR[adc_ch];
mbed_official 107:414e9c822e99 613 }
mbed_official 107:414e9c822e99 614
mbed_official 107:414e9c822e99 615 /**
mbed_official 107:414e9c822e99 616 * \brief Get the Last Data Converted.
mbed_official 107:414e9c822e99 617 *
mbed_official 107:414e9c822e99 618 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 619 *
mbed_official 107:414e9c822e99 620 * \return ADC latest converted value.
mbed_official 107:414e9c822e99 621 */
mbed_official 107:414e9c822e99 622 static inline uint32_t adc_get_latest_value(Adc *const adc)
mbed_official 107:414e9c822e99 623 {
mbed_official 107:414e9c822e99 624 return adc->ADC_LCDR & ADC_LCDR_LDATA_Msk;
mbed_official 107:414e9c822e99 625 }
mbed_official 107:414e9c822e99 626
mbed_official 107:414e9c822e99 627 /**
mbed_official 107:414e9c822e99 628 * \brief Get the Last Converted Channel Number.
mbed_official 107:414e9c822e99 629 *
mbed_official 107:414e9c822e99 630 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 631 *
mbed_official 107:414e9c822e99 632 * \return ADC Last Converted Channel Number.
mbed_official 107:414e9c822e99 633 */
mbed_official 107:414e9c822e99 634 static inline uint32_t adc_get_latest_chan_num(Adc *const adc)
mbed_official 107:414e9c822e99 635 {
mbed_official 107:414e9c822e99 636 #if SAMG55
mbed_official 107:414e9c822e99 637 return (adc->ADC_LCDR & ADC_LCDR_CHNBOSR_Msk) >> ADC_LCDR_CHNBOSR_Pos;
mbed_official 107:414e9c822e99 638 #else
mbed_official 107:414e9c822e99 639 return (adc->ADC_LCDR & ADC_LCDR_CHNB_Msk) >> ADC_LCDR_CHNB_Pos;
mbed_official 107:414e9c822e99 640 #endif
mbed_official 107:414e9c822e99 641 }
mbed_official 107:414e9c822e99 642
mbed_official 107:414e9c822e99 643 void adc_enable_interrupt(Adc *const adc,
mbed_official 107:414e9c822e99 644 enum adc_interrupt_source interrupt_source);
mbed_official 107:414e9c822e99 645
mbed_official 107:414e9c822e99 646 void adc_disable_interrupt(Adc *const adc,
mbed_official 107:414e9c822e99 647 enum adc_interrupt_source interrupt_source);
mbed_official 107:414e9c822e99 648
mbed_official 107:414e9c822e99 649 /**
mbed_official 107:414e9c822e99 650 * \brief Get ADC interrupt status.
mbed_official 107:414e9c822e99 651 *
mbed_official 107:414e9c822e99 652 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 653 *
mbed_official 107:414e9c822e99 654 * \return The interrupt status value.
mbed_official 107:414e9c822e99 655 */
mbed_official 107:414e9c822e99 656 static inline uint32_t adc_get_interrupt_status(Adc *const adc)
mbed_official 107:414e9c822e99 657 {
mbed_official 107:414e9c822e99 658 return adc->ADC_ISR;
mbed_official 107:414e9c822e99 659 }
mbed_official 107:414e9c822e99 660
mbed_official 107:414e9c822e99 661 /**
mbed_official 107:414e9c822e99 662 * \brief Get ADC interrupt mask.
mbed_official 107:414e9c822e99 663 *
mbed_official 107:414e9c822e99 664 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 665 *
mbed_official 107:414e9c822e99 666 * \return The interrupt mask value.
mbed_official 107:414e9c822e99 667 */
mbed_official 107:414e9c822e99 668 static inline uint32_t adc_get_interrupt_mask(Adc *const adc)
mbed_official 107:414e9c822e99 669 {
mbed_official 107:414e9c822e99 670 return adc->ADC_IMR;
mbed_official 107:414e9c822e99 671 }
mbed_official 107:414e9c822e99 672
mbed_official 107:414e9c822e99 673 /**
mbed_official 107:414e9c822e99 674 * \brief Get PDC registers base address.
mbed_official 107:414e9c822e99 675 *
mbed_official 107:414e9c822e99 676 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 677 *
mbed_official 107:414e9c822e99 678 * \return Adc Pdc register base address.
mbed_official 107:414e9c822e99 679 */
mbed_official 107:414e9c822e99 680 static inline Pdc *adc_get_pdc_base(Adc *const adc)
mbed_official 107:414e9c822e99 681 {
mbed_official 107:414e9c822e99 682 Pdc *p_pdc_base = NULL;
mbed_official 107:414e9c822e99 683
mbed_official 107:414e9c822e99 684 if (adc == ADC) {
mbed_official 107:414e9c822e99 685 p_pdc_base = PDC_ADC;
mbed_official 107:414e9c822e99 686 }
mbed_official 107:414e9c822e99 687
mbed_official 107:414e9c822e99 688 return p_pdc_base;
mbed_official 107:414e9c822e99 689 }
mbed_official 107:414e9c822e99 690
mbed_official 107:414e9c822e99 691 /**
mbed_official 107:414e9c822e99 692 * \brief Launch an automatic calibration of the ADC on next sequence.
mbed_official 107:414e9c822e99 693 *
mbed_official 107:414e9c822e99 694 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 695 *
mbed_official 107:414e9c822e99 696 * \retval STATUS_OK An automatic calibration is launched.
mbed_official 107:414e9c822e99 697 * \retval STATUS_ERR_BUSY Automatic calibration can not be launched because
mbed_official 107:414e9c822e99 698 * the ADC is in freerun mode.
mbed_official 107:414e9c822e99 699 */
mbed_official 107:414e9c822e99 700 static inline enum status_code adc_start_calibration(Adc *const adc)
mbed_official 107:414e9c822e99 701 {
mbed_official 107:414e9c822e99 702 if ((adc->ADC_MR & ADC_MR_FREERUN) == ADC_MR_FREERUN_ON) {
mbed_official 107:414e9c822e99 703 return STATUS_ERR_BUSY;
mbed_official 107:414e9c822e99 704 }
mbed_official 107:414e9c822e99 705
mbed_official 107:414e9c822e99 706 adc->ADC_CR = ADC_CR_AUTOCAL;
mbed_official 107:414e9c822e99 707 return STATUS_OK;
mbed_official 107:414e9c822e99 708 }
mbed_official 107:414e9c822e99 709
mbed_official 107:414e9c822e99 710 #if (SAM4N)
mbed_official 107:414e9c822e99 711 /**
mbed_official 107:414e9c822e99 712 * \brief ADC Reference Voltage Selection
mbed_official 107:414e9c822e99 713 *
mbed_official 107:414e9c822e99 714 * \param adc Base address of the ADC.
mbed_official 107:414e9c822e99 715 * \param adc_ref_src The source selection for ADC reference voltage,
mbed_official 107:414e9c822e99 716 * ADC_REFER_VOL_EXTERNAL - the external pin ADVREF defines the voltage reference.
mbed_official 107:414e9c822e99 717 * ADC_REFER_VOL_STUCK_AT_MIN - the internal reference voltage is stuck at the minimum value
mbed_official 107:414e9c822e99 718 * ADC_REFER_VOL_VDDANA - the internal voltage reference is forced to VDDANA. Effective only if ONREF is 1.
mbed_official 107:414e9c822e99 719 * ADC_REFER_VOL_IRVS - the internal reference voltage is defined by field IRVS
mbed_official 107:414e9c822e99 720 * See the product electrical characteristics for further details.
mbed_official 107:414e9c822e99 721 * \param irvs Internal reference volatage selection, only be effective when
mbed_official 107:414e9c822e99 722 * adc_ref_src equals to ADC_REFER_VOL_IRVS
mbed_official 107:414e9c822e99 723 */
mbed_official 107:414e9c822e99 724 static inline void adc_ref_vol_sel(Adc *const adc,
mbed_official 107:414e9c822e99 725 enum adc_refer_voltage_source adc_ref_src,
mbed_official 107:414e9c822e99 726 uint8_t irvs)
mbed_official 107:414e9c822e99 727 {
mbed_official 107:414e9c822e99 728 if (ADC_REFER_VOL_EXTERNAL == adc_ref_src) {
mbed_official 107:414e9c822e99 729 adc->ADC_ACR &= ~ADC_ACR_ONREF_EN;
mbed_official 107:414e9c822e99 730 } else if (ADC_REFER_VOL_STUCK_AT_MIN == adc_ref_src) {
mbed_official 107:414e9c822e99 731 adc->ADC_ACR |= ADC_ACR_ONREF_EN;
mbed_official 107:414e9c822e99 732 adc->ADC_ACR &= ~(ADC_ACR_IRVCE_EN | ADC_ACR_FORCEREF_EN);
mbed_official 107:414e9c822e99 733 } else if (ADC_REFER_VOL_VDDANA == adc_ref_src) {
mbed_official 107:414e9c822e99 734 adc->ADC_ACR |= ADC_ACR_ONREF_EN | ADC_ACR_FORCEREF_EN;
mbed_official 107:414e9c822e99 735 } else if (ADC_REFER_VOL_IRVS == adc_ref_src) {
mbed_official 107:414e9c822e99 736 adc->ADC_ACR &= ~ADC_ACR_FORCEREF_EN;
mbed_official 107:414e9c822e99 737 adc->ADC_ACR |= ADC_ACR_ONREF_EN | ADC_ACR_IRVCE_EN |
mbed_official 107:414e9c822e99 738 (irvs << ADC_ACR_IRVS_Pos);
mbed_official 107:414e9c822e99 739 }
mbed_official 107:414e9c822e99 740 }
mbed_official 107:414e9c822e99 741 #endif
mbed_official 107:414e9c822e99 742
mbed_official 107:414e9c822e99 743 /**
mbed_official 107:414e9c822e99 744 * \page sam_adc2_quickstart Quickstart guide for ADC driver
mbed_official 107:414e9c822e99 745 *
mbed_official 107:414e9c822e99 746 * This is the quickstart guide for the \ref sam_drivers_adc2_group
mbed_official 107:414e9c822e99 747 * "ADC2 driver" with step-by-step instructions on how to configure and use
mbed_official 107:414e9c822e99 748 * the driver in a selection of use cases.
mbed_official 107:414e9c822e99 749 *
mbed_official 107:414e9c822e99 750 * The use cases contain several code fragments. The code fragments in the
mbed_official 107:414e9c822e99 751 * steps for setup can be copied into a custom initialization function, while
mbed_official 107:414e9c822e99 752 * the steps for usage can be copied into, e.g., the main application function.
mbed_official 107:414e9c822e99 753 *
mbed_official 107:414e9c822e99 754 * \section adc_basic_use_case Basic use case
mbed_official 107:414e9c822e99 755 * In this basic use case, the ADC module and single channel are configured for:
mbed_official 107:414e9c822e99 756 * - 10 -bit resolution
mbed_official 107:414e9c822e99 757 * - ADC clock frequency is 6MHz
mbed_official 107:414e9c822e99 758 * - Start Up Time is 64 periods ADC clock
mbed_official 107:414e9c822e99 759 * - Tracking Time is 3 periods of ADC clock
mbed_official 107:414e9c822e99 760 * - Transfer Period field shall be programmed with 2 as datasheet said
mbed_official 107:414e9c822e99 761 * - The controller converts channels in a simple numeric order
mbed_official 107:414e9c822e99 762 * - Appends the channel number to the conversion result in AFE_LDCR register
mbed_official 107:414e9c822e99 763 * - Single Trigger is optional to get an averaged value
mbed_official 107:414e9c822e99 764 * - Software triggering of conversions
mbed_official 107:414e9c822e99 765 * - Single channel measurement
mbed_official 107:414e9c822e99 766 * - ADC_CHANNEL_1 of ADC as input
mbed_official 107:414e9c822e99 767 *
mbed_official 107:414e9c822e99 768 * \subsection sam_adc2_quickstart_prereq Prerequisites
mbed_official 107:414e9c822e99 769 * -# \ref sysclk_group "System Clock Management (Sysclock)"
mbed_official 107:414e9c822e99 770 *
mbed_official 107:414e9c822e99 771 * \section adc_basic_use_case_setup Setup steps
mbed_official 107:414e9c822e99 772 * \subsection adc_basic_use_case_setup_code Example code
mbed_official 107:414e9c822e99 773 * Add to application C-file:
mbed_official 107:414e9c822e99 774 * \code
mbed_official 107:414e9c822e99 775 adc_enable();
mbed_official 107:414e9c822e99 776 adc_get_config_defaults(&adc_cfg);
mbed_official 107:414e9c822e99 777 adc_init(ADC, &adc_cfg);
mbed_official 107:414e9c822e99 778 adc_set_trigger(ADC, ADC_TRIG_SW);
mbed_official 107:414e9c822e99 779 adc_channel_enable(ADC, ADC_CHANNEL_1);
mbed_official 107:414e9c822e99 780 \endcode
mbed_official 107:414e9c822e99 781 *
mbed_official 107:414e9c822e99 782 * \subsection adc_basic_use_case_setup_flow Workflow
mbed_official 107:414e9c822e99 783 * -# Enable ADC Module:
mbed_official 107:414e9c822e99 784 * - \code adc_enable(); \endcode
mbed_official 107:414e9c822e99 785 * -# Get the ADC default configurations:
mbed_official 107:414e9c822e99 786 * - \code adc_get_config_defaults(&adc_cfg); \endcode
mbed_official 107:414e9c822e99 787 * -# Initialize the ADC Module:
mbed_official 107:414e9c822e99 788 * - \code adc_init(ADC, &adc_cfg); \endcode
mbed_official 107:414e9c822e99 789 * -# Configure conversion trigger and free run mode:
mbed_official 107:414e9c822e99 790 * - \code adc_set_trigger(ADC, ADC_TRIG_SW); \endcode
mbed_official 107:414e9c822e99 791 * -# Enable Channel:
mbed_official 107:414e9c822e99 792 * - \code adc_channel_enable(ADC, ADC_CHANNEL_1); \endcode
mbed_official 107:414e9c822e99 793 *
mbed_official 107:414e9c822e99 794 * \section adc_basic_use_case_usage Usage steps
mbed_official 107:414e9c822e99 795 * \subsection adc_basic_use_case_usage_code Example code
mbed_official 107:414e9c822e99 796 * Add to, e.g., main loop in application C-file:
mbed_official 107:414e9c822e99 797 * \code
mbed_official 107:414e9c822e99 798 adc_start_software_conversion(ADC);
mbed_official 107:414e9c822e99 799 while (adc_get_interrupt_status(ADC) & (1 << ADC_CHANNEL_1));
mbed_official 107:414e9c822e99 800 uint32_t result = adc_channel_get_value(ADC, ADC_CHANNEL_1);
mbed_official 107:414e9c822e99 801 \endcode
mbed_official 107:414e9c822e99 802 *
mbed_official 107:414e9c822e99 803 * \subsection adc_basic_use_case_usage_flow Workflow
mbed_official 107:414e9c822e99 804 * -# Start ADC conversion on channel:
mbed_official 107:414e9c822e99 805 * - \code adc_start_software_conversion(ADC); \endcode
mbed_official 107:414e9c822e99 806 * -# Wait for the conversion over:
mbed_official 107:414e9c822e99 807 * - \code while (adc_get_interrupt_status(ADC) & (1 << ADC_CHANNEL_1));
mbed_official 107:414e9c822e99 808 \endcode
mbed_official 107:414e9c822e99 809 * -# Get the conversion result:
mbed_official 107:414e9c822e99 810 * - \code uint32_t result = adc_channel_get_value(ADC, ADC_CHANNEL_1);
mbed_official 107:414e9c822e99 811 \endcode
mbed_official 107:414e9c822e99 812 */
mbed_official 107:414e9c822e99 813 #endif /* ADC2_H_INCLUDED */