t

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM0P/drivers/dac/TARGET_SAML21/dac.c@18:da299f395b9e
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

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 }