mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Mon Nov 09 13:30:11 2015 +0000
Revision:
18:da299f395b9e
Synchronized with git revision f605825f66bb2e462ff7dbc5fb4ed2dbe979d1c3

Full URL: https://github.com/mbedmicro/mbed/commit/f605825f66bb2e462ff7dbc5fb4ed2dbe979d1c3/

Added support for SAML21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 18:da299f395b9e 1 /**
mbed_official 18:da299f395b9e 2 * \file
mbed_official 18:da299f395b9e 3 *
mbed_official 18:da299f395b9e 4 * \brief SAM Peripheral Digital-to-Analog Converter Driver
mbed_official 18:da299f395b9e 5 *
mbed_official 18:da299f395b9e 6 * Copyright (C) 2014-2015 Atmel Corporation. All rights reserved.
mbed_official 18:da299f395b9e 7 *
mbed_official 18:da299f395b9e 8 * \asf_license_start
mbed_official 18:da299f395b9e 9 *
mbed_official 18:da299f395b9e 10 * \page License
mbed_official 18:da299f395b9e 11 *
mbed_official 18:da299f395b9e 12 * Redistribution and use in source and binary forms, with or without
mbed_official 18:da299f395b9e 13 * modification, are permitted provided that the following conditions are met:
mbed_official 18:da299f395b9e 14 *
mbed_official 18:da299f395b9e 15 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 18:da299f395b9e 16 * this list of conditions and the following disclaimer.
mbed_official 18:da299f395b9e 17 *
mbed_official 18:da299f395b9e 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 18:da299f395b9e 19 * this list of conditions and the following disclaimer in the documentation
mbed_official 18:da299f395b9e 20 * and/or other materials provided with the distribution.
mbed_official 18:da299f395b9e 21 *
mbed_official 18:da299f395b9e 22 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 18:da299f395b9e 23 * from this software without specific prior written permission.
mbed_official 18:da299f395b9e 24 *
mbed_official 18:da299f395b9e 25 * 4. This software may only be redistributed and used in connection with an
mbed_official 18:da299f395b9e 26 * Atmel microcontroller product.
mbed_official 18:da299f395b9e 27 *
mbed_official 18:da299f395b9e 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 18:da299f395b9e 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 18:da299f395b9e 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 18:da299f395b9e 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 18:da299f395b9e 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 18:da299f395b9e 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 18:da299f395b9e 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 18:da299f395b9e 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 18:da299f395b9e 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 18:da299f395b9e 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 18:da299f395b9e 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 18:da299f395b9e 39 *
mbed_official 18:da299f395b9e 40 * \asf_license_stop
mbed_official 18:da299f395b9e 41 *
mbed_official 18:da299f395b9e 42 */
mbed_official 18:da299f395b9e 43 /*
mbed_official 18:da299f395b9e 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 18:da299f395b9e 45 */
mbed_official 18:da299f395b9e 46 #ifndef DAC_FEATURE_H_INCLUDED
mbed_official 18:da299f395b9e 47 #define DAC_FEATURE_H_INCLUDED
mbed_official 18:da299f395b9e 48
mbed_official 18:da299f395b9e 49 /**
mbed_official 18:da299f395b9e 50 * \defgroup asfdoc_sam0_dac_group SAM Digital-to-Analog (DAC) Driver
mbed_official 18:da299f395b9e 51 *
mbed_official 18:da299f395b9e 52 * This driver for Atmel&reg; | SMART ARM&reg;-based microcontrollers provides an interface for the conversion of
mbed_official 18:da299f395b9e 53 * digital values to analog voltage. The following driver API modes are covered
mbed_official 18:da299f395b9e 54 * by this manual:
mbed_official 18:da299f395b9e 55 *
mbed_official 18:da299f395b9e 56 * - Polled APIs
mbed_official 18:da299f395b9e 57 * \if DAC_CALLBACK_MODE
mbed_official 18:da299f395b9e 58 * - Callback APIs
mbed_official 18:da299f395b9e 59 * \endif
mbed_official 18:da299f395b9e 60 *
mbed_official 18:da299f395b9e 61 * The following peripheral is used by this module:
mbed_official 18:da299f395b9e 62 * - DAC (Digital-to-Analog Converter)
mbed_official 18:da299f395b9e 63 *
mbed_official 18:da299f395b9e 64 * The following devices can use this module:
mbed_official 18:da299f395b9e 65 * - Atmel | SMART SAM L21
mbed_official 18:da299f395b9e 66 *
mbed_official 18:da299f395b9e 67 * The outline of this documentation is as follows:
mbed_official 18:da299f395b9e 68 * - \ref asfdoc_sam0_dac_prerequisites
mbed_official 18:da299f395b9e 69 * - \ref asfdoc_sam0_dac_module_overview
mbed_official 18:da299f395b9e 70 * - \ref asfdoc_sam0_dac_special_considerations
mbed_official 18:da299f395b9e 71 * - \ref asfdoc_sam0_dac_extra_info
mbed_official 18:da299f395b9e 72 * - \ref asfdoc_sam0_dac_examples
mbed_official 18:da299f395b9e 73 * - \ref asfdoc_sam0_dac_api_overview
mbed_official 18:da299f395b9e 74 *
mbed_official 18:da299f395b9e 75 *
mbed_official 18:da299f395b9e 76 * \section asfdoc_sam0_dac_prerequisites Prerequisites
mbed_official 18:da299f395b9e 77 *
mbed_official 18:da299f395b9e 78 * There are no prerequisites for this module.
mbed_official 18:da299f395b9e 79 *
mbed_official 18:da299f395b9e 80 *
mbed_official 18:da299f395b9e 81 * \section asfdoc_sam0_dac_module_overview Module Overview
mbed_official 18:da299f395b9e 82 *
mbed_official 18:da299f395b9e 83 * The Digital-to-Analog converter converts a digital value to an analog voltage.
mbed_official 18:da299f395b9e 84 * The DAC Controller can operate as two independent DACs or as a single DAC
mbed_official 18:da299f395b9e 85 * in differential mode. Each DAC has a 12-bit resolution and it is capable of
mbed_official 18:da299f395b9e 86 * converting up to 1M samples per second (Msps).
mbed_official 18:da299f395b9e 87 *
mbed_official 18:da299f395b9e 88 * A common use of DAC is to generate audio signals by connecting the DAC
mbed_official 18:da299f395b9e 89 * output to a speaker, or to generate a reference voltage; either for an
mbed_official 18:da299f395b9e 90 * external circuit or an internal peripheral such as the Analog Comparator.
mbed_official 18:da299f395b9e 91 *
mbed_official 18:da299f395b9e 92 * After being set up, the DAC will convert new digital values written to the
mbed_official 18:da299f395b9e 93 * conversion data register (DATA0 or DATA1) to an analog value either on the
mbed_official 18:da299f395b9e 94 * DAC output (VOUT0 or VOUT1) pin of the device, or internally for use as an
mbed_official 18:da299f395b9e 95 * input to the AC, ADC, and other analog modules.
mbed_official 18:da299f395b9e 96 *
mbed_official 18:da299f395b9e 97 * Writing the DATA register will start a new conversion. It is also possible
mbed_official 18:da299f395b9e 98 * to trigger the conversion from the event system.
mbed_official 18:da299f395b9e 99 *
mbed_official 18:da299f395b9e 100 * A simplified block diagram of the DAC can be seen in
mbed_official 18:da299f395b9e 101 * \ref asfdoc_sam0_dac_module_block_diagram "the figure below".
mbed_official 18:da299f395b9e 102 *
mbed_official 18:da299f395b9e 103 * \anchor asfdoc_sam0_dac_module_block_diagram
mbed_official 18:da299f395b9e 104 * \image html dac_block_diagram_saml.svg "DAC Block Diagram"
mbed_official 18:da299f395b9e 105 *
mbed_official 18:da299f395b9e 106 * \subsection asfdoc_sam0_dac_conversion_range Conversion Range
mbed_official 18:da299f395b9e 107 * The conversion range is between GND and the selected voltage reference.
mbed_official 18:da299f395b9e 108 * Available voltage references are:
mbed_official 18:da299f395b9e 109 * \li Voltage supply (VDDANA)
mbed_official 18:da299f395b9e 110 * \li Internal bandgap reference (INTREF)
mbed_official 18:da299f395b9e 111 * \li Unbuffered External voltage reference (VREFPU)
mbed_official 18:da299f395b9e 112 * \li Buffered External voltage reference (VREFPB)
mbed_official 18:da299f395b9e 113 *
mbed_official 18:da299f395b9e 114 * \note Internal references will be enabled by the driver, but not disabled.
mbed_official 18:da299f395b9e 115 * Any reference not used by the application should be disabled by the application.
mbed_official 18:da299f395b9e 116 *
mbed_official 18:da299f395b9e 117 * The output voltage from a DAC channel is given as:
mbed_official 18:da299f395b9e 118 * \f[
mbed_official 18:da299f395b9e 119 * V_{OUTx} = \frac{DATAx}{0x3FF} \times VREF
mbed_official 18:da299f395b9e 120 * \f]
mbed_official 18:da299f395b9e 121 * The differential output voltage is given as:
mbed_official 18:da299f395b9e 122 * \f[
mbed_official 18:da299f395b9e 123 * V_{OUT} = \frac{DATA0}{0x1FF} \times VREF = (V_{OUT0}-V_{OUT1})
mbed_official 18:da299f395b9e 124 * \f]
mbed_official 18:da299f395b9e 125 *
mbed_official 18:da299f395b9e 126 * \subsection asfdoc_sam0_dac_conversion Conversion
mbed_official 18:da299f395b9e 127 * The conversion digital value written to the DATA register will be converted
mbed_official 18:da299f395b9e 128 * to an analog value. Writing the DATA register will start a new conversion.
mbed_official 18:da299f395b9e 129 * It is also possible to write the conversion value to the DATABUF register,
mbed_official 18:da299f395b9e 130 * the writing of the DATA register can then be triggered from the event
mbed_official 18:da299f395b9e 131 * system, which will load the value from DATABUF to DATA.
mbed_official 18:da299f395b9e 132 *
mbed_official 18:da299f395b9e 133 * \subsection asfdoc_sam0_dac_analog_output Analog Output
mbed_official 18:da299f395b9e 134 * The analog output value can be output to the VOUTx converted by DACx, and
mbed_official 18:da299f395b9e 135 * each data conversion can be started independently.
mbed_official 18:da299f395b9e 136 *
mbed_official 18:da299f395b9e 137 * In differential mode, DAC0 and DAC1 are operating synchronously to convert
mbed_official 18:da299f395b9e 138 * value. VOUT0 is the positive output and VOUT1 the negative output.
mbed_official 18:da299f395b9e 139 *
mbed_official 18:da299f395b9e 140 * VOUT0 signal is internally connected so that it can be used as input for
mbed_official 18:da299f395b9e 141 * AC, ADC, or OPAMP modules when DAC0 is enabled.
mbed_official 18:da299f395b9e 142 * \note The pin VOUT0 will be dedicated to internal input and cannot be
mbed_official 18:da299f395b9e 143 * configured as alternate function.
mbed_official 18:da299f395b9e 144 *
mbed_official 18:da299f395b9e 145 * \subsection asfdoc_sam0_dac_events Events
mbed_official 18:da299f395b9e 146 * Events generation and event actions are configurable in the DAC.
mbed_official 18:da299f395b9e 147 * The DAC has one event line input and one event output: <i>Start Conversion</i>
mbed_official 18:da299f395b9e 148 * and <i>Data Buffer Empty</i>.
mbed_official 18:da299f395b9e 149 *
mbed_official 18:da299f395b9e 150 * If the Start Conversion input event is enabled in the module configuration,
mbed_official 18:da299f395b9e 151 * an incoming event will load data from the data buffer to the data register
mbed_official 18:da299f395b9e 152 * and start a new conversion. This method synchronizes conversions with
mbed_official 18:da299f395b9e 153 * external events (such as those from a timer module) and ensures regular and
mbed_official 18:da299f395b9e 154 * fixed conversion intervals.
mbed_official 18:da299f395b9e 155 *
mbed_official 18:da299f395b9e 156 * If the Data Buffer Empty output event is enabled in the module configuration,
mbed_official 18:da299f395b9e 157 * events will be generated when the DAC data buffer register becomes empty and
mbed_official 18:da299f395b9e 158 * new data can be loaded to the buffer.
mbed_official 18:da299f395b9e 159 *
mbed_official 18:da299f395b9e 160 * \note The connection of events between modules requires the use of the
mbed_official 18:da299f395b9e 161 * \ref asfdoc_sam0_events_group "SAM Event System Driver (EVENTS)"
mbed_official 18:da299f395b9e 162 * to route output event of one module to the the input event of another.
mbed_official 18:da299f395b9e 163 * For more information on event routing, refer to the event driver
mbed_official 18:da299f395b9e 164 * documentation.
mbed_official 18:da299f395b9e 165 *
mbed_official 18:da299f395b9e 166 * \subsection asfdoc_sam0_dac_data_adjust Left and Right Adjusted Values
mbed_official 18:da299f395b9e 167 * The 12-bit input value to the DAC is contained in a 16-bit register. This
mbed_official 18:da299f395b9e 168 * can be configured to be either left or right adjusted. In
mbed_official 18:da299f395b9e 169 * \ref asfdoc_sam0_dac_module_adj_modes "the figure below" both options are
mbed_official 18:da299f395b9e 170 * shown, and the position of the most (MSB) and the least (LSB) significant bits
mbed_official 18:da299f395b9e 171 * are indicated. The unused bits should always be written to zero.
mbed_official 18:da299f395b9e 172 *
mbed_official 18:da299f395b9e 173 * \anchor asfdoc_sam0_dac_module_adj_modes
mbed_official 18:da299f395b9e 174 * \dot
mbed_official 18:da299f395b9e 175 * digraph {
mbed_official 18:da299f395b9e 176 * subgraph cluster_right {
mbed_official 18:da299f395b9e 177 * msbl [label="MSB", shape=none, group="msbl"];
mbed_official 18:da299f395b9e 178 * lsbl [label="LSB", shape=none];
mbed_official 18:da299f395b9e 179 * node [shape=none];
mbed_official 18:da299f395b9e 180 * color="white";
mbed_official 18:da299f395b9e 181 * reg_left [label=<
mbed_official 18:da299f395b9e 182 * <table cellspacing="0" cellpadding="2" width="100%">
mbed_official 18:da299f395b9e 183 * <tr>
mbed_official 18:da299f395b9e 184 * <td port="msb">15</td>
mbed_official 18:da299f395b9e 185 * <td>14</td>
mbed_official 18:da299f395b9e 186 * <td>13</td>
mbed_official 18:da299f395b9e 187 * <td>12</td>
mbed_official 18:da299f395b9e 188 * <td>11</td>
mbed_official 18:da299f395b9e 189 * <td>10</td>
mbed_official 18:da299f395b9e 190 * <td>9</td>
mbed_official 18:da299f395b9e 191 * <td>8</td>
mbed_official 18:da299f395b9e 192 * <td>7</td>
mbed_official 18:da299f395b9e 193 * <td>6</td>
mbed_official 18:da299f395b9e 194 * <td>5</td>
mbed_official 18:da299f395b9e 195 * <td port="lsb">4</td>
mbed_official 18:da299f395b9e 196 * <td>3</td>
mbed_official 18:da299f395b9e 197 * <td>2</td>
mbed_official 18:da299f395b9e 198 * <td>1</td>
mbed_official 18:da299f395b9e 199 * <td>0</td>
mbed_official 18:da299f395b9e 200 * </tr>
mbed_official 18:da299f395b9e 201 * <tr>
mbed_official 18:da299f395b9e 202 * <td COLSPAN="12"> DATA[11:0] </td>
mbed_official 18:da299f395b9e 203 * <td BGCOLOR="lightgray"> </td>
mbed_official 18:da299f395b9e 204 * <td BGCOLOR="lightgray"> </td>
mbed_official 18:da299f395b9e 205 * <td BGCOLOR="lightgray"> </td>
mbed_official 18:da299f395b9e 206 * <td BGCOLOR="lightgray"> </td>
mbed_official 18:da299f395b9e 207 * </tr>
mbed_official 18:da299f395b9e 208 * </table>
mbed_official 18:da299f395b9e 209 * >];
mbed_official 18:da299f395b9e 210 * msbl -> reg_left:msb:n;
mbed_official 18:da299f395b9e 211 * lsbl -> reg_left:lsb;
mbed_official 18:da299f395b9e 212 * label ="Left adjusted.\n";
mbed_official 18:da299f395b9e 213 * }
mbed_official 18:da299f395b9e 214 * subgraph cluster_left {
mbed_official 18:da299f395b9e 215 * rankdir=TB;
mbed_official 18:da299f395b9e 216 * msb [label="MSB", shape=none];
mbed_official 18:da299f395b9e 217 * lsb [label="LSB", shape=none];
mbed_official 18:da299f395b9e 218 * color="white";
mbed_official 18:da299f395b9e 219 * node [shape=none];
mbed_official 18:da299f395b9e 220 * reg_right [label=<
mbed_official 18:da299f395b9e 221 * <table cellspacing="0" cellpadding="2">
mbed_official 18:da299f395b9e 222 * <tr>
mbed_official 18:da299f395b9e 223 * <td>15</td>
mbed_official 18:da299f395b9e 224 * <td>14</td>
mbed_official 18:da299f395b9e 225 * <td>13</td>
mbed_official 18:da299f395b9e 226 * <td>12</td>
mbed_official 18:da299f395b9e 227 * <td port="msb">11</td>
mbed_official 18:da299f395b9e 228 * <td>10</td>
mbed_official 18:da299f395b9e 229 * <td>9</td>
mbed_official 18:da299f395b9e 230 * <td>8</td>
mbed_official 18:da299f395b9e 231 * <td>7</td>
mbed_official 18:da299f395b9e 232 * <td>6</td>
mbed_official 18:da299f395b9e 233 * <td>5</td>
mbed_official 18:da299f395b9e 234 * <td>4</td>
mbed_official 18:da299f395b9e 235 * <td>3</td>
mbed_official 18:da299f395b9e 236 * <td>2</td>
mbed_official 18:da299f395b9e 237 * <td>1</td>
mbed_official 18:da299f395b9e 238 * <td port="lsb">0</td>
mbed_official 18:da299f395b9e 239 * </tr>
mbed_official 18:da299f395b9e 240 * <tr>
mbed_official 18:da299f395b9e 241 * <td BGCOLOR="lightgray"></td>
mbed_official 18:da299f395b9e 242 * <td BGCOLOR="lightgray"></td>
mbed_official 18:da299f395b9e 243 * <td BGCOLOR="lightgray"></td>
mbed_official 18:da299f395b9e 244 * <td BGCOLOR="lightgray"></td>
mbed_official 18:da299f395b9e 245 * <td COLSPAN="12"> DATA[11:0] </td>
mbed_official 18:da299f395b9e 246 * </tr>
mbed_official 18:da299f395b9e 247 * </table>
mbed_official 18:da299f395b9e 248 * >];
mbed_official 18:da299f395b9e 249 * msb -> reg_right:msb;
mbed_official 18:da299f395b9e 250 * lsb -> reg_right:lsb:n;
mbed_official 18:da299f395b9e 251 * label = "Right adjusted.\n";
mbed_official 18:da299f395b9e 252 * graph [shape=none];
mbed_official 18:da299f395b9e 253 * }
mbed_official 18:da299f395b9e 254 * }
mbed_official 18:da299f395b9e 255 * \enddot
mbed_official 18:da299f395b9e 256 *
mbed_official 18:da299f395b9e 257 * \subsection asfdoc_sam0_dac_clk_sources Clock Sources
mbed_official 18:da299f395b9e 258 * The clock for the DAC interface (CLK_DAC) is generated by the Power Manager.
mbed_official 18:da299f395b9e 259 * This clock is turned on by default, and can be enabled and disabled in the
mbed_official 18:da299f395b9e 260 * Power Manager.
mbed_official 18:da299f395b9e 261 *
mbed_official 18:da299f395b9e 262 * Additionally, an asynchronous clock source (GCLK_DAC) is required.
mbed_official 18:da299f395b9e 263 * These clocks are normally disabled by default. The selected clock source
mbed_official 18:da299f395b9e 264 * must be enabled in the Power Manager before it can be used by the DAC.
mbed_official 18:da299f395b9e 265 * The DAC core operates asynchronously from the user interface and
mbed_official 18:da299f395b9e 266 * peripheral bus. As a consequence, the DAC needs two clock cycles of both
mbed_official 18:da299f395b9e 267 * CLK_DAC and GCLK_DAC to synchronize the values written to some of the
mbed_official 18:da299f395b9e 268 * control and data registers.
mbed_official 18:da299f395b9e 269 * The oscillator source for the GCLK_DAC clock is selected in the Supply
mbed_official 18:da299f395b9e 270 * Control Interface (SUPC).
mbed_official 18:da299f395b9e 271 *
mbed_official 18:da299f395b9e 272 * \section asfdoc_sam0_dac_special_considerations Special Considerations
mbed_official 18:da299f395b9e 273 *
mbed_official 18:da299f395b9e 274 * \subsection asfdoc_sam0_dac_special_considerations_sleep Sleep Mode
mbed_official 18:da299f395b9e 275 * The DAC can do conversions in Active or Idle modes, and will continue the
mbed_official 18:da299f395b9e 276 * conversions in standby sleep mode if the RUNSTDBY bit in the DACCTRLx
mbed_official 18:da299f395b9e 277 * register is set. Otherwise, the DACx will stop conversions.
mbed_official 18:da299f395b9e 278 *
mbed_official 18:da299f395b9e 279 * If DACx conversion is stopped in standby sleep mode, DACx is disabled to
mbed_official 18:da299f395b9e 280 * reduce power consumption. When exiting standby sleep mode, DACx is enabled
mbed_official 18:da299f395b9e 281 * therefore startup time is required before starting a new conversion.
mbed_official 18:da299f395b9e 282 *
mbed_official 18:da299f395b9e 283 * \subsection asfdoc_sam0_dac_special_considerations_conversion_time Conversion Time
mbed_official 18:da299f395b9e 284 * DAC conversion time is approximately 2.85µs. The user must ensure that new
mbed_official 18:da299f395b9e 285 * data is not written to the DAC before the last conversion is complete.
mbed_official 18:da299f395b9e 286 * Conversions should be triggered by a periodic event from a Timer/Counter or
mbed_official 18:da299f395b9e 287 * another peripheral.
mbed_official 18:da299f395b9e 288 *
mbed_official 18:da299f395b9e 289 *
mbed_official 18:da299f395b9e 290 * \section asfdoc_sam0_dac_extra_info Extra Information
mbed_official 18:da299f395b9e 291 *
mbed_official 18:da299f395b9e 292 * For extra information, see \ref asfdoc_sam0_dac_extra. This includes:
mbed_official 18:da299f395b9e 293 * - \ref asfdoc_sam0_dac_extra_acronyms
mbed_official 18:da299f395b9e 294 * - \ref asfdoc_sam0_dac_extra_dependencies
mbed_official 18:da299f395b9e 295 * - \ref asfdoc_sam0_dac_extra_errata
mbed_official 18:da299f395b9e 296 * - \ref asfdoc_sam0_dac_extra_history
mbed_official 18:da299f395b9e 297 *
mbed_official 18:da299f395b9e 298 *
mbed_official 18:da299f395b9e 299 * \section asfdoc_sam0_dac_examples Examples
mbed_official 18:da299f395b9e 300 *
mbed_official 18:da299f395b9e 301 * For a list of examples related to this driver, see
mbed_official 18:da299f395b9e 302 * \ref asfdoc_sam0_dac_exqsg.
mbed_official 18:da299f395b9e 303 *
mbed_official 18:da299f395b9e 304 *
mbed_official 18:da299f395b9e 305 * \section asfdoc_sam0_dac_api_overview API Overview
mbed_official 18:da299f395b9e 306 * @{
mbed_official 18:da299f395b9e 307 */
mbed_official 18:da299f395b9e 308
mbed_official 18:da299f395b9e 309 #ifdef __cplusplus
mbed_official 18:da299f395b9e 310 extern "C" {
mbed_official 18:da299f395b9e 311 #endif
mbed_official 18:da299f395b9e 312
mbed_official 18:da299f395b9e 313 #include <compiler.h>
mbed_official 18:da299f395b9e 314 #include <clock.h>
mbed_official 18:da299f395b9e 315 #include <gclk.h>
mbed_official 18:da299f395b9e 316
mbed_official 18:da299f395b9e 317
mbed_official 18:da299f395b9e 318 /**
mbed_official 18:da299f395b9e 319 * \name DAC Status Flags
mbed_official 18:da299f395b9e 320 *
mbed_official 18:da299f395b9e 321 * DAC status flags, returned by \ref dac_get_status() and cleared by
mbed_official 18:da299f395b9e 322 * \ref dac_clear_status().
mbed_official 18:da299f395b9e 323 * @{
mbed_official 18:da299f395b9e 324 */
mbed_official 18:da299f395b9e 325
mbed_official 18:da299f395b9e 326 /** Data Buffer Empty Channel 0 - Set when data is transferred from DATABUF
mbed_official 18:da299f395b9e 327 * to DATA by a start conversion event and DATABUF is ready for new data.
mbed_official 18:da299f395b9e 328 */
mbed_official 18:da299f395b9e 329 #define DAC_STATUS_CHANNEL_0_EMPTY (1UL << 0)
mbed_official 18:da299f395b9e 330
mbed_official 18:da299f395b9e 331 /** Data Buffer Empty Channel 1 - Set when data is transferred from DATABUF
mbed_official 18:da299f395b9e 332 * to DATA by a start conversion event and DATABUF is ready for new data.
mbed_official 18:da299f395b9e 333 */
mbed_official 18:da299f395b9e 334 #define DAC_STATUS_CHANNEL_1_EMPTY (1UL << 1)
mbed_official 18:da299f395b9e 335
mbed_official 18:da299f395b9e 336 /** Underrun Channel 0 - Set when a start conversion event occurs when
mbed_official 18:da299f395b9e 337 * DATABUF is empty.
mbed_official 18:da299f395b9e 338 */
mbed_official 18:da299f395b9e 339 #define DAC_STATUS_CHANNEL_0_UNDERRUN (1UL << 2)
mbed_official 18:da299f395b9e 340
mbed_official 18:da299f395b9e 341 /** Underrun Channel 1 - Set when a start conversion event occurs when
mbed_official 18:da299f395b9e 342 * DATABUF is empty.
mbed_official 18:da299f395b9e 343 */
mbed_official 18:da299f395b9e 344 #define DAC_STATUS_CHANNEL_1_UNDERRUN (1UL << 3)
mbed_official 18:da299f395b9e 345
mbed_official 18:da299f395b9e 346 /** @} */
mbed_official 18:da299f395b9e 347
mbed_official 18:da299f395b9e 348 /**
mbed_official 18:da299f395b9e 349 * \brief DAC reference voltage enum.
mbed_official 18:da299f395b9e 350 *
mbed_official 18:da299f395b9e 351 * Enum for the possible reference voltages for the DAC.
mbed_official 18:da299f395b9e 352 */
mbed_official 18:da299f395b9e 353 enum dac_reference {
mbed_official 18:da299f395b9e 354 /** Unbuffered external voltage reference */
mbed_official 18:da299f395b9e 355 DAC_REFERENCE_VREFPU = DAC_CTRLB_REFSEL(0),
mbed_official 18:da299f395b9e 356 /** Analog VCC as reference */
mbed_official 18:da299f395b9e 357 DAC_REFERENCE_VDDANA = DAC_CTRLB_REFSEL(1),
mbed_official 18:da299f395b9e 358 /** Buffered external voltage reference */
mbed_official 18:da299f395b9e 359 DAC_REFERENCE_VREFPB = DAC_CTRLB_REFSEL(2),
mbed_official 18:da299f395b9e 360 /** Internal bandgap reference */
mbed_official 18:da299f395b9e 361 DAC_REFERENCE_INTREF = DAC_CTRLB_REFSEL(3),
mbed_official 18:da299f395b9e 362 };
mbed_official 18:da299f395b9e 363
mbed_official 18:da299f395b9e 364 /**
mbed_official 18:da299f395b9e 365 * \brief DAC current control enum.
mbed_official 18:da299f395b9e 366 *
mbed_official 18:da299f395b9e 367 * Enum for the current in output buffer according the conversion rate.
mbed_official 18:da299f395b9e 368 */
mbed_official 18:da299f395b9e 369 enum dac_current_ctrl {
mbed_official 18:da299f395b9e 370 /** 1MHz < GCLK_DAC < 12MHz */
mbed_official 18:da299f395b9e 371 DAC_CURRENT_12M = DAC_DACCTRL_CCTRL(0),
mbed_official 18:da299f395b9e 372 /** 100KHz < GCLK_DAC < 1MHz */
mbed_official 18:da299f395b9e 373 DAC_CURRENT_1M = DAC_DACCTRL_CCTRL(1),
mbed_official 18:da299f395b9e 374 /** 10KHz < GCLK_DAC < 100KHz */
mbed_official 18:da299f395b9e 375 DAC_CURRENT_100K = DAC_DACCTRL_CCTRL(2),
mbed_official 18:da299f395b9e 376 /** GCLK_DAC < 10KHz */
mbed_official 18:da299f395b9e 377 DAC_CURRENT_10K = DAC_DACCTRL_CCTRL(3),
mbed_official 18:da299f395b9e 378 };
mbed_official 18:da299f395b9e 379
mbed_official 18:da299f395b9e 380 /**
mbed_official 18:da299f395b9e 381 * \brief DAC channel selection enum.
mbed_official 18:da299f395b9e 382 *
mbed_official 18:da299f395b9e 383 * Enum for the DAC channel selection.
mbed_official 18:da299f395b9e 384 */
mbed_official 18:da299f395b9e 385 enum dac_channel {
mbed_official 18:da299f395b9e 386 /** DAC output channel 0 */
mbed_official 18:da299f395b9e 387 DAC_CHANNEL_0,
mbed_official 18:da299f395b9e 388 /** DAC output channel 1 */
mbed_official 18:da299f395b9e 389 DAC_CHANNEL_1,
mbed_official 18:da299f395b9e 390 #if !defined(__DOXYGEN__)
mbed_official 18:da299f395b9e 391 DAC_CHANNEL_N,
mbed_official 18:da299f395b9e 392 #endif
mbed_official 18:da299f395b9e 393 };
mbed_official 18:da299f395b9e 394
mbed_official 18:da299f395b9e 395 /**
mbed_official 18:da299f395b9e 396 * \brief DAC software device instance structure.
mbed_official 18:da299f395b9e 397 *
mbed_official 18:da299f395b9e 398 * DAC software instance structure, used to retain software state information
mbed_official 18:da299f395b9e 399 * of an associated hardware module instance.
mbed_official 18:da299f395b9e 400 *
mbed_official 18:da299f395b9e 401 * \note The fields of this structure should not be altered by the user
mbed_official 18:da299f395b9e 402 * application; they are reserved for module-internal use only.
mbed_official 18:da299f395b9e 403 */
mbed_official 18:da299f395b9e 404 struct dac_module {
mbed_official 18:da299f395b9e 405 #if !defined(__DOXYGEN__)
mbed_official 18:da299f395b9e 406 /** DAC hardware module */
mbed_official 18:da299f395b9e 407 Dac *hw;
mbed_official 18:da299f395b9e 408 /** Reference selection */
mbed_official 18:da299f395b9e 409 enum dac_reference reference;
mbed_official 18:da299f395b9e 410 /** DAC event selection */
mbed_official 18:da299f395b9e 411 bool start_on_event[DAC_CHANNEL_N];
mbed_official 18:da299f395b9e 412 # if DAC_CALLBACK_MODE == true
mbed_official 18:da299f395b9e 413 /** Pointer to buffer used for ADC results */
mbed_official 18:da299f395b9e 414 volatile uint16_t *job_buffer[DAC_CHANNEL_N];
mbed_official 18:da299f395b9e 415 /** Remaining number of conversions in current job */
mbed_official 18:da299f395b9e 416 volatile uint16_t remaining_conversions[DAC_CHANNEL_N];
mbed_official 18:da299f395b9e 417 /** Transferred number of conversions in current job */
mbed_official 18:da299f395b9e 418 volatile uint16_t transferred_conversions[DAC_CHANNEL_N];
mbed_official 18:da299f395b9e 419 /** DAC callback enable */
mbed_official 18:da299f395b9e 420 bool callback_enable[DAC_CHANNEL_N][DAC_CALLBACK_N];
mbed_official 18:da299f395b9e 421 /** DAC registered callback functions */
mbed_official 18:da299f395b9e 422 dac_callback_t callback[DAC_CHANNEL_N][DAC_CALLBACK_N];
mbed_official 18:da299f395b9e 423 /** Holds the status of the ongoing or last conversion job */
mbed_official 18:da299f395b9e 424 volatile enum status_code job_status[DAC_CHANNEL_N];
mbed_official 18:da299f395b9e 425 # endif
mbed_official 18:da299f395b9e 426 #endif
mbed_official 18:da299f395b9e 427 };
mbed_official 18:da299f395b9e 428
mbed_official 18:da299f395b9e 429 /**
mbed_official 18:da299f395b9e 430 * \brief DAC configuration structure.
mbed_official 18:da299f395b9e 431 *
mbed_official 18:da299f395b9e 432 * Configuration structure for a DAC instance. This structure should be
mbed_official 18:da299f395b9e 433 * initialized by the \ref dac_get_config_defaults()
mbed_official 18:da299f395b9e 434 * function before being modified by the user application.
mbed_official 18:da299f395b9e 435 */
mbed_official 18:da299f395b9e 436 struct dac_config {
mbed_official 18:da299f395b9e 437 /** Differential mode enable data */
mbed_official 18:da299f395b9e 438 bool differential_mode;
mbed_official 18:da299f395b9e 439 /** Reference voltage */
mbed_official 18:da299f395b9e 440 enum dac_reference reference;
mbed_official 18:da299f395b9e 441 /** GCLK generator used to clock the peripheral */
mbed_official 18:da299f395b9e 442 enum gclk_generator clock_source;
mbed_official 18:da299f395b9e 443 };
mbed_official 18:da299f395b9e 444
mbed_official 18:da299f395b9e 445 /**
mbed_official 18:da299f395b9e 446 * \brief DAC channel configuration structure.
mbed_official 18:da299f395b9e 447 *
mbed_official 18:da299f395b9e 448 * Configuration for a DAC channel. This structure should be initialized by the
mbed_official 18:da299f395b9e 449 * \ref dac_chan_get_config_defaults() function before being modified by the
mbed_official 18:da299f395b9e 450 * user application.
mbed_official 18:da299f395b9e 451 */
mbed_official 18:da299f395b9e 452 struct dac_chan_config {
mbed_official 18:da299f395b9e 453 /** Left adjusted data */
mbed_official 18:da299f395b9e 454 bool left_adjust;
mbed_official 18:da299f395b9e 455 /** Current control data */
mbed_official 18:da299f395b9e 456 enum dac_current_ctrl current;
mbed_official 18:da299f395b9e 457 /**
mbed_official 18:da299f395b9e 458 * The DAC behaves as in normal mode when the chip enters STANDBY sleep
mbed_official 18:da299f395b9e 459 * mode
mbed_official 18:da299f395b9e 460 */
mbed_official 18:da299f395b9e 461 bool run_in_standby;
mbed_official 18:da299f395b9e 462 /** Dither mode enable data */
mbed_official 18:da299f395b9e 463 bool dither_mode;
mbed_official 18:da299f395b9e 464 /**
mbed_official 18:da299f395b9e 465 * The DAC conversion refreshed periodically when used to generate a static
mbed_official 18:da299f395b9e 466 * voltage
mbed_official 18:da299f395b9e 467 */
mbed_official 18:da299f395b9e 468 uint8_t refresh_period;
mbed_official 18:da299f395b9e 469 };
mbed_official 18:da299f395b9e 470
mbed_official 18:da299f395b9e 471 /**
mbed_official 18:da299f395b9e 472 * \brief DAC event enable/disable structure.
mbed_official 18:da299f395b9e 473 *
mbed_official 18:da299f395b9e 474 * Event flags for the DAC module. This is used to enable and
mbed_official 18:da299f395b9e 475 * disable events via \ref dac_enable_events() and \ref dac_disable_events().
mbed_official 18:da299f395b9e 476 */
mbed_official 18:da299f395b9e 477 struct dac_events {
mbed_official 18:da299f395b9e 478 /** Start a new DAC0 conversion */
mbed_official 18:da299f395b9e 479 bool on_event_chan0_start_conversion;
mbed_official 18:da299f395b9e 480 /** Start a new DAC1 conversion */
mbed_official 18:da299f395b9e 481 bool on_event_chan1_start_conversion;
mbed_official 18:da299f395b9e 482 /** Enable event generation on DAC0 data buffer empty */
mbed_official 18:da299f395b9e 483 bool generate_event_on_chan0_buffer_empty;
mbed_official 18:da299f395b9e 484 /** Enable event generation on DAC1 data buffer empty */
mbed_official 18:da299f395b9e 485 bool generate_event_on_chan1_buffer_empty;
mbed_official 18:da299f395b9e 486 /** Enable the falling edge of the input event for DAC0 */
mbed_official 18:da299f395b9e 487 bool generate_event_on_chan0_falling_edge;
mbed_official 18:da299f395b9e 488 /** Enable the falling edge of the input event for DAC1 */
mbed_official 18:da299f395b9e 489 bool generate_event_on_chan1_falling_edge;
mbed_official 18:da299f395b9e 490 };
mbed_official 18:da299f395b9e 491
mbed_official 18:da299f395b9e 492 /**
mbed_official 18:da299f395b9e 493 * \name Status Management (Channel)
mbed_official 18:da299f395b9e 494 * @{
mbed_official 18:da299f395b9e 495 */
mbed_official 18:da299f395b9e 496 bool dac_chan_is_end_of_conversion(
mbed_official 18:da299f395b9e 497 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 498 enum dac_channel channel);
mbed_official 18:da299f395b9e 499 /** @} */
mbed_official 18:da299f395b9e 500
mbed_official 18:da299f395b9e 501 /** @} */
mbed_official 18:da299f395b9e 502
mbed_official 18:da299f395b9e 503 /**
mbed_official 18:da299f395b9e 504 * \page asfdoc_sam0_dac_extra Extra Information for DAC Driver
mbed_official 18:da299f395b9e 505 *
mbed_official 18:da299f395b9e 506 * \section asfdoc_sam0_dac_extra_acronyms Acronyms
mbed_official 18:da299f395b9e 507 * The table below presents the acronyms used in this module:
mbed_official 18:da299f395b9e 508 *
mbed_official 18:da299f395b9e 509 * <table>
mbed_official 18:da299f395b9e 510 * <tr>
mbed_official 18:da299f395b9e 511 * <th>Acronym</th>
mbed_official 18:da299f395b9e 512 * <th>Description</th>
mbed_official 18:da299f395b9e 513 * </tr>
mbed_official 18:da299f395b9e 514 * <tr>
mbed_official 18:da299f395b9e 515 * <td>ADC</td>
mbed_official 18:da299f395b9e 516 * <td>Analog-to-Digital Converter</td>
mbed_official 18:da299f395b9e 517 * </tr>
mbed_official 18:da299f395b9e 518 * <tr>
mbed_official 18:da299f395b9e 519 * <td>AC</td>
mbed_official 18:da299f395b9e 520 * <td>Analog Comparator</td>
mbed_official 18:da299f395b9e 521 * </tr>
mbed_official 18:da299f395b9e 522 * <tr>
mbed_official 18:da299f395b9e 523 * <td>DAC</td>
mbed_official 18:da299f395b9e 524 * <td>Digital-to-Analog Converter</td>
mbed_official 18:da299f395b9e 525 * </tr>
mbed_official 18:da299f395b9e 526 * <tr>
mbed_official 18:da299f395b9e 527 * <td>LSB</td>
mbed_official 18:da299f395b9e 528 * <td>Least Significant Bit</td>
mbed_official 18:da299f395b9e 529 * </tr>
mbed_official 18:da299f395b9e 530 * <tr>
mbed_official 18:da299f395b9e 531 * <td>MSB</td>
mbed_official 18:da299f395b9e 532 * <td>Most Significant Bit</td>
mbed_official 18:da299f395b9e 533 * </tr>
mbed_official 18:da299f395b9e 534 * <tr>
mbed_official 18:da299f395b9e 535 * <td>DMA</td>
mbed_official 18:da299f395b9e 536 * <td>Direct Memory Access</td>
mbed_official 18:da299f395b9e 537 * </tr>
mbed_official 18:da299f395b9e 538 * </table>
mbed_official 18:da299f395b9e 539 *
mbed_official 18:da299f395b9e 540 *
mbed_official 18:da299f395b9e 541 * \section asfdoc_sam0_dac_extra_dependencies Dependencies
mbed_official 18:da299f395b9e 542 * This driver has the following dependency:
mbed_official 18:da299f395b9e 543 *
mbed_official 18:da299f395b9e 544 * - \ref asfdoc_sam0_system_pinmux_group "System Pin Multiplexer Driver"
mbed_official 18:da299f395b9e 545 *
mbed_official 18:da299f395b9e 546 *
mbed_official 18:da299f395b9e 547 * \section asfdoc_sam0_dac_extra_errata Errata
mbed_official 18:da299f395b9e 548 * There are no errata related to this driver.
mbed_official 18:da299f395b9e 549 *
mbed_official 18:da299f395b9e 550 *
mbed_official 18:da299f395b9e 551 * \section asfdoc_sam0_dac_extra_history Module History
mbed_official 18:da299f395b9e 552 * An overview of the module history is presented in the table below, with
mbed_official 18:da299f395b9e 553 * details on the enhancements and fixes made to the module since its first
mbed_official 18:da299f395b9e 554 * release. The current version of this corresponds to the newest version in
mbed_official 18:da299f395b9e 555 * the table.
mbed_official 18:da299f395b9e 556 *
mbed_official 18:da299f395b9e 557 * <table>
mbed_official 18:da299f395b9e 558 * <tr>
mbed_official 18:da299f395b9e 559 * <th>Changelog</th>
mbed_official 18:da299f395b9e 560 * </tr>
mbed_official 18:da299f395b9e 561 * <tr>
mbed_official 18:da299f395b9e 562 * <td>Initial Release</td>
mbed_official 18:da299f395b9e 563 * </tr>
mbed_official 18:da299f395b9e 564 * </table>
mbed_official 18:da299f395b9e 565 */
mbed_official 18:da299f395b9e 566
mbed_official 18:da299f395b9e 567 /**
mbed_official 18:da299f395b9e 568 * \page asfdoc_sam0_dac_exqsg Examples for DAC Driver
mbed_official 18:da299f395b9e 569 *
mbed_official 18:da299f395b9e 570 * This is a list of the available Quick Start guides (QSGs) and example
mbed_official 18:da299f395b9e 571 * applications for \ref asfdoc_sam0_dac_group. QSGs are simple examples with
mbed_official 18:da299f395b9e 572 * step-by-step instructions to configure and use this driver in a selection of
mbed_official 18:da299f395b9e 573 * use cases. Note that a QSG can be compiled as a standalone application or be
mbed_official 18:da299f395b9e 574 * added to the user application.
mbed_official 18:da299f395b9e 575 *
mbed_official 18:da299f395b9e 576 * - \subpage asfdoc_sam0_dac_basic_use_case
mbed_official 18:da299f395b9e 577 * \if DAC_CALLBACK_MODE
mbed_official 18:da299f395b9e 578 * - \subpage asfdoc_sam0_dac_basic_use_case_callback
mbed_official 18:da299f395b9e 579 * \endif
mbed_official 18:da299f395b9e 580 * \if DAC_DMA_USE_MODE_SELECTION
mbed_official 18:da299f395b9e 581 * - \subpage asfdoc_sam0_adc_dma_use_case_dac_in_dma
mbed_official 18:da299f395b9e 582 * \endif
mbed_official 18:da299f395b9e 583 *
mbed_official 18:da299f395b9e 584 * \if DAC_DMA_USE_MODE_SELECTION
mbed_official 18:da299f395b9e 585 * \page asfdoc_sam0_adc_dma_use_case_dac_in_dma Quick Start Guide for Using DMA with ADC/DAC
mbed_official 18:da299f395b9e 586 * For this examples, see
mbed_official 18:da299f395b9e 587 * \ref asfdoc_sam0_adc_dma_use_case
mbed_official 18:da299f395b9e 588 * \endif
mbed_official 18:da299f395b9e 589 *
mbed_official 18:da299f395b9e 590 * \page asfdoc_sam0_dac_document_revision_history Document Revision History
mbed_official 18:da299f395b9e 591 *
mbed_official 18:da299f395b9e 592 * <table>
mbed_official 18:da299f395b9e 593 * <tr>
mbed_official 18:da299f395b9e 594 * <th>Doc. Rev.</td>
mbed_official 18:da299f395b9e 595 * <th>Date</td>
mbed_official 18:da299f395b9e 596 * <th>Comments</td>
mbed_official 18:da299f395b9e 597 * </tr>
mbed_official 18:da299f395b9e 598 * <tr>
mbed_official 18:da299f395b9e 599 * <td>42450A</td>
mbed_official 18:da299f395b9e 600 * <td>07/2015</td>
mbed_official 18:da299f395b9e 601 * <td>Initial document release</td>
mbed_official 18:da299f395b9e 602 * </tr>
mbed_official 18:da299f395b9e 603 * </table>
mbed_official 18:da299f395b9e 604 */
mbed_official 18:da299f395b9e 605 #ifdef __cplusplus
mbed_official 18:da299f395b9e 606 }
mbed_official 18:da299f395b9e 607 #endif
mbed_official 18:da299f395b9e 608
mbed_official 18:da299f395b9e 609
mbed_official 18:da299f395b9e 610 #endif /* DAC_FEATURE_H_INCLUDED */
mbed_official 18:da299f395b9e 611