mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
screamer
Date:
Tue Aug 02 14:07:36 2016 +0000
Revision:
144:423e1876dc07
Parent:
18:da299f395b9e
Added targets.json file for the supported targets in the release

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 #include "dac.h"
mbed_official 18:da299f395b9e 47 #include <system.h>
mbed_official 18:da299f395b9e 48 #include <pinmux.h>
mbed_official 18:da299f395b9e 49
mbed_official 18:da299f395b9e 50 /**
mbed_official 18:da299f395b9e 51 * \internal Writes a DAC configuration to the hardware module.
mbed_official 18:da299f395b9e 52 *
mbed_official 18:da299f395b9e 53 * Writes out a given configuration to the hardware module.
mbed_official 18:da299f395b9e 54 *
mbed_official 18:da299f395b9e 55 * \param[out] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 56 * \param[in] config Pointer to the configuration struct
mbed_official 18:da299f395b9e 57 *
mbed_official 18:da299f395b9e 58 */
mbed_official 18:da299f395b9e 59 static void _dac_set_config(
mbed_official 18:da299f395b9e 60 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 61 struct dac_config *const config)
mbed_official 18:da299f395b9e 62 {
mbed_official 18:da299f395b9e 63 /* Sanity check arguments */
mbed_official 18:da299f395b9e 64 Assert(module_inst);
mbed_official 18:da299f395b9e 65 Assert(config);
mbed_official 18:da299f395b9e 66 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 67
mbed_official 18:da299f395b9e 68 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 69
mbed_official 18:da299f395b9e 70 /* Set selected DAC start on event to be disable when enabling the module */
mbed_official 18:da299f395b9e 71 module_inst->start_on_event[DAC_CHANNEL_0] = false;
mbed_official 18:da299f395b9e 72 module_inst->start_on_event[DAC_CHANNEL_1] = false;
mbed_official 18:da299f395b9e 73
mbed_official 18:da299f395b9e 74 uint32_t new_ctrlb = 0;
mbed_official 18:da299f395b9e 75
mbed_official 18:da299f395b9e 76 /* Enable DAC in differential mode if configured */
mbed_official 18:da299f395b9e 77 if (config->differential_mode) {
mbed_official 18:da299f395b9e 78 new_ctrlb |= DAC_CTRLB_DIFF;
mbed_official 18:da299f395b9e 79 }
mbed_official 18:da299f395b9e 80
mbed_official 18:da299f395b9e 81 /* Set reference voltage */
mbed_official 18:da299f395b9e 82 new_ctrlb |= config->reference;
mbed_official 18:da299f395b9e 83
mbed_official 18:da299f395b9e 84 /* Apply the new configuration to the hardware module */
mbed_official 18:da299f395b9e 85 dac_module->CTRLB.reg = new_ctrlb;
mbed_official 18:da299f395b9e 86 }
mbed_official 18:da299f395b9e 87
mbed_official 18:da299f395b9e 88 /**
mbed_official 18:da299f395b9e 89 * \brief Determines if the hardware module(s) are currently synchronizing to the bus.
mbed_official 18:da299f395b9e 90 *
mbed_official 18:da299f395b9e 91 * Checks to see if the underlying hardware peripheral module(s) are currently
mbed_official 18:da299f395b9e 92 * synchronizing across multiple clock domains to the hardware bus. This
mbed_official 18:da299f395b9e 93 * function can be used to delay further operations on a module until such time
mbed_official 18:da299f395b9e 94 * that it is ready, to prevent blocking delays for synchronization in the
mbed_official 18:da299f395b9e 95 * user application.
mbed_official 18:da299f395b9e 96 *
mbed_official 18:da299f395b9e 97 * \param[in] dev_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 98 *
mbed_official 18:da299f395b9e 99 * \return Synchronization status of the underlying hardware module(s).
mbed_official 18:da299f395b9e 100 *
mbed_official 18:da299f395b9e 101 * \retval true If the module synchronization is ongoing
mbed_official 18:da299f395b9e 102 * \retval false If the module has completed synchronization
mbed_official 18:da299f395b9e 103 */
mbed_official 18:da299f395b9e 104 bool dac_is_syncing(
mbed_official 18:da299f395b9e 105 struct dac_module *const dev_inst)
mbed_official 18:da299f395b9e 106 {
mbed_official 18:da299f395b9e 107 /* Sanity check arguments */
mbed_official 18:da299f395b9e 108 Assert(dev_inst);
mbed_official 18:da299f395b9e 109
mbed_official 18:da299f395b9e 110 Dac *const dac_module = dev_inst->hw;
mbed_official 18:da299f395b9e 111
mbed_official 18:da299f395b9e 112 if (dac_module->SYNCBUSY.reg) {
mbed_official 18:da299f395b9e 113 return true;
mbed_official 18:da299f395b9e 114 }
mbed_official 18:da299f395b9e 115
mbed_official 18:da299f395b9e 116 return false;
mbed_official 18:da299f395b9e 117 }
mbed_official 18:da299f395b9e 118
mbed_official 18:da299f395b9e 119 /**
mbed_official 18:da299f395b9e 120 * \brief Initializes a DAC configuration structure to defaults.
mbed_official 18:da299f395b9e 121 *
mbed_official 18:da299f395b9e 122 * Initializes a given DAC configuration structure to a set of
mbed_official 18:da299f395b9e 123 * known default values. This function should be called on any new
mbed_official 18:da299f395b9e 124 * instance of the configuration structures before being modified by the
mbed_official 18:da299f395b9e 125 * user application.
mbed_official 18:da299f395b9e 126 *
mbed_official 18:da299f395b9e 127 * The default configuration is as follows:
mbed_official 18:da299f395b9e 128 * \li 1V from internal bandgap reference
mbed_official 18:da299f395b9e 129 * \li Drive the DAC output to the VOUT pin
mbed_official 18:da299f395b9e 130 * \li Right adjust data
mbed_official 18:da299f395b9e 131 * \li GCLK generator 0 (GCLK main) clock source
mbed_official 18:da299f395b9e 132 * \li The output buffer is disabled when the chip enters STANDBY sleep
mbed_official 18:da299f395b9e 133 * mode
mbed_official 18:da299f395b9e 134 *
mbed_official 18:da299f395b9e 135 * \param[out] config Configuration structure to initialize to default values
mbed_official 18:da299f395b9e 136 */
mbed_official 18:da299f395b9e 137 void dac_get_config_defaults(
mbed_official 18:da299f395b9e 138 struct dac_config *const config)
mbed_official 18:da299f395b9e 139 {
mbed_official 18:da299f395b9e 140 /* Sanity check arguments */
mbed_official 18:da299f395b9e 141 Assert(config);
mbed_official 18:da299f395b9e 142
mbed_official 18:da299f395b9e 143 /* Default configuration values */
mbed_official 18:da299f395b9e 144 config->differential_mode = false;
mbed_official 18:da299f395b9e 145 config->reference = DAC_REFERENCE_INTREF;
mbed_official 18:da299f395b9e 146 config->clock_source = GCLK_GENERATOR_0;
mbed_official 18:da299f395b9e 147 }
mbed_official 18:da299f395b9e 148
mbed_official 18:da299f395b9e 149 /**
mbed_official 18:da299f395b9e 150 * \brief Initialize the DAC device struct.
mbed_official 18:da299f395b9e 151 *
mbed_official 18:da299f395b9e 152 * Use this function to initialize the Digital to Analog Converter. Resets the
mbed_official 18:da299f395b9e 153 * underlying hardware module and configures it.
mbed_official 18:da299f395b9e 154 *
mbed_official 18:da299f395b9e 155 * \note The DAC channel must be configured separately.
mbed_official 18:da299f395b9e 156 *
mbed_official 18:da299f395b9e 157 * \param[out] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 158 * \param[in] module Pointer to the DAC module instance
mbed_official 18:da299f395b9e 159 * \param[in] config Pointer to the config struct, created by the user
mbed_official 18:da299f395b9e 160 * application
mbed_official 18:da299f395b9e 161 *
mbed_official 18:da299f395b9e 162 * \return Status of initialization.
mbed_official 18:da299f395b9e 163 * \retval STATUS_OK Module initiated correctly
mbed_official 18:da299f395b9e 164 * \retval STATUS_ERR_DENIED If module is enabled
mbed_official 18:da299f395b9e 165 * \retval STATUS_BUSY If module is busy resetting
mbed_official 18:da299f395b9e 166 */
mbed_official 18:da299f395b9e 167 enum status_code dac_init(
mbed_official 18:da299f395b9e 168 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 169 Dac *const module,
mbed_official 18:da299f395b9e 170 struct dac_config *const config)
mbed_official 18:da299f395b9e 171 {
mbed_official 18:da299f395b9e 172 /* Sanity check arguments */
mbed_official 18:da299f395b9e 173 Assert(module_inst);
mbed_official 18:da299f395b9e 174 Assert(module);
mbed_official 18:da299f395b9e 175 Assert(config);
mbed_official 18:da299f395b9e 176
mbed_official 18:da299f395b9e 177 /* Initialize device instance */
mbed_official 18:da299f395b9e 178 module_inst->hw = module;
mbed_official 18:da299f395b9e 179
mbed_official 18:da299f395b9e 180 /* Turn on the digital interface clock */
mbed_official 18:da299f395b9e 181 system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, MCLK_APBCMASK_DAC);
mbed_official 18:da299f395b9e 182
mbed_official 18:da299f395b9e 183 /* Check if module is enabled. */
mbed_official 18:da299f395b9e 184 if (module->CTRLA.reg & DAC_CTRLA_ENABLE) {
mbed_official 18:da299f395b9e 185 return STATUS_ERR_DENIED;
mbed_official 18:da299f395b9e 186 }
mbed_official 18:da299f395b9e 187
mbed_official 18:da299f395b9e 188 /* Check if reset is in progress. */
mbed_official 18:da299f395b9e 189 if (module->CTRLA.reg & DAC_CTRLA_SWRST) {
mbed_official 18:da299f395b9e 190 return STATUS_BUSY;
mbed_official 18:da299f395b9e 191 }
mbed_official 18:da299f395b9e 192
mbed_official 18:da299f395b9e 193 /* Configure GCLK channel and enable clock */
mbed_official 18:da299f395b9e 194 struct system_gclk_chan_config gclk_chan_conf;
mbed_official 18:da299f395b9e 195 system_gclk_chan_get_config_defaults(&gclk_chan_conf);
mbed_official 18:da299f395b9e 196 gclk_chan_conf.source_generator = config->clock_source;
mbed_official 18:da299f395b9e 197 system_gclk_chan_set_config(DAC_GCLK_ID, &gclk_chan_conf);
mbed_official 18:da299f395b9e 198 system_gclk_chan_enable(DAC_GCLK_ID);
mbed_official 18:da299f395b9e 199
mbed_official 18:da299f395b9e 200 /* Write configuration to module */
mbed_official 18:da299f395b9e 201 _dac_set_config(module_inst, config);
mbed_official 18:da299f395b9e 202
mbed_official 18:da299f395b9e 203 /* Store reference selection for later use */
mbed_official 18:da299f395b9e 204 module_inst->reference = config->reference;
mbed_official 18:da299f395b9e 205
mbed_official 18:da299f395b9e 206 #if DAC_CALLBACK_MODE == true
mbed_official 18:da299f395b9e 207 for (uint8_t i = 0; i < DAC_CHANNEL_N; i++) {
mbed_official 18:da299f395b9e 208 for (uint8_t j = 0; j < DAC_CALLBACK_N; j++) {
mbed_official 18:da299f395b9e 209 module_inst->callback[i][j] = NULL;
mbed_official 18:da299f395b9e 210 }
mbed_official 18:da299f395b9e 211 };
mbed_official 18:da299f395b9e 212
mbed_official 18:da299f395b9e 213 _dac_instances[0] = module_inst;
mbed_official 18:da299f395b9e 214 #endif
mbed_official 18:da299f395b9e 215
mbed_official 18:da299f395b9e 216 return STATUS_OK;
mbed_official 18:da299f395b9e 217 }
mbed_official 18:da299f395b9e 218
mbed_official 18:da299f395b9e 219 /**
mbed_official 18:da299f395b9e 220 * \brief Resets the DAC module.
mbed_official 18:da299f395b9e 221 *
mbed_official 18:da299f395b9e 222 * This function will reset the DAC module to its power on default values and
mbed_official 18:da299f395b9e 223 * disable it.
mbed_official 18:da299f395b9e 224 *
mbed_official 18:da299f395b9e 225 * \param[in] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 226 */
mbed_official 18:da299f395b9e 227 void dac_reset(
mbed_official 18:da299f395b9e 228 struct dac_module *const module_inst)
mbed_official 18:da299f395b9e 229 {
mbed_official 18:da299f395b9e 230 /* Sanity check arguments */
mbed_official 18:da299f395b9e 231 Assert(module_inst);
mbed_official 18:da299f395b9e 232 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 233
mbed_official 18:da299f395b9e 234 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 235
mbed_official 18:da299f395b9e 236 while (dac_is_syncing(module_inst)) {
mbed_official 18:da299f395b9e 237 /* Wait until the synchronization is complete */
mbed_official 18:da299f395b9e 238 }
mbed_official 18:da299f395b9e 239
mbed_official 18:da299f395b9e 240 /* Software reset the module */
mbed_official 18:da299f395b9e 241 dac_module->CTRLA.reg |= DAC_CTRLA_SWRST;
mbed_official 18:da299f395b9e 242 }
mbed_official 18:da299f395b9e 243
mbed_official 18:da299f395b9e 244 /**
mbed_official 18:da299f395b9e 245 * \brief Enable the DAC module.
mbed_official 18:da299f395b9e 246 *
mbed_official 18:da299f395b9e 247 * Enables the DAC interface and the selected output. If any internal reference
mbed_official 18:da299f395b9e 248 * is selected it will be enabled.
mbed_official 18:da299f395b9e 249 *
mbed_official 18:da299f395b9e 250 * \param[in] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 251 *
mbed_official 18:da299f395b9e 252 */
mbed_official 18:da299f395b9e 253 void dac_enable(
mbed_official 18:da299f395b9e 254 struct dac_module *const module_inst)
mbed_official 18:da299f395b9e 255 {
mbed_official 18:da299f395b9e 256 /* Sanity check arguments */
mbed_official 18:da299f395b9e 257 Assert(module_inst);
mbed_official 18:da299f395b9e 258 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 259
mbed_official 18:da299f395b9e 260 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 261
mbed_official 18:da299f395b9e 262 while (dac_is_syncing(module_inst)) {
mbed_official 18:da299f395b9e 263 /* Wait until the synchronization is complete */
mbed_official 18:da299f395b9e 264 }
mbed_official 18:da299f395b9e 265
mbed_official 18:da299f395b9e 266 /* Enable the module */
mbed_official 18:da299f395b9e 267 dac_module->CTRLA.reg |= DAC_CTRLA_ENABLE;
mbed_official 18:da299f395b9e 268
mbed_official 18:da299f395b9e 269 /* Enable internal bandgap reference if selected in the configuration */
mbed_official 18:da299f395b9e 270 if (module_inst->reference == DAC_REFERENCE_INTREF) {
mbed_official 18:da299f395b9e 271 system_voltage_reference_enable(SYSTEM_VOLTAGE_REFERENCE_OUTPUT);
mbed_official 18:da299f395b9e 272 }
mbed_official 18:da299f395b9e 273
mbed_official 18:da299f395b9e 274 if(dac_module->DACCTRL[DAC_CHANNEL_0].reg & DAC_DACCTRL_ENABLE) {
mbed_official 18:da299f395b9e 275 while(! (dac_module->STATUS.reg & DAC_STATUS_READY(DAC_CHANNEL_0 + 1))) {
mbed_official 18:da299f395b9e 276 };
mbed_official 18:da299f395b9e 277 } else if(dac_module->DACCTRL[DAC_CHANNEL_1].reg & DAC_DACCTRL_ENABLE) {
mbed_official 18:da299f395b9e 278 while(! (dac_module->STATUS.reg & DAC_STATUS_READY(DAC_CHANNEL_1 + 1))) {
mbed_official 18:da299f395b9e 279 };
mbed_official 18:da299f395b9e 280 }
mbed_official 18:da299f395b9e 281 }
mbed_official 18:da299f395b9e 282
mbed_official 18:da299f395b9e 283 /**
mbed_official 18:da299f395b9e 284 * \brief Disable the DAC module.
mbed_official 18:da299f395b9e 285 *
mbed_official 18:da299f395b9e 286 * Disables the DAC interface and the output buffer.
mbed_official 18:da299f395b9e 287 *
mbed_official 18:da299f395b9e 288 * \param[in] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 289 *
mbed_official 18:da299f395b9e 290 */
mbed_official 18:da299f395b9e 291 void dac_disable(
mbed_official 18:da299f395b9e 292 struct dac_module *const module_inst)
mbed_official 18:da299f395b9e 293 {
mbed_official 18:da299f395b9e 294 /* Sanity check arguments */
mbed_official 18:da299f395b9e 295 Assert(module_inst);
mbed_official 18:da299f395b9e 296 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 297
mbed_official 18:da299f395b9e 298 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 299
mbed_official 18:da299f395b9e 300 while (dac_is_syncing(module_inst)) {
mbed_official 18:da299f395b9e 301 /* Wait until the synchronization is complete */
mbed_official 18:da299f395b9e 302 }
mbed_official 18:da299f395b9e 303
mbed_official 18:da299f395b9e 304 /* Disable DAC */
mbed_official 18:da299f395b9e 305 dac_module->CTRLA.reg &= ~DAC_CTRLA_ENABLE;
mbed_official 18:da299f395b9e 306 }
mbed_official 18:da299f395b9e 307
mbed_official 18:da299f395b9e 308 /**
mbed_official 18:da299f395b9e 309 * \brief Enables a DAC event input or output.
mbed_official 18:da299f395b9e 310 *
mbed_official 18:da299f395b9e 311 * Enables one or more input or output events to or from the DAC module. See
mbed_official 18:da299f395b9e 312 * \ref dac_events "Struct dac_events" for a list of events this module supports.
mbed_official 18:da299f395b9e 313 *
mbed_official 18:da299f395b9e 314 * \note Events cannot be altered while the module is enabled.
mbed_official 18:da299f395b9e 315 *
mbed_official 18:da299f395b9e 316 * \param[in] module_inst Software instance for the DAC peripheral
mbed_official 18:da299f395b9e 317 * \param[in] events Struct containing flags of events to enable
mbed_official 18:da299f395b9e 318 */
mbed_official 18:da299f395b9e 319 void dac_enable_events(
mbed_official 18:da299f395b9e 320 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 321 struct dac_events *const events)
mbed_official 18:da299f395b9e 322 {
mbed_official 18:da299f395b9e 323 /* Sanity check arguments */
mbed_official 18:da299f395b9e 324 Assert(module_inst);
mbed_official 18:da299f395b9e 325 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 326 Assert(events);
mbed_official 18:da299f395b9e 327
mbed_official 18:da299f395b9e 328 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 329
mbed_official 18:da299f395b9e 330 uint32_t event_mask = 0;
mbed_official 18:da299f395b9e 331
mbed_official 18:da299f395b9e 332 /* Configure Enable Inversion of input event */
mbed_official 18:da299f395b9e 333 if (events->generate_event_on_chan0_falling_edge) {
mbed_official 18:da299f395b9e 334 event_mask |= DAC_EVCTRL_INVEI0;
mbed_official 18:da299f395b9e 335 }
mbed_official 18:da299f395b9e 336
mbed_official 18:da299f395b9e 337 /* Configure Enable Inversion of input event */
mbed_official 18:da299f395b9e 338 if (events->generate_event_on_chan1_falling_edge) {
mbed_official 18:da299f395b9e 339 event_mask |= DAC_EVCTRL_INVEI1;
mbed_official 18:da299f395b9e 340 }
mbed_official 18:da299f395b9e 341
mbed_official 18:da299f395b9e 342 /* Configure Buffer Empty event */
mbed_official 18:da299f395b9e 343 if (events->generate_event_on_chan0_buffer_empty) {
mbed_official 18:da299f395b9e 344 event_mask |= DAC_EVCTRL_EMPTYEO0;
mbed_official 18:da299f395b9e 345 }
mbed_official 18:da299f395b9e 346
mbed_official 18:da299f395b9e 347 /* Configure Buffer Empty event */
mbed_official 18:da299f395b9e 348 if (events->generate_event_on_chan1_buffer_empty) {
mbed_official 18:da299f395b9e 349 event_mask |= DAC_EVCTRL_EMPTYEO1;
mbed_official 18:da299f395b9e 350 }
mbed_official 18:da299f395b9e 351
mbed_official 18:da299f395b9e 352 /* Configure Conversion Start event */
mbed_official 18:da299f395b9e 353 if (events->on_event_chan0_start_conversion) {
mbed_official 18:da299f395b9e 354 event_mask |= DAC_EVCTRL_STARTEI0;
mbed_official 18:da299f395b9e 355 module_inst->start_on_event[DAC_CHANNEL_0] = true;
mbed_official 18:da299f395b9e 356 }
mbed_official 18:da299f395b9e 357
mbed_official 18:da299f395b9e 358 /* Configure Conversion Start event */
mbed_official 18:da299f395b9e 359 if (events->on_event_chan1_start_conversion) {
mbed_official 18:da299f395b9e 360 event_mask |= DAC_EVCTRL_STARTEI1;
mbed_official 18:da299f395b9e 361 module_inst->start_on_event[DAC_CHANNEL_1] = true;
mbed_official 18:da299f395b9e 362 }
mbed_official 18:da299f395b9e 363
mbed_official 18:da299f395b9e 364 dac_module->EVCTRL.reg |= event_mask;
mbed_official 18:da299f395b9e 365 }
mbed_official 18:da299f395b9e 366
mbed_official 18:da299f395b9e 367 /**
mbed_official 18:da299f395b9e 368 * \brief Disables a DAC event input or output.
mbed_official 18:da299f395b9e 369 *
mbed_official 18:da299f395b9e 370 * Disables one or more input or output events to or from the DAC module. See
mbed_official 18:da299f395b9e 371 * \ref dac_events "Struct dac_events" for a list of events this module supports.
mbed_official 18:da299f395b9e 372 *
mbed_official 18:da299f395b9e 373 * \note Events cannot be altered while the module is enabled.
mbed_official 18:da299f395b9e 374 *
mbed_official 18:da299f395b9e 375 * \param[in] module_inst Software instance for the DAC peripheral
mbed_official 18:da299f395b9e 376 * \param[in] events Struct containing flags of events to disable
mbed_official 18:da299f395b9e 377 */
mbed_official 18:da299f395b9e 378 void dac_disable_events(
mbed_official 18:da299f395b9e 379 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 380 struct dac_events *const events)
mbed_official 18:da299f395b9e 381 {
mbed_official 18:da299f395b9e 382 /* Sanity check arguments */
mbed_official 18:da299f395b9e 383 Assert(module_inst);
mbed_official 18:da299f395b9e 384 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 385 Assert(events);
mbed_official 18:da299f395b9e 386
mbed_official 18:da299f395b9e 387 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 388
mbed_official 18:da299f395b9e 389 uint32_t event_mask = 0;
mbed_official 18:da299f395b9e 390
mbed_official 18:da299f395b9e 391 /* Configure Buffer Empty event */
mbed_official 18:da299f395b9e 392 if (events->on_event_chan0_start_conversion) {
mbed_official 18:da299f395b9e 393 event_mask |= DAC_EVCTRL_EMPTYEO0;
mbed_official 18:da299f395b9e 394 }
mbed_official 18:da299f395b9e 395
mbed_official 18:da299f395b9e 396 /* Configure Buffer Empty event */
mbed_official 18:da299f395b9e 397 if (events->on_event_chan1_start_conversion) {
mbed_official 18:da299f395b9e 398 event_mask |= DAC_EVCTRL_EMPTYEO1;
mbed_official 18:da299f395b9e 399 }
mbed_official 18:da299f395b9e 400
mbed_official 18:da299f395b9e 401 /* Configure Conversion Start event */
mbed_official 18:da299f395b9e 402 if (events->generate_event_on_chan0_buffer_empty) {
mbed_official 18:da299f395b9e 403 event_mask |= DAC_EVCTRL_STARTEI0;
mbed_official 18:da299f395b9e 404 module_inst->start_on_event[DAC_CHANNEL_0] = false;
mbed_official 18:da299f395b9e 405 }
mbed_official 18:da299f395b9e 406
mbed_official 18:da299f395b9e 407 /* Configure Conversion Start event */
mbed_official 18:da299f395b9e 408 if (events->generate_event_on_chan0_buffer_empty) {
mbed_official 18:da299f395b9e 409 event_mask |= DAC_EVCTRL_STARTEI1;
mbed_official 18:da299f395b9e 410 module_inst->start_on_event[DAC_CHANNEL_1] = false;
mbed_official 18:da299f395b9e 411 }
mbed_official 18:da299f395b9e 412
mbed_official 18:da299f395b9e 413 dac_module->EVCTRL.reg &= ~event_mask;
mbed_official 18:da299f395b9e 414 }
mbed_official 18:da299f395b9e 415
mbed_official 18:da299f395b9e 416 void dac_chan_get_config_defaults(
mbed_official 18:da299f395b9e 417 struct dac_chan_config *const config)
mbed_official 18:da299f395b9e 418 {
mbed_official 18:da299f395b9e 419 /* Sanity check arguments */
mbed_official 18:da299f395b9e 420 Assert(config);
mbed_official 18:da299f395b9e 421
mbed_official 18:da299f395b9e 422 /* Dac channel default configuration values */
mbed_official 18:da299f395b9e 423 config->left_adjust = false;
mbed_official 18:da299f395b9e 424 config->current = DAC_CURRENT_12M;
mbed_official 18:da299f395b9e 425 config->run_in_standby = false;
mbed_official 18:da299f395b9e 426 config->dither_mode = false;
mbed_official 18:da299f395b9e 427 config->refresh_period = 1;
mbed_official 18:da299f395b9e 428 }
mbed_official 18:da299f395b9e 429
mbed_official 18:da299f395b9e 430
mbed_official 18:da299f395b9e 431 /**
mbed_official 18:da299f395b9e 432 * \brief Writes a DAC channel configuration to the hardware module.
mbed_official 18:da299f395b9e 433 *
mbed_official 18:da299f395b9e 434 * Writes out a given channel configuration to the hardware module.
mbed_official 18:da299f395b9e 435 *
mbed_official 18:da299f395b9e 436 * \note The DAC device instance structure must be initialized before calling
mbed_official 18:da299f395b9e 437 * this function.
mbed_official 18:da299f395b9e 438 *
mbed_official 18:da299f395b9e 439 * \param[in] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 440 * \param[in] channel Channel to configure
mbed_official 18:da299f395b9e 441 * \param[in] config Pointer to the configuration struct
mbed_official 18:da299f395b9e 442 *
mbed_official 18:da299f395b9e 443 */
mbed_official 18:da299f395b9e 444 void dac_chan_set_config(
mbed_official 18:da299f395b9e 445 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 446 const enum dac_channel channel,
mbed_official 18:da299f395b9e 447 struct dac_chan_config *const config)
mbed_official 18:da299f395b9e 448 {
mbed_official 18:da299f395b9e 449 /* Sanity check arguments */
mbed_official 18:da299f395b9e 450 Assert(module_inst);
mbed_official 18:da299f395b9e 451 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 452 Assert(config);
mbed_official 18:da299f395b9e 453
mbed_official 18:da299f395b9e 454 /* MUX the DAC VOUT pin */
mbed_official 18:da299f395b9e 455 struct system_pinmux_config pin_conf;
mbed_official 18:da299f395b9e 456 system_pinmux_get_config_defaults(&pin_conf);
mbed_official 18:da299f395b9e 457
mbed_official 18:da299f395b9e 458 pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
mbed_official 18:da299f395b9e 459 pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
mbed_official 18:da299f395b9e 460
mbed_official 18:da299f395b9e 461 if(channel == DAC_CHANNEL_0) {
mbed_official 18:da299f395b9e 462 /* Set up the DAC VOUT0 pin */
mbed_official 18:da299f395b9e 463 pin_conf.mux_position = MUX_PA02B_DAC_VOUT0;
mbed_official 18:da299f395b9e 464 system_pinmux_pin_set_config(PIN_PA02B_DAC_VOUT0, &pin_conf);
mbed_official 18:da299f395b9e 465 } else if(channel == DAC_CHANNEL_1) {
mbed_official 18:da299f395b9e 466 /* Set up the DAC VOUT1 pin */
mbed_official 18:da299f395b9e 467 pin_conf.mux_position = MUX_PA05B_DAC_VOUT1;
mbed_official 18:da299f395b9e 468 system_pinmux_pin_set_config(PIN_PA05B_DAC_VOUT1, &pin_conf);
mbed_official 18:da299f395b9e 469 }
mbed_official 18:da299f395b9e 470
mbed_official 18:da299f395b9e 471 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 472
mbed_official 18:da299f395b9e 473 uint32_t new_dacctrl = 0;
mbed_official 18:da299f395b9e 474
mbed_official 18:da299f395b9e 475 /* Left adjust data if configured */
mbed_official 18:da299f395b9e 476 if (config->left_adjust) {
mbed_official 18:da299f395b9e 477 new_dacctrl |= DAC_DACCTRL_LEFTADJ;
mbed_official 18:da299f395b9e 478 }
mbed_official 18:da299f395b9e 479
mbed_official 18:da299f395b9e 480 /* Set current control */
mbed_official 18:da299f395b9e 481 new_dacctrl |= config->current;
mbed_official 18:da299f395b9e 482
mbed_official 18:da299f395b9e 483 /* Enable DAC in standby sleep mode if configured */
mbed_official 18:da299f395b9e 484 if (config->run_in_standby) {
mbed_official 18:da299f395b9e 485 new_dacctrl |= DAC_DACCTRL_RUNSTDBY;
mbed_official 18:da299f395b9e 486 }
mbed_official 18:da299f395b9e 487
mbed_official 18:da299f395b9e 488 /* Voltage pump disable if configured */
mbed_official 18:da299f395b9e 489 if (config->dither_mode) {
mbed_official 18:da299f395b9e 490 new_dacctrl |= DAC_DACCTRL_DITHER;
mbed_official 18:da299f395b9e 491 }
mbed_official 18:da299f395b9e 492
mbed_official 18:da299f395b9e 493 new_dacctrl |= DAC_DACCTRL_REFRESH(config->refresh_period);
mbed_official 18:da299f395b9e 494
mbed_official 18:da299f395b9e 495 /* Apply the new configuration to the hardware module */
mbed_official 18:da299f395b9e 496 dac_module->DACCTRL[channel].reg = new_dacctrl;
mbed_official 18:da299f395b9e 497 }
mbed_official 18:da299f395b9e 498
mbed_official 18:da299f395b9e 499 /**
mbed_official 18:da299f395b9e 500 * \brief Enable a DAC channel.
mbed_official 18:da299f395b9e 501 *
mbed_official 18:da299f395b9e 502 * Enables the selected DAC channel.
mbed_official 18:da299f395b9e 503 *
mbed_official 18:da299f395b9e 504 * \param[in] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 505 * \param[in] channel Channel to enable
mbed_official 18:da299f395b9e 506 *
mbed_official 18:da299f395b9e 507 */
mbed_official 18:da299f395b9e 508 void dac_chan_enable(
mbed_official 18:da299f395b9e 509 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 510 enum dac_channel channel)
mbed_official 18:da299f395b9e 511 {
mbed_official 18:da299f395b9e 512 /* Sanity check arguments */
mbed_official 18:da299f395b9e 513 Assert(module_inst);
mbed_official 18:da299f395b9e 514 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 515
mbed_official 18:da299f395b9e 516 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 517
mbed_official 18:da299f395b9e 518 /* Enable the module */
mbed_official 18:da299f395b9e 519 dac_module->DACCTRL[channel].reg |= DAC_DACCTRL_ENABLE;
mbed_official 18:da299f395b9e 520 }
mbed_official 18:da299f395b9e 521
mbed_official 18:da299f395b9e 522 /**
mbed_official 18:da299f395b9e 523 * \brief Disable a DAC channel.
mbed_official 18:da299f395b9e 524 *
mbed_official 18:da299f395b9e 525 * Disables the selected DAC channel.
mbed_official 18:da299f395b9e 526 *
mbed_official 18:da299f395b9e 527 * \param[in] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 528 * \param[in] channel Channel to disable
mbed_official 18:da299f395b9e 529 *
mbed_official 18:da299f395b9e 530 */
mbed_official 18:da299f395b9e 531 void dac_chan_disable(
mbed_official 18:da299f395b9e 532 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 533 enum dac_channel channel)
mbed_official 18:da299f395b9e 534 {
mbed_official 18:da299f395b9e 535 /* Sanity check arguments */
mbed_official 18:da299f395b9e 536 Assert(module_inst);
mbed_official 18:da299f395b9e 537 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 538
mbed_official 18:da299f395b9e 539 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 540
mbed_official 18:da299f395b9e 541 /* Enable the module */
mbed_official 18:da299f395b9e 542 dac_module->DACCTRL[channel].reg &= ~DAC_DACCTRL_ENABLE;
mbed_official 18:da299f395b9e 543
mbed_official 18:da299f395b9e 544 }
mbed_official 18:da299f395b9e 545
mbed_official 18:da299f395b9e 546 /**
mbed_official 18:da299f395b9e 547 * \brief Write to the DAC.
mbed_official 18:da299f395b9e 548 *
mbed_official 18:da299f395b9e 549 * This function writes to the DATA or DATABUF register.
mbed_official 18:da299f395b9e 550 * If the conversion is not event-triggered, the data will be written to
mbed_official 18:da299f395b9e 551 * the DATA register and the conversion will start.
mbed_official 18:da299f395b9e 552 * If the conversion is event-triggered, the data will be written to DATABUF
mbed_official 18:da299f395b9e 553 * and transferred to the DATA register and converted when a Start Conversion
mbed_official 18:da299f395b9e 554 * Event is issued.
mbed_official 18:da299f395b9e 555 * Conversion data must be right or left adjusted according to configuration
mbed_official 18:da299f395b9e 556 * settings.
mbed_official 18:da299f395b9e 557 * \note To be event triggered, the enable_start_on_event must be
mbed_official 18:da299f395b9e 558 * enabled in the configuration.
mbed_official 18:da299f395b9e 559 *
mbed_official 18:da299f395b9e 560 * \param[in] module_inst Pointer to the DAC software device struct
mbed_official 18:da299f395b9e 561 * \param[in] channel DAC channel to write to
mbed_official 18:da299f395b9e 562 * \param[in] data Conversion data
mbed_official 18:da299f395b9e 563 *
mbed_official 18:da299f395b9e 564 * \return Status of the operation.
mbed_official 18:da299f395b9e 565 * \retval STATUS_OK If the data was written
mbed_official 18:da299f395b9e 566 */
mbed_official 18:da299f395b9e 567 enum status_code dac_chan_write(
mbed_official 18:da299f395b9e 568 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 569 enum dac_channel channel,
mbed_official 18:da299f395b9e 570 const uint16_t data)
mbed_official 18:da299f395b9e 571 {
mbed_official 18:da299f395b9e 572 /* Sanity check arguments */
mbed_official 18:da299f395b9e 573 Assert(module_inst);
mbed_official 18:da299f395b9e 574 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 575
mbed_official 18:da299f395b9e 576 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 577
mbed_official 18:da299f395b9e 578 while (dac_is_syncing(module_inst)) {
mbed_official 18:da299f395b9e 579 /* Wait until the synchronization is complete */
mbed_official 18:da299f395b9e 580 }
mbed_official 18:da299f395b9e 581
mbed_official 18:da299f395b9e 582 if (module_inst->start_on_event[channel]) {
mbed_official 18:da299f395b9e 583 /* Write the new value to the buffered DAC data register */
mbed_official 18:da299f395b9e 584 dac_module->DATABUF[channel].reg = data;
mbed_official 18:da299f395b9e 585 } else {
mbed_official 18:da299f395b9e 586 /* Write the new value to the DAC data register */
mbed_official 18:da299f395b9e 587 dac_module->DATA[channel].reg = data;
mbed_official 18:da299f395b9e 588 }
mbed_official 18:da299f395b9e 589
mbed_official 18:da299f395b9e 590 return STATUS_OK;
mbed_official 18:da299f395b9e 591 }
mbed_official 18:da299f395b9e 592
mbed_official 18:da299f395b9e 593 /**
mbed_official 18:da299f395b9e 594 * \brief Write to the DAC.
mbed_official 18:da299f395b9e 595 *
mbed_official 18:da299f395b9e 596 * This function converts a specific number of digital data.
mbed_official 18:da299f395b9e 597 * The conversion should be event-triggered, the data will be written to DATABUF
mbed_official 18:da299f395b9e 598 * and transferred to the DATA register and converted when a Start Conversion
mbed_official 18:da299f395b9e 599 * Event is issued.
mbed_official 18:da299f395b9e 600 * Conversion data must be right or left adjusted according to configuration
mbed_official 18:da299f395b9e 601 * settings.
mbed_official 18:da299f395b9e 602 * \note To be event triggered, the enable_start_on_event must be
mbed_official 18:da299f395b9e 603 * enabled in the configuration.
mbed_official 18:da299f395b9e 604 *
mbed_official 18:da299f395b9e 605 * \param[in] module_inst Pointer to the DAC software device struct
mbed_official 18:da299f395b9e 606 * \param[in] channel DAC channel to write to
mbed_official 18:da299f395b9e 607 * \param[in] buffer Pointer to the digital data write buffer to be converted
mbed_official 18:da299f395b9e 608 * \param[in] length Length of the write buffer
mbed_official 18:da299f395b9e 609 *
mbed_official 18:da299f395b9e 610 * \return Status of the operation.
mbed_official 18:da299f395b9e 611 * \retval STATUS_OK If the data was written or no data conversion required
mbed_official 18:da299f395b9e 612 * \retval STATUS_ERR_UNSUPPORTED_DEV The DAC is not configured as using event trigger
mbed_official 18:da299f395b9e 613 * \retval STATUS_BUSY The DAC is busy and can not do the conversion
mbed_official 18:da299f395b9e 614 */
mbed_official 18:da299f395b9e 615 enum status_code dac_chan_write_buffer_wait(
mbed_official 18:da299f395b9e 616 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 617 enum dac_channel channel,
mbed_official 18:da299f395b9e 618 uint16_t *buffer,
mbed_official 18:da299f395b9e 619 uint32_t length)
mbed_official 18:da299f395b9e 620 {
mbed_official 18:da299f395b9e 621 /* Sanity check arguments */
mbed_official 18:da299f395b9e 622 Assert(module_inst);
mbed_official 18:da299f395b9e 623 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 624
mbed_official 18:da299f395b9e 625 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 626
mbed_official 18:da299f395b9e 627 while (dac_is_syncing(module_inst)) {
mbed_official 18:da299f395b9e 628 /* Wait until the synchronization is complete */
mbed_official 18:da299f395b9e 629 }
mbed_official 18:da299f395b9e 630
mbed_official 18:da299f395b9e 631 /* Zero length request */
mbed_official 18:da299f395b9e 632 if (length == 0) {
mbed_official 18:da299f395b9e 633 /* No data to be converted */
mbed_official 18:da299f395b9e 634 return STATUS_OK;
mbed_official 18:da299f395b9e 635 }
mbed_official 18:da299f395b9e 636
mbed_official 18:da299f395b9e 637 #if DAC_CALLBACK_MODE == true
mbed_official 18:da299f395b9e 638 /* Check if busy */
mbed_official 18:da299f395b9e 639 if (module_inst->job_status[channel] == STATUS_BUSY) {
mbed_official 18:da299f395b9e 640 return STATUS_BUSY;
mbed_official 18:da299f395b9e 641 }
mbed_official 18:da299f395b9e 642 #endif
mbed_official 18:da299f395b9e 643
mbed_official 18:da299f395b9e 644 /* Only support event triggered conversion */
mbed_official 18:da299f395b9e 645 if (module_inst->start_on_event[channel] == false) {
mbed_official 18:da299f395b9e 646 return STATUS_ERR_UNSUPPORTED_DEV;
mbed_official 18:da299f395b9e 647 }
mbed_official 18:da299f395b9e 648
mbed_official 18:da299f395b9e 649 /* Blocks while buffer is being transferred */
mbed_official 18:da299f395b9e 650 while (length--) {
mbed_official 18:da299f395b9e 651 /* Convert one data */
mbed_official 18:da299f395b9e 652 dac_chan_write(module_inst, channel, buffer[length]);
mbed_official 18:da299f395b9e 653
mbed_official 18:da299f395b9e 654 /* Wait until Transmit is complete or timeout */
mbed_official 18:da299f395b9e 655 for (uint32_t i = 0; i <= DAC_TIMEOUT; i++) {
mbed_official 18:da299f395b9e 656 if(channel == DAC_CHANNEL_0) {
mbed_official 18:da299f395b9e 657 if (dac_module->INTFLAG.reg & DAC_INTFLAG_EMPTY0) {
mbed_official 18:da299f395b9e 658 break;
mbed_official 18:da299f395b9e 659 } else if (i == DAC_TIMEOUT) {
mbed_official 18:da299f395b9e 660 return STATUS_ERR_TIMEOUT;
mbed_official 18:da299f395b9e 661 }
mbed_official 18:da299f395b9e 662 } else if(channel == DAC_CHANNEL_1) {
mbed_official 18:da299f395b9e 663 if (dac_module->INTFLAG.reg & DAC_INTFLAG_EMPTY1) {
mbed_official 18:da299f395b9e 664 break;
mbed_official 18:da299f395b9e 665 } else if (i == DAC_TIMEOUT) {
mbed_official 18:da299f395b9e 666 return STATUS_ERR_TIMEOUT;
mbed_official 18:da299f395b9e 667 }
mbed_official 18:da299f395b9e 668 }
mbed_official 18:da299f395b9e 669 }
mbed_official 18:da299f395b9e 670 }
mbed_official 18:da299f395b9e 671
mbed_official 18:da299f395b9e 672 return STATUS_OK;
mbed_official 18:da299f395b9e 673 }
mbed_official 18:da299f395b9e 674
mbed_official 18:da299f395b9e 675 /**
mbed_official 18:da299f395b9e 676 * \brief Retrieves the status of DAC channel end of conversion.
mbed_official 18:da299f395b9e 677 *
mbed_official 18:da299f395b9e 678 * Checks if the conversion is completed or not and returns boolean flag
mbed_official 18:da299f395b9e 679 * of status.
mbed_official 18:da299f395b9e 680 *
mbed_official 18:da299f395b9e 681 * \param[in] module_inst Pointer to the DAC software instance struct
mbed_official 18:da299f395b9e 682 * \param[in] channel Channel to disable
mbed_official 18:da299f395b9e 683 *
mbed_official 18:da299f395b9e 684 * \retval true Conversion is complete, VOUT is stable
mbed_official 18:da299f395b9e 685 * \retval false No conversion completed since last load of DATA
mbed_official 18:da299f395b9e 686 */
mbed_official 18:da299f395b9e 687 bool dac_chan_is_end_of_conversion(
mbed_official 18:da299f395b9e 688 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 689 enum dac_channel channel)
mbed_official 18:da299f395b9e 690 {
mbed_official 18:da299f395b9e 691 /* Sanity check arguments */
mbed_official 18:da299f395b9e 692 Assert(module_inst);
mbed_official 18:da299f395b9e 693 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 694
mbed_official 18:da299f395b9e 695 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 696
mbed_official 18:da299f395b9e 697 if(dac_module->STATUS.reg & DAC_STATUS_EOC(channel + 1)) {
mbed_official 18:da299f395b9e 698 return true;
mbed_official 18:da299f395b9e 699 } else {
mbed_official 18:da299f395b9e 700 return false;
mbed_official 18:da299f395b9e 701 }
mbed_official 18:da299f395b9e 702 }
mbed_official 18:da299f395b9e 703
mbed_official 18:da299f395b9e 704 /**
mbed_official 18:da299f395b9e 705 * \brief Retrieves the current module status.
mbed_official 18:da299f395b9e 706 *
mbed_official 18:da299f395b9e 707 * Checks the status of the module and returns it as a bitmask of status
mbed_official 18:da299f395b9e 708 * flags.
mbed_official 18:da299f395b9e 709 *
mbed_official 18:da299f395b9e 710 * \param[in] module_inst Pointer to the DAC software device struct
mbed_official 18:da299f395b9e 711 *
mbed_official 18:da299f395b9e 712 * \return Bitmask of status flags.
mbed_official 18:da299f395b9e 713 *
mbed_official 18:da299f395b9e 714 * \retval DAC_STATUS_CHANNEL_0_EMPTY Data has been transferred from DATABUF
mbed_official 18:da299f395b9e 715 * to DATA by a start conversion event
mbed_official 18:da299f395b9e 716 * and DATABUF is ready for new data
mbed_official 18:da299f395b9e 717 * \retval DAC_STATUS_CHANNEL_0_UNDERRUN A start conversion event has occurred
mbed_official 18:da299f395b9e 718 * when DATABUF is empty
mbed_official 18:da299f395b9e 719 *
mbed_official 18:da299f395b9e 720 */
mbed_official 18:da299f395b9e 721 uint32_t dac_get_status(
mbed_official 18:da299f395b9e 722 struct dac_module *const module_inst)
mbed_official 18:da299f395b9e 723 {
mbed_official 18:da299f395b9e 724 /* Sanity check arguments */
mbed_official 18:da299f395b9e 725 Assert(module_inst);
mbed_official 18:da299f395b9e 726 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 727
mbed_official 18:da299f395b9e 728 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 729
mbed_official 18:da299f395b9e 730 uint8_t intflags = dac_module->INTFLAG.reg;
mbed_official 18:da299f395b9e 731 uint32_t status_flags = 0;
mbed_official 18:da299f395b9e 732
mbed_official 18:da299f395b9e 733 if (intflags & DAC_INTFLAG_EMPTY0) {
mbed_official 18:da299f395b9e 734 status_flags |= DAC_STATUS_CHANNEL_0_EMPTY;
mbed_official 18:da299f395b9e 735 }
mbed_official 18:da299f395b9e 736
mbed_official 18:da299f395b9e 737 if (intflags & DAC_INTFLAG_EMPTY1) {
mbed_official 18:da299f395b9e 738 status_flags |= DAC_STATUS_CHANNEL_1_EMPTY;
mbed_official 18:da299f395b9e 739 }
mbed_official 18:da299f395b9e 740
mbed_official 18:da299f395b9e 741 if (intflags & DAC_INTFLAG_UNDERRUN0) {
mbed_official 18:da299f395b9e 742 status_flags |= DAC_STATUS_CHANNEL_0_UNDERRUN;
mbed_official 18:da299f395b9e 743 }
mbed_official 18:da299f395b9e 744
mbed_official 18:da299f395b9e 745 if (intflags & DAC_INTFLAG_UNDERRUN1) {
mbed_official 18:da299f395b9e 746 status_flags |= DAC_STATUS_CHANNEL_1_UNDERRUN;
mbed_official 18:da299f395b9e 747 }
mbed_official 18:da299f395b9e 748
mbed_official 18:da299f395b9e 749 return status_flags;
mbed_official 18:da299f395b9e 750 }
mbed_official 18:da299f395b9e 751
mbed_official 18:da299f395b9e 752 /**
mbed_official 18:da299f395b9e 753 * \brief Clears a module status flag.
mbed_official 18:da299f395b9e 754 *
mbed_official 18:da299f395b9e 755 * Clears the given status flag of the module.
mbed_official 18:da299f395b9e 756 *
mbed_official 18:da299f395b9e 757 * \param[in] module_inst Pointer to the DAC software device struct
mbed_official 18:da299f395b9e 758 * \param[in] status_flags Bit mask of status flags to clear
mbed_official 18:da299f395b9e 759 *
mbed_official 18:da299f395b9e 760 */
mbed_official 18:da299f395b9e 761 void dac_clear_status(
mbed_official 18:da299f395b9e 762 struct dac_module *const module_inst,
mbed_official 18:da299f395b9e 763 uint32_t status_flags)
mbed_official 18:da299f395b9e 764 {
mbed_official 18:da299f395b9e 765 /* Sanity check arguments */
mbed_official 18:da299f395b9e 766 Assert(module_inst);
mbed_official 18:da299f395b9e 767 Assert(module_inst->hw);
mbed_official 18:da299f395b9e 768
mbed_official 18:da299f395b9e 769 Dac *const dac_module = module_inst->hw;
mbed_official 18:da299f395b9e 770
mbed_official 18:da299f395b9e 771 uint32_t intflags = 0;
mbed_official 18:da299f395b9e 772
mbed_official 18:da299f395b9e 773 if (status_flags & DAC_STATUS_CHANNEL_0_EMPTY) {
mbed_official 18:da299f395b9e 774 intflags |= DAC_INTFLAG_EMPTY0;
mbed_official 18:da299f395b9e 775 }
mbed_official 18:da299f395b9e 776
mbed_official 18:da299f395b9e 777 if (status_flags & DAC_STATUS_CHANNEL_1_EMPTY) {
mbed_official 18:da299f395b9e 778 intflags |= DAC_INTFLAG_EMPTY1;
mbed_official 18:da299f395b9e 779 }
mbed_official 18:da299f395b9e 780
mbed_official 18:da299f395b9e 781 if (status_flags & DAC_STATUS_CHANNEL_0_UNDERRUN) {
mbed_official 18:da299f395b9e 782 intflags |= DAC_INTFLAG_UNDERRUN0;
mbed_official 18:da299f395b9e 783 }
mbed_official 18:da299f395b9e 784
mbed_official 18:da299f395b9e 785 if (status_flags & DAC_STATUS_CHANNEL_1_UNDERRUN) {
mbed_official 18:da299f395b9e 786 intflags |= DAC_INTFLAG_UNDERRUN1;
mbed_official 18:da299f395b9e 787 }
mbed_official 18:da299f395b9e 788
mbed_official 18:da299f395b9e 789 dac_module->INTFLAG.reg = intflags;
mbed_official 18:da299f395b9e 790 }