added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
50:a417edff4437
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**************************************************************************//**
bogdanm 0:9b334a45a8ff 2 * @file em_opamp.c
bogdanm 0:9b334a45a8ff 3 * @brief Operational Amplifier (OPAMP) peripheral API
bogdanm 0:9b334a45a8ff 4 * @version 3.20.12
bogdanm 0:9b334a45a8ff 5 ******************************************************************************
bogdanm 0:9b334a45a8ff 6 * @section License
bogdanm 0:9b334a45a8ff 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
bogdanm 0:9b334a45a8ff 8 *******************************************************************************
bogdanm 0:9b334a45a8ff 9 *
bogdanm 0:9b334a45a8ff 10 * Permission is granted to anyone to use this software for any purpose,
bogdanm 0:9b334a45a8ff 11 * including commercial applications, and to alter it and redistribute it
bogdanm 0:9b334a45a8ff 12 * freely, subject to the following restrictions:
bogdanm 0:9b334a45a8ff 13 *
bogdanm 0:9b334a45a8ff 14 * 1. The origin of this software must not be misrepresented; you must not
bogdanm 0:9b334a45a8ff 15 * claim that you wrote the original software.
bogdanm 0:9b334a45a8ff 16 * 2. Altered source versions must be plainly marked as such, and must not be
bogdanm 0:9b334a45a8ff 17 * misrepresented as being the original software.
bogdanm 0:9b334a45a8ff 18 * 3. This notice may not be removed or altered from any source distribution.
bogdanm 0:9b334a45a8ff 19 *
bogdanm 0:9b334a45a8ff 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
bogdanm 0:9b334a45a8ff 21 * obligation to support this Software. Silicon Labs is providing the
bogdanm 0:9b334a45a8ff 22 * Software "AS IS", with no express or implied warranties of any kind,
bogdanm 0:9b334a45a8ff 23 * including, but not limited to, any implied warranties of merchantability
bogdanm 0:9b334a45a8ff 24 * or fitness for any particular purpose or warranties against infringement
bogdanm 0:9b334a45a8ff 25 * of any proprietary rights of a third party.
bogdanm 0:9b334a45a8ff 26 *
bogdanm 0:9b334a45a8ff 27 * Silicon Labs will not be liable for any consequential, incidental, or
bogdanm 0:9b334a45a8ff 28 * special damages, or any other relief, or for any claim by any third party,
bogdanm 0:9b334a45a8ff 29 * arising from your use of this Software.
bogdanm 0:9b334a45a8ff 30 *
bogdanm 0:9b334a45a8ff 31 ******************************************************************************/
bogdanm 0:9b334a45a8ff 32
bogdanm 0:9b334a45a8ff 33
bogdanm 0:9b334a45a8ff 34 #include "em_device.h"
bogdanm 0:9b334a45a8ff 35 #if defined( OPAMP_PRESENT ) && ( OPAMP_COUNT == 1 )
bogdanm 0:9b334a45a8ff 36
bogdanm 0:9b334a45a8ff 37 #include "em_system.h"
bogdanm 0:9b334a45a8ff 38 #include "em_assert.h"
bogdanm 0:9b334a45a8ff 39 #include "em_opamp.h"
bogdanm 0:9b334a45a8ff 40
bogdanm 0:9b334a45a8ff 41 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 42 * @addtogroup EM_Library
bogdanm 0:9b334a45a8ff 43 * @{
bogdanm 0:9b334a45a8ff 44 ******************************************************************************/
bogdanm 0:9b334a45a8ff 45
bogdanm 0:9b334a45a8ff 46
bogdanm 0:9b334a45a8ff 47 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 48 * @addtogroup OPAMP
bogdanm 0:9b334a45a8ff 49 * @brief Operational Amplifier (OPAMP) peripheral API
bogdanm 0:9b334a45a8ff 50 * @details
bogdanm 0:9b334a45a8ff 51 * This module contains functions to:
bogdanm 0:9b334a45a8ff 52 * @li OPAMP_Enable() Configure and enable an opamp.
bogdanm 0:9b334a45a8ff 53 * @li OPAMP_Disable() Disable an opamp.
bogdanm 0:9b334a45a8ff 54 *
bogdanm 0:9b334a45a8ff 55 * All OPAMP functions assume that the DAC clock is running. If the DAC is not
bogdanm 0:9b334a45a8ff 56 * used, the clock can be turned off when the opamp's are configured.
bogdanm 0:9b334a45a8ff 57 *
bogdanm 0:9b334a45a8ff 58 * If the available gain values dont suit the application at hand, the resistor
bogdanm 0:9b334a45a8ff 59 * ladders can be disabled and external gain programming resistors used.
bogdanm 0:9b334a45a8ff 60 *
bogdanm 0:9b334a45a8ff 61 * A number of predefined opamp setup macros are available for configuration
bogdanm 0:9b334a45a8ff 62 * of the most common opamp topologies (see figures below).
bogdanm 0:9b334a45a8ff 63 *
bogdanm 0:9b334a45a8ff 64 * @note
bogdanm 0:9b334a45a8ff 65 * <em>The terms POSPAD and NEGPAD in the figures are used to indicate that these
bogdanm 0:9b334a45a8ff 66 * pads should be connected to a suitable signal ground.</em>
bogdanm 0:9b334a45a8ff 67 *
bogdanm 0:9b334a45a8ff 68 * \n<b>Unity gain voltage follower.</b>\n
bogdanm 0:9b334a45a8ff 69 * Use predefined macros @ref OPA_INIT_UNITY_GAIN and
bogdanm 0:9b334a45a8ff 70 * @ref OPA_INIT_UNITY_GAIN_OPA2.
bogdanm 0:9b334a45a8ff 71 * @verbatim
bogdanm 0:9b334a45a8ff 72
bogdanm 0:9b334a45a8ff 73 |\
bogdanm 0:9b334a45a8ff 74 ___________|+\
bogdanm 0:9b334a45a8ff 75 | \_______
bogdanm 0:9b334a45a8ff 76 ___|_ / |
bogdanm 0:9b334a45a8ff 77 | | / |
bogdanm 0:9b334a45a8ff 78 | |/ |
bogdanm 0:9b334a45a8ff 79 |___________|
bogdanm 0:9b334a45a8ff 80 @endverbatim
bogdanm 0:9b334a45a8ff 81 *
bogdanm 0:9b334a45a8ff 82 * \n<b>Non-inverting amplifier.</b>\n
bogdanm 0:9b334a45a8ff 83 * Use predefined macros @ref OPA_INIT_NON_INVERTING and
bogdanm 0:9b334a45a8ff 84 * @ref OPA_INIT_NON_INVERTING_OPA2.
bogdanm 0:9b334a45a8ff 85 * @verbatim
bogdanm 0:9b334a45a8ff 86
bogdanm 0:9b334a45a8ff 87 |\
bogdanm 0:9b334a45a8ff 88 ___________|+\
bogdanm 0:9b334a45a8ff 89 | \_______
bogdanm 0:9b334a45a8ff 90 ___|_ / |
bogdanm 0:9b334a45a8ff 91 | | / |
bogdanm 0:9b334a45a8ff 92 | |/ |
bogdanm 0:9b334a45a8ff 93 |_____R2____|
bogdanm 0:9b334a45a8ff 94 |
bogdanm 0:9b334a45a8ff 95 R1
bogdanm 0:9b334a45a8ff 96 |
bogdanm 0:9b334a45a8ff 97 NEGPAD @endverbatim
bogdanm 0:9b334a45a8ff 98 *
bogdanm 0:9b334a45a8ff 99 * \n<b>Inverting amplifier.</b>\n
bogdanm 0:9b334a45a8ff 100 * Use predefined macros @ref OPA_INIT_INVERTING and
bogdanm 0:9b334a45a8ff 101 * @ref OPA_INIT_INVERTING_OPA2.
bogdanm 0:9b334a45a8ff 102 * @verbatim
bogdanm 0:9b334a45a8ff 103
bogdanm 0:9b334a45a8ff 104 _____R2____
bogdanm 0:9b334a45a8ff 105 | |
bogdanm 0:9b334a45a8ff 106 | |\ |
bogdanm 0:9b334a45a8ff 107 ____R1_|___|_\ |
bogdanm 0:9b334a45a8ff 108 | \____|___
bogdanm 0:9b334a45a8ff 109 ___| /
bogdanm 0:9b334a45a8ff 110 | |+/
bogdanm 0:9b334a45a8ff 111 | |/
bogdanm 0:9b334a45a8ff 112 |
bogdanm 0:9b334a45a8ff 113 POSPAD @endverbatim
bogdanm 0:9b334a45a8ff 114 *
bogdanm 0:9b334a45a8ff 115 * \n<b>Cascaded non-inverting amplifiers.</b>\n
bogdanm 0:9b334a45a8ff 116 * Use predefined macros @ref OPA_INIT_CASCADED_NON_INVERTING_OPA0,
bogdanm 0:9b334a45a8ff 117 * @ref OPA_INIT_CASCADED_NON_INVERTING_OPA1 and
bogdanm 0:9b334a45a8ff 118 * @ref OPA_INIT_CASCADED_NON_INVERTING_OPA2.
bogdanm 0:9b334a45a8ff 119 * @verbatim
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 |\ |\ |\
bogdanm 0:9b334a45a8ff 122 ___________|+\ OPA0 ___________|+\ OPA1 ___________|+\ OPA2
bogdanm 0:9b334a45a8ff 123 | \_________| | \_________| | \_______
bogdanm 0:9b334a45a8ff 124 ___|_ / | ___|_ / | ___|_ / |
bogdanm 0:9b334a45a8ff 125 | | / | | | / | | | / |
bogdanm 0:9b334a45a8ff 126 | |/ | | |/ | | |/ |
bogdanm 0:9b334a45a8ff 127 |_____R2____| |_____R2____| |_____R2____|
bogdanm 0:9b334a45a8ff 128 | | |
bogdanm 0:9b334a45a8ff 129 R1 R1 R1
bogdanm 0:9b334a45a8ff 130 | | |
bogdanm 0:9b334a45a8ff 131 NEGPAD NEGPAD NEGPAD @endverbatim
bogdanm 0:9b334a45a8ff 132 *
bogdanm 0:9b334a45a8ff 133 * \n<b>Cascaded inverting amplifiers.</b>\n
bogdanm 0:9b334a45a8ff 134 * Use predefined macros @ref OPA_INIT_CASCADED_INVERTING_OPA0,
bogdanm 0:9b334a45a8ff 135 * @ref OPA_INIT_CASCADED_INVERTING_OPA1 and
bogdanm 0:9b334a45a8ff 136 * @ref OPA_INIT_CASCADED_INVERTING_OPA2.
bogdanm 0:9b334a45a8ff 137 * @verbatim
bogdanm 0:9b334a45a8ff 138
bogdanm 0:9b334a45a8ff 139 _____R2____ _____R2____ _____R2____
bogdanm 0:9b334a45a8ff 140 | | | | | |
bogdanm 0:9b334a45a8ff 141 | |\ | | |\ | | |\ |
bogdanm 0:9b334a45a8ff 142 ____R1_|___|_\ | ____R1_|___|_\ | ____R1_|___|_\ |
bogdanm 0:9b334a45a8ff 143 | \____|____| | \____|___| | \____|__
bogdanm 0:9b334a45a8ff 144 ___| / ___| / ___| /
bogdanm 0:9b334a45a8ff 145 | |+/ OPA0 | |+/ OPA1 | |+/ OPA2
bogdanm 0:9b334a45a8ff 146 | |/ | |/ | |/
bogdanm 0:9b334a45a8ff 147 | | |
bogdanm 0:9b334a45a8ff 148 POSPAD POSPAD POSPAD @endverbatim
bogdanm 0:9b334a45a8ff 149 *
bogdanm 0:9b334a45a8ff 150 * \n<b>Differential driver with two opamp's.</b>\n
bogdanm 0:9b334a45a8ff 151 * Use predefined macros @ref OPA_INIT_DIFF_DRIVER_OPA0 and
bogdanm 0:9b334a45a8ff 152 * @ref OPA_INIT_DIFF_DRIVER_OPA1.
bogdanm 0:9b334a45a8ff 153 * @verbatim
bogdanm 0:9b334a45a8ff 154
bogdanm 0:9b334a45a8ff 155 __________________________
bogdanm 0:9b334a45a8ff 156 | +
bogdanm 0:9b334a45a8ff 157 | _____R2____
bogdanm 0:9b334a45a8ff 158 |\ | | |
bogdanm 0:9b334a45a8ff 159 ___________|+\ OPA0 | | |\ OPA1 |
bogdanm 0:9b334a45a8ff 160 | \_________|____R1_|___|_\ | _
bogdanm 0:9b334a45a8ff 161 ___|_ / | | \____|______
bogdanm 0:9b334a45a8ff 162 | | / | ___| /
bogdanm 0:9b334a45a8ff 163 | |/ | | |+/
bogdanm 0:9b334a45a8ff 164 |________________| | |/
bogdanm 0:9b334a45a8ff 165 |
bogdanm 0:9b334a45a8ff 166 POSPAD @endverbatim
bogdanm 0:9b334a45a8ff 167 *
bogdanm 0:9b334a45a8ff 168 * \n<b>Differential receiver with three opamp's.</b>\n
bogdanm 0:9b334a45a8ff 169 * Use predefined macros @ref OPA_INIT_DIFF_RECEIVER_OPA0,
bogdanm 0:9b334a45a8ff 170 * @ref OPA_INIT_DIFF_RECEIVER_OPA1 and @ref OPA_INIT_DIFF_RECEIVER_OPA2.
bogdanm 0:9b334a45a8ff 171 * @verbatim
bogdanm 0:9b334a45a8ff 172
bogdanm 0:9b334a45a8ff 173 |\
bogdanm 0:9b334a45a8ff 174 __________|+\ OPA1
bogdanm 0:9b334a45a8ff 175 _ | \_________
bogdanm 0:9b334a45a8ff 176 ___|_ / | | _____R2____
bogdanm 0:9b334a45a8ff 177 | | / | | | |
bogdanm 0:9b334a45a8ff 178 | |/ | | | |\ |
bogdanm 0:9b334a45a8ff 179 |___________| |____R1_|___|_\ |
bogdanm 0:9b334a45a8ff 180 | \____|___
bogdanm 0:9b334a45a8ff 181 |\ ____R1_ ___| /
bogdanm 0:9b334a45a8ff 182 +__________|+\ OPA0 | | |+/ OPA2
bogdanm 0:9b334a45a8ff 183 | \_________| | |/
bogdanm 0:9b334a45a8ff 184 ___|_ / | R2
bogdanm 0:9b334a45a8ff 185 | | / | |
bogdanm 0:9b334a45a8ff 186 | |/ | NEGPAD OPA0
bogdanm 0:9b334a45a8ff 187 |___________|
bogdanm 0:9b334a45a8ff 188 @endverbatim
bogdanm 0:9b334a45a8ff 189 *
bogdanm 0:9b334a45a8ff 190 * @{
bogdanm 0:9b334a45a8ff 191 ******************************************************************************/
bogdanm 0:9b334a45a8ff 192
bogdanm 0:9b334a45a8ff 193 /*******************************************************************************
bogdanm 0:9b334a45a8ff 194 ************************** GLOBAL FUNCTIONS *******************************
bogdanm 0:9b334a45a8ff 195 ******************************************************************************/
bogdanm 0:9b334a45a8ff 196
bogdanm 0:9b334a45a8ff 197 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 198 * @brief
bogdanm 0:9b334a45a8ff 199 * Disable an Operational Amplifier.
bogdanm 0:9b334a45a8ff 200 *
bogdanm 0:9b334a45a8ff 201 * @param[in] dac
bogdanm 0:9b334a45a8ff 202 * Pointer to DAC peripheral register block.
bogdanm 0:9b334a45a8ff 203 *
bogdanm 0:9b334a45a8ff 204 * @param[in] opa
bogdanm 0:9b334a45a8ff 205 * Selects an OPA, valid vaules are @ref OPA0, @ref OPA1 and @ref OPA2.
bogdanm 0:9b334a45a8ff 206 ******************************************************************************/
bogdanm 0:9b334a45a8ff 207 void OPAMP_Disable( DAC_TypeDef *dac, OPAMP_TypeDef opa )
bogdanm 0:9b334a45a8ff 208 {
bogdanm 0:9b334a45a8ff 209 EFM_ASSERT( DAC_REF_VALID( dac ) );
bogdanm 0:9b334a45a8ff 210 EFM_ASSERT( DAC_OPA_VALID( opa ) );
bogdanm 0:9b334a45a8ff 211
bogdanm 0:9b334a45a8ff 212 if ( opa == OPA0 )
bogdanm 0:9b334a45a8ff 213 {
bogdanm 0:9b334a45a8ff 214 dac->CH0CTRL &= ~DAC_CH0CTRL_EN;
bogdanm 0:9b334a45a8ff 215 dac->OPACTRL &= ~DAC_OPACTRL_OPA0EN;
bogdanm 0:9b334a45a8ff 216 }
bogdanm 0:9b334a45a8ff 217 else if ( opa == OPA1 )
bogdanm 0:9b334a45a8ff 218 {
bogdanm 0:9b334a45a8ff 219 dac->CH1CTRL &= ~DAC_CH1CTRL_EN;
bogdanm 0:9b334a45a8ff 220 dac->OPACTRL &= ~DAC_OPACTRL_OPA1EN;
bogdanm 0:9b334a45a8ff 221 }
bogdanm 0:9b334a45a8ff 222 else /* OPA2 */
bogdanm 0:9b334a45a8ff 223 {
bogdanm 0:9b334a45a8ff 224 dac->OPACTRL &= ~DAC_OPACTRL_OPA2EN;
bogdanm 0:9b334a45a8ff 225 }
bogdanm 0:9b334a45a8ff 226 }
bogdanm 0:9b334a45a8ff 227
bogdanm 0:9b334a45a8ff 228
bogdanm 0:9b334a45a8ff 229 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 230 * @brief
bogdanm 0:9b334a45a8ff 231 * Configure and enable an Operational Amplifier.
bogdanm 0:9b334a45a8ff 232 *
bogdanm 0:9b334a45a8ff 233 * @note
bogdanm 0:9b334a45a8ff 234 * The value of the alternate output enable bit mask in the OPAMP_Init_TypeDef
bogdanm 0:9b334a45a8ff 235 * structure should consist of one or more of the
bogdanm 0:9b334a45a8ff 236 * DAC_OPA[opa#]MUX_OUTPEN_OUT[output#] flags
bogdanm 0:9b334a45a8ff 237 * (defined in \<part_name\>_dac.h) OR'ed together. @n @n
bogdanm 0:9b334a45a8ff 238 * For OPA0:
bogdanm 0:9b334a45a8ff 239 * @li DAC_OPA0MUX_OUTPEN_OUT0
bogdanm 0:9b334a45a8ff 240 * @li DAC_OPA0MUX_OUTPEN_OUT1
bogdanm 0:9b334a45a8ff 241 * @li DAC_OPA0MUX_OUTPEN_OUT2
bogdanm 0:9b334a45a8ff 242 * @li DAC_OPA0MUX_OUTPEN_OUT3
bogdanm 0:9b334a45a8ff 243 * @li DAC_OPA0MUX_OUTPEN_OUT4
bogdanm 0:9b334a45a8ff 244 *
bogdanm 0:9b334a45a8ff 245 * For OPA1:
bogdanm 0:9b334a45a8ff 246 * @li DAC_OPA1MUX_OUTPEN_OUT0
bogdanm 0:9b334a45a8ff 247 * @li DAC_OPA1MUX_OUTPEN_OUT1
bogdanm 0:9b334a45a8ff 248 * @li DAC_OPA1MUX_OUTPEN_OUT2
bogdanm 0:9b334a45a8ff 249 * @li DAC_OPA1MUX_OUTPEN_OUT3
bogdanm 0:9b334a45a8ff 250 * @li DAC_OPA1MUX_OUTPEN_OUT4
bogdanm 0:9b334a45a8ff 251 *
bogdanm 0:9b334a45a8ff 252 * For OPA2:
bogdanm 0:9b334a45a8ff 253 * @li DAC_OPA2MUX_OUTPEN_OUT0
bogdanm 0:9b334a45a8ff 254 * @li DAC_OPA2MUX_OUTPEN_OUT1
bogdanm 0:9b334a45a8ff 255 *
bogdanm 0:9b334a45a8ff 256 * E.g: @n
bogdanm 0:9b334a45a8ff 257 * init.outPen = DAC_OPA0MUX_OUTPEN_OUT0 | DAC_OPA0MUX_OUTPEN_OUT4;
bogdanm 0:9b334a45a8ff 258 *
bogdanm 0:9b334a45a8ff 259 * @param[in] dac
bogdanm 0:9b334a45a8ff 260 * Pointer to DAC peripheral register block.
bogdanm 0:9b334a45a8ff 261 *
bogdanm 0:9b334a45a8ff 262 * @param[in] opa
bogdanm 0:9b334a45a8ff 263 * Selects an OPA, valid vaules are @ref OPA0, @ref OPA1 and @ref OPA2.
bogdanm 0:9b334a45a8ff 264 *
bogdanm 0:9b334a45a8ff 265 * @param[in] init
bogdanm 0:9b334a45a8ff 266 * Pointer to a structure containing OPAMP init information.
bogdanm 0:9b334a45a8ff 267 ******************************************************************************/
bogdanm 0:9b334a45a8ff 268 void OPAMP_Enable( DAC_TypeDef *dac, OPAMP_TypeDef opa, const OPAMP_Init_TypeDef *init )
bogdanm 0:9b334a45a8ff 269 {
bogdanm 0:9b334a45a8ff 270 uint32_t offset;
bogdanm 0:9b334a45a8ff 271
bogdanm 0:9b334a45a8ff 272 EFM_ASSERT( DAC_REF_VALID( dac ) );
bogdanm 0:9b334a45a8ff 273 EFM_ASSERT( DAC_OPA_VALID( opa ) );
bogdanm 0:9b334a45a8ff 274 EFM_ASSERT( init->bias <= ( _DAC_BIASPROG_BIASPROG_MASK >>
bogdanm 0:9b334a45a8ff 275 _DAC_BIASPROG_BIASPROG_SHIFT ) );
bogdanm 0:9b334a45a8ff 276
bogdanm 0:9b334a45a8ff 277 if ( opa == OPA0 )
bogdanm 0:9b334a45a8ff 278 {
bogdanm 0:9b334a45a8ff 279 EFM_ASSERT( ( init->outPen & ~_DAC_OPA0MUX_OUTPEN_MASK ) == 0 );
bogdanm 0:9b334a45a8ff 280
bogdanm 0:9b334a45a8ff 281 dac->BIASPROG = ( dac->BIASPROG
bogdanm 0:9b334a45a8ff 282 & ~( _DAC_BIASPROG_BIASPROG_MASK |
bogdanm 0:9b334a45a8ff 283 DAC_BIASPROG_HALFBIAS ) ) |
bogdanm 0:9b334a45a8ff 284 ( init->bias << _DAC_BIASPROG_BIASPROG_SHIFT ) |
bogdanm 0:9b334a45a8ff 285 ( init->halfBias ? DAC_BIASPROG_HALFBIAS : 0 );
bogdanm 0:9b334a45a8ff 286
bogdanm 0:9b334a45a8ff 287 if ( init->defaultOffset )
bogdanm 0:9b334a45a8ff 288 {
bogdanm 0:9b334a45a8ff 289 offset = SYSTEM_GetCalibrationValue( &dac->CAL );
bogdanm 0:9b334a45a8ff 290 dac->CAL = ( dac->CAL & ~_DAC_CAL_CH0OFFSET_MASK ) |
bogdanm 0:9b334a45a8ff 291 ( offset & _DAC_CAL_CH0OFFSET_MASK );
bogdanm 0:9b334a45a8ff 292 }
bogdanm 0:9b334a45a8ff 293 else
bogdanm 0:9b334a45a8ff 294 {
bogdanm 0:9b334a45a8ff 295 EFM_ASSERT( init->offset <= ( _DAC_CAL_CH0OFFSET_MASK >>
bogdanm 0:9b334a45a8ff 296 _DAC_CAL_CH0OFFSET_SHIFT ) );
bogdanm 0:9b334a45a8ff 297
bogdanm 0:9b334a45a8ff 298 dac->CAL = ( dac->CAL & ~_DAC_CAL_CH0OFFSET_MASK ) |
bogdanm 0:9b334a45a8ff 299 ( init->offset << _DAC_CAL_CH0OFFSET_SHIFT );
bogdanm 0:9b334a45a8ff 300 }
bogdanm 0:9b334a45a8ff 301
bogdanm 0:9b334a45a8ff 302 dac->OPA0MUX = (uint32_t)init->resSel |
bogdanm 0:9b334a45a8ff 303 (uint32_t)init->outMode |
bogdanm 0:9b334a45a8ff 304 init->outPen |
bogdanm 0:9b334a45a8ff 305 (uint32_t)init->resInMux |
bogdanm 0:9b334a45a8ff 306 (uint32_t)init->negSel |
bogdanm 0:9b334a45a8ff 307 (uint32_t)init->posSel |
bogdanm 0:9b334a45a8ff 308 ( init->nextOut ? DAC_OPA0MUX_NEXTOUT : 0 ) |
bogdanm 0:9b334a45a8ff 309 ( init->npEn ? DAC_OPA0MUX_NPEN : 0 ) |
bogdanm 0:9b334a45a8ff 310 ( init->ppEn ? DAC_OPA0MUX_PPEN : 0 );
bogdanm 0:9b334a45a8ff 311
bogdanm 0:9b334a45a8ff 312 dac->CH0CTRL |= DAC_CH0CTRL_EN;
bogdanm 0:9b334a45a8ff 313 dac->OPACTRL = ( dac->OPACTRL
bogdanm 0:9b334a45a8ff 314 & ~( DAC_OPACTRL_OPA0SHORT |
bogdanm 0:9b334a45a8ff 315 _DAC_OPACTRL_OPA0LPFDIS_MASK |
bogdanm 0:9b334a45a8ff 316 DAC_OPACTRL_OPA0HCMDIS ) ) |
bogdanm 0:9b334a45a8ff 317 ( init->shortInputs ? DAC_OPACTRL_OPA0SHORT : 0 ) |
bogdanm 0:9b334a45a8ff 318 ( init->lpfPosPadDisable ?
bogdanm 0:9b334a45a8ff 319 DAC_OPACTRL_OPA0LPFDIS_PLPFDIS : 0 ) |
bogdanm 0:9b334a45a8ff 320 ( init->lpfNegPadDisable ?
bogdanm 0:9b334a45a8ff 321 DAC_OPACTRL_OPA0LPFDIS_NLPFDIS : 0 ) |
bogdanm 0:9b334a45a8ff 322 ( init->hcmDisable ? DAC_OPACTRL_OPA0HCMDIS : 0 ) |
bogdanm 0:9b334a45a8ff 323 ( DAC_OPACTRL_OPA0EN );
bogdanm 0:9b334a45a8ff 324 }
bogdanm 0:9b334a45a8ff 325 else if ( opa == OPA1 )
bogdanm 0:9b334a45a8ff 326 {
bogdanm 0:9b334a45a8ff 327 EFM_ASSERT( ( init->outPen & ~_DAC_OPA1MUX_OUTPEN_MASK ) == 0 );
bogdanm 0:9b334a45a8ff 328
bogdanm 0:9b334a45a8ff 329 dac->BIASPROG = ( dac->BIASPROG
bogdanm 0:9b334a45a8ff 330 & ~( _DAC_BIASPROG_BIASPROG_MASK |
bogdanm 0:9b334a45a8ff 331 DAC_BIASPROG_HALFBIAS ) ) |
bogdanm 0:9b334a45a8ff 332 ( init->bias << _DAC_BIASPROG_BIASPROG_SHIFT ) |
bogdanm 0:9b334a45a8ff 333 ( init->halfBias ? DAC_BIASPROG_HALFBIAS : 0 );
bogdanm 0:9b334a45a8ff 334
bogdanm 0:9b334a45a8ff 335 if ( init->defaultOffset )
bogdanm 0:9b334a45a8ff 336 {
bogdanm 0:9b334a45a8ff 337 offset = SYSTEM_GetCalibrationValue( &dac->CAL );
bogdanm 0:9b334a45a8ff 338 dac->CAL = ( dac->CAL & ~_DAC_CAL_CH1OFFSET_MASK ) |
bogdanm 0:9b334a45a8ff 339 ( offset & _DAC_CAL_CH1OFFSET_MASK );
bogdanm 0:9b334a45a8ff 340 }
bogdanm 0:9b334a45a8ff 341 else
bogdanm 0:9b334a45a8ff 342 {
bogdanm 0:9b334a45a8ff 343 EFM_ASSERT( init->offset <= ( _DAC_CAL_CH1OFFSET_MASK >>
bogdanm 0:9b334a45a8ff 344 _DAC_CAL_CH1OFFSET_SHIFT ) );
bogdanm 0:9b334a45a8ff 345
bogdanm 0:9b334a45a8ff 346 dac->CAL = ( dac->CAL & ~_DAC_CAL_CH1OFFSET_MASK ) |
bogdanm 0:9b334a45a8ff 347 ( init->offset << _DAC_CAL_CH1OFFSET_SHIFT );
bogdanm 0:9b334a45a8ff 348 }
bogdanm 0:9b334a45a8ff 349
bogdanm 0:9b334a45a8ff 350 dac->OPA1MUX = (uint32_t)init->resSel |
bogdanm 0:9b334a45a8ff 351 (uint32_t)init->outMode |
bogdanm 0:9b334a45a8ff 352 init->outPen |
bogdanm 0:9b334a45a8ff 353 (uint32_t)init->resInMux |
bogdanm 0:9b334a45a8ff 354 (uint32_t)init->negSel |
bogdanm 0:9b334a45a8ff 355 (uint32_t)init->posSel |
bogdanm 0:9b334a45a8ff 356 ( init->nextOut ? DAC_OPA1MUX_NEXTOUT : 0 ) |
bogdanm 0:9b334a45a8ff 357 ( init->npEn ? DAC_OPA1MUX_NPEN : 0 ) |
bogdanm 0:9b334a45a8ff 358 ( init->ppEn ? DAC_OPA1MUX_PPEN : 0 );
bogdanm 0:9b334a45a8ff 359
bogdanm 0:9b334a45a8ff 360 dac->CH1CTRL |= DAC_CH1CTRL_EN;
bogdanm 0:9b334a45a8ff 361 dac->OPACTRL = ( dac->OPACTRL
bogdanm 0:9b334a45a8ff 362 & ~( DAC_OPACTRL_OPA1SHORT |
bogdanm 0:9b334a45a8ff 363 _DAC_OPACTRL_OPA1LPFDIS_MASK |
bogdanm 0:9b334a45a8ff 364 DAC_OPACTRL_OPA1HCMDIS ) ) |
bogdanm 0:9b334a45a8ff 365 ( init->shortInputs ? DAC_OPACTRL_OPA1SHORT : 0 ) |
bogdanm 0:9b334a45a8ff 366 ( init->lpfPosPadDisable ?
bogdanm 0:9b334a45a8ff 367 DAC_OPACTRL_OPA1LPFDIS_PLPFDIS : 0 ) |
bogdanm 0:9b334a45a8ff 368 ( init->lpfNegPadDisable ?
bogdanm 0:9b334a45a8ff 369 DAC_OPACTRL_OPA1LPFDIS_NLPFDIS : 0 ) |
bogdanm 0:9b334a45a8ff 370 ( init->hcmDisable ? DAC_OPACTRL_OPA1HCMDIS : 0 ) |
bogdanm 0:9b334a45a8ff 371 ( DAC_OPACTRL_OPA1EN );
bogdanm 0:9b334a45a8ff 372 }
bogdanm 0:9b334a45a8ff 373 else /* OPA2 */
bogdanm 0:9b334a45a8ff 374 {
bogdanm 0:9b334a45a8ff 375 EFM_ASSERT( ( init->posSel == DAC_OPA2MUX_POSSEL_DISABLE ) ||
bogdanm 0:9b334a45a8ff 376 ( init->posSel == DAC_OPA2MUX_POSSEL_POSPAD ) ||
bogdanm 0:9b334a45a8ff 377 ( init->posSel == DAC_OPA2MUX_POSSEL_OPA1INP ) ||
bogdanm 0:9b334a45a8ff 378 ( init->posSel == DAC_OPA2MUX_POSSEL_OPATAP ) );
bogdanm 0:9b334a45a8ff 379
bogdanm 0:9b334a45a8ff 380 EFM_ASSERT( ( init->outMode & ~DAC_OPA2MUX_OUTMODE ) == 0 );
bogdanm 0:9b334a45a8ff 381
bogdanm 0:9b334a45a8ff 382 EFM_ASSERT( ( init->outPen & ~_DAC_OPA2MUX_OUTPEN_MASK ) == 0 );
bogdanm 0:9b334a45a8ff 383
bogdanm 0:9b334a45a8ff 384 dac->BIASPROG = ( dac->BIASPROG
bogdanm 0:9b334a45a8ff 385 & ~( _DAC_BIASPROG_OPA2BIASPROG_MASK |
bogdanm 0:9b334a45a8ff 386 DAC_BIASPROG_OPA2HALFBIAS ) ) |
bogdanm 0:9b334a45a8ff 387 ( init->bias << _DAC_BIASPROG_OPA2BIASPROG_SHIFT ) |
bogdanm 0:9b334a45a8ff 388 ( init->halfBias ? DAC_BIASPROG_OPA2HALFBIAS : 0 );
bogdanm 0:9b334a45a8ff 389
bogdanm 0:9b334a45a8ff 390 if ( init->defaultOffset )
bogdanm 0:9b334a45a8ff 391 {
bogdanm 0:9b334a45a8ff 392 offset = SYSTEM_GetCalibrationValue( &dac->OPAOFFSET );
bogdanm 0:9b334a45a8ff 393 dac->OPAOFFSET = ( dac->OPAOFFSET & ~_DAC_OPAOFFSET_OPA2OFFSET_MASK ) |
bogdanm 0:9b334a45a8ff 394 ( offset & _DAC_OPAOFFSET_OPA2OFFSET_MASK );
bogdanm 0:9b334a45a8ff 395 }
bogdanm 0:9b334a45a8ff 396 else
bogdanm 0:9b334a45a8ff 397 {
bogdanm 0:9b334a45a8ff 398 EFM_ASSERT( init->offset <= ( _DAC_OPAOFFSET_OPA2OFFSET_MASK >>
bogdanm 0:9b334a45a8ff 399 _DAC_OPAOFFSET_OPA2OFFSET_SHIFT ) );
bogdanm 0:9b334a45a8ff 400 dac->OPAOFFSET = ( dac->OPAOFFSET & ~_DAC_OPAOFFSET_OPA2OFFSET_MASK ) |
bogdanm 0:9b334a45a8ff 401 ( init->offset << _DAC_OPAOFFSET_OPA2OFFSET_SHIFT );
bogdanm 0:9b334a45a8ff 402 }
bogdanm 0:9b334a45a8ff 403
bogdanm 0:9b334a45a8ff 404 dac->OPA2MUX = (uint32_t)init->resSel |
bogdanm 0:9b334a45a8ff 405 (uint32_t)init->outMode |
bogdanm 0:9b334a45a8ff 406 init->outPen |
bogdanm 0:9b334a45a8ff 407 (uint32_t)init->resInMux |
bogdanm 0:9b334a45a8ff 408 (uint32_t)init->negSel |
bogdanm 0:9b334a45a8ff 409 (uint32_t)init->posSel |
bogdanm 0:9b334a45a8ff 410 ( init->nextOut ? DAC_OPA2MUX_NEXTOUT : 0 ) |
bogdanm 0:9b334a45a8ff 411 ( init->npEn ? DAC_OPA2MUX_NPEN : 0 ) |
bogdanm 0:9b334a45a8ff 412 ( init->ppEn ? DAC_OPA2MUX_PPEN : 0 );
bogdanm 0:9b334a45a8ff 413
bogdanm 0:9b334a45a8ff 414 dac->OPACTRL = ( dac->OPACTRL
bogdanm 0:9b334a45a8ff 415 & ~( DAC_OPACTRL_OPA2SHORT |
bogdanm 0:9b334a45a8ff 416 _DAC_OPACTRL_OPA2LPFDIS_MASK |
bogdanm 0:9b334a45a8ff 417 DAC_OPACTRL_OPA2HCMDIS ) ) |
bogdanm 0:9b334a45a8ff 418 ( init->shortInputs ? DAC_OPACTRL_OPA2SHORT : 0 ) |
bogdanm 0:9b334a45a8ff 419 ( init->lpfPosPadDisable ?
bogdanm 0:9b334a45a8ff 420 DAC_OPACTRL_OPA2LPFDIS_PLPFDIS : 0 ) |
bogdanm 0:9b334a45a8ff 421 ( init->lpfNegPadDisable ?
bogdanm 0:9b334a45a8ff 422 DAC_OPACTRL_OPA2LPFDIS_NLPFDIS : 0 ) |
bogdanm 0:9b334a45a8ff 423 ( init->hcmDisable ? DAC_OPACTRL_OPA2HCMDIS : 0 ) |
bogdanm 0:9b334a45a8ff 424 ( DAC_OPACTRL_OPA2EN );
bogdanm 0:9b334a45a8ff 425 }
bogdanm 0:9b334a45a8ff 426 }
bogdanm 0:9b334a45a8ff 427
bogdanm 0:9b334a45a8ff 428 /** @} (end addtogroup OPAMP) */
bogdanm 0:9b334a45a8ff 429 /** @} (end addtogroup EM_Library) */
bogdanm 0:9b334a45a8ff 430
bogdanm 0:9b334a45a8ff 431 #endif /* defined( OPAMP_PRESENT ) && ( OPAMP_COUNT == 1 ) */