mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/analogout_api.c@188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16 #include "objects.h"
AnnaBridge 167:e84263d55307 17 #include "analogout_api.h"
AnnaBridge 167:e84263d55307 18
AnnaBridge 167:e84263d55307 19
AnnaBridge 167:e84263d55307 20 #if CONFIG_DAC_EN
AnnaBridge 167:e84263d55307 21
AnnaBridge 167:e84263d55307 22 #include "cmsis.h"
AnnaBridge 167:e84263d55307 23 #include "pinmap.h"
AnnaBridge 167:e84263d55307 24 #include <string.h>
AnnaBridge 167:e84263d55307 25
AnnaBridge 167:e84263d55307 26 #define DAC_POSITIVE_FULL_SCALE 0x7E0
AnnaBridge 167:e84263d55307 27 #define DAC_NEGATIVE_FULL_SCALE 0x820
AnnaBridge 167:e84263d55307 28
AnnaBridge 188:bcfe06ba3d64 29 extern void HalDACPinMuxInit(void *Data);
AnnaBridge 188:bcfe06ba3d64 30 extern void HalDACPinMuxDeInit(void *Data);
AnnaBridge 167:e84263d55307 31
AnnaBridge 167:e84263d55307 32 /** \brief analogout_init:\n
AnnaBridge 167:e84263d55307 33 * to initialize DAC
AnnaBridge 167:e84263d55307 34 *
AnnaBridge 167:e84263d55307 35 * This function is mainly to initialize a DAC channel.
AnnaBridge 167:e84263d55307 36 * \para dac_t *: obj
AnnaBridge 167:e84263d55307 37 * \para PinName: pin
AnnaBridge 167:e84263d55307 38 */
AnnaBridge 167:e84263d55307 39 void analogout_init(dac_t *obj, PinName pin)
AnnaBridge 167:e84263d55307 40 {
AnnaBridge 167:e84263d55307 41 uint32_t dac_idx;
AnnaBridge 167:e84263d55307 42 uint32_t DacTemp;
AnnaBridge 167:e84263d55307 43 PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)&(obj->DACpara);
AnnaBridge 167:e84263d55307 44 dac_idx = pin & 0x0F;
AnnaBridge 167:e84263d55307 45
AnnaBridge 167:e84263d55307 46 /* Assign dac index */
AnnaBridge 167:e84263d55307 47 pHalDacInitData->DACIdx = dac_idx;
AnnaBridge 167:e84263d55307 48
AnnaBridge 167:e84263d55307 49 pHalDacInitData->DACEn = DAC_DISABLE;
AnnaBridge 167:e84263d55307 50 pHalDacInitData->DACDataRate = DAC_DATA_RATE_250K;
AnnaBridge 167:e84263d55307 51 pHalDacInitData->DACEndian = DAC_DATA_ENDIAN_LITTLE;
AnnaBridge 167:e84263d55307 52 pHalDacInitData->DACBurstSz = 10;
AnnaBridge 167:e84263d55307 53 pHalDacInitData->DACDbgSel = DAC_DBG_SEL_DISABLE;
AnnaBridge 167:e84263d55307 54 pHalDacInitData->DACDscDbgSel = DAC_DSC_DBG_SEL_DISABLE;
AnnaBridge 167:e84263d55307 55 pHalDacInitData->DACBPDsc = DAC_BYPASS_DSC_SEL_DISABLE;
AnnaBridge 167:e84263d55307 56 pHalDacInitData->DACDeltaSig = 0;
AnnaBridge 167:e84263d55307 57 pHalDacInitData->DACAnaCtrl0 = 0;
AnnaBridge 167:e84263d55307 58 pHalDacInitData->DACAnaCtrl1 = 0;
AnnaBridge 167:e84263d55307 59 pHalDacInitData->DACIntrMSK = DAC_FEATURE_DISABLED;
AnnaBridge 167:e84263d55307 60
AnnaBridge 167:e84263d55307 61 /* DAC Function and Clock Enable*/
AnnaBridge 167:e84263d55307 62 HalDACPinMuxInit(pHalDacInitData);
AnnaBridge 167:e84263d55307 63
AnnaBridge 167:e84263d55307 64 HalDACInit8195a(pHalDacInitData);
AnnaBridge 167:e84263d55307 65
AnnaBridge 167:e84263d55307 66 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC_INTR_CTRL,
AnnaBridge 167:e84263d55307 67 (BIT_DAC_FIFO_FULL_EN |
AnnaBridge 167:e84263d55307 68 BIT_DAC_FIFO_OVERFLOW_EN |
AnnaBridge 167:e84263d55307 69 BIT_DAC_FIFO_STOP_EN |
AnnaBridge 167:e84263d55307 70 BIT_DAC__WRITE_ERROR_EN |
AnnaBridge 167:e84263d55307 71 BIT_DAC_DSC_OVERFLOW0_EN |
AnnaBridge 167:e84263d55307 72 BIT_DAC_DSC_OVERFLOW1_EN));
AnnaBridge 167:e84263d55307 73 DBG_DAC_INFO("INTR MSK:%x\n", HAL_DAC_READ32(pHalDacInitData->DACIdx,REG_DAC_INTR_CTRL));
AnnaBridge 167:e84263d55307 74
AnnaBridge 167:e84263d55307 75 DacTemp = HAL_DAC_READ32(pHalDacInitData->DACIdx, REG_DAC_ANAPAR_DA1);
AnnaBridge 167:e84263d55307 76 DacTemp |= (BIT31);
AnnaBridge 167:e84263d55307 77 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC_ANAPAR_DA1, DacTemp);
AnnaBridge 167:e84263d55307 78 DBG_DAC_INFO("REG_DAC_ANAPAR_DA1:%08x\n",HAL_DAC_READ32(pHalDacInitData->DACIdx, REG_DAC_ANAPAR_DA1));
AnnaBridge 167:e84263d55307 79
AnnaBridge 167:e84263d55307 80 DacTemp = HAL_DAC_READ32(pHalDacInitData->DACIdx, REG_DAC_CTRL);
AnnaBridge 167:e84263d55307 81 DacTemp |= BIT3;
AnnaBridge 167:e84263d55307 82 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC_CTRL, DacTemp);
AnnaBridge 167:e84263d55307 83 DBG_DAC_INFO("REG_DAC_CTRL:%08x\n",DacTemp);
AnnaBridge 167:e84263d55307 84
AnnaBridge 167:e84263d55307 85 pHalDacInitData->DACEn = DAC_ENABLE;
AnnaBridge 167:e84263d55307 86 HalDACEnableRtl8195a(pHalDacInitData);
AnnaBridge 167:e84263d55307 87 osDelay(6); //hardware needs some time to get ready
AnnaBridge 167:e84263d55307 88 }
AnnaBridge 167:e84263d55307 89
AnnaBridge 167:e84263d55307 90 /** \brief analogout_free:\n
AnnaBridge 167:e84263d55307 91 * to free DAC
AnnaBridge 167:e84263d55307 92 *
AnnaBridge 167:e84263d55307 93 * This function is mainly to free a DAC channel.
AnnaBridge 167:e84263d55307 94 * \para dac_t *: obj
AnnaBridge 167:e84263d55307 95 */
AnnaBridge 167:e84263d55307 96 void analogout_free(dac_t *obj)
AnnaBridge 167:e84263d55307 97 {
AnnaBridge 167:e84263d55307 98 PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)&(obj->DACpara);
AnnaBridge 167:e84263d55307 99
AnnaBridge 167:e84263d55307 100 HalDACPinMuxDeInit(pHalDacInitData);
AnnaBridge 167:e84263d55307 101
AnnaBridge 167:e84263d55307 102 pHalDacInitData->DACEn = DAC_DISABLE;
AnnaBridge 167:e84263d55307 103 HalDACEnableRtl8195a(pHalDacInitData);
AnnaBridge 167:e84263d55307 104 }
AnnaBridge 167:e84263d55307 105
AnnaBridge 167:e84263d55307 106 /** \brief analogout_write:\n
AnnaBridge 167:e84263d55307 107 * to execute analogout_write
AnnaBridge 167:e84263d55307 108 *
AnnaBridge 167:e84263d55307 109 * This function is mainly to execute analog output and the value is a ratio.
AnnaBridge 167:e84263d55307 110 * The upper/lower bound of DAC register input value is defined by
AnnaBridge 167:e84263d55307 111 * DAC_XXXXX_FULL_SCALE. The parameter "value" of this function should be
AnnaBridge 167:e84263d55307 112 * transfered to register value.
AnnaBridge 167:e84263d55307 113 *
AnnaBridge 167:e84263d55307 114 * \para dac_t * : obj
AnnaBridge 167:e84263d55307 115 * \para float : value
AnnaBridge 167:e84263d55307 116 */
AnnaBridge 167:e84263d55307 117 void analogout_write(dac_t *obj, float value)
AnnaBridge 167:e84263d55307 118 {
AnnaBridge 167:e84263d55307 119 uint32_t dactemp;
AnnaBridge 167:e84263d55307 120 uint16_t dacnegtemp;
AnnaBridge 167:e84263d55307 121 PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)&(obj->DACpara);
AnnaBridge 167:e84263d55307 122
AnnaBridge 167:e84263d55307 123 if (value < 0.0f) {
AnnaBridge 167:e84263d55307 124 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC0_FIFO_WR, 0x00000000);
AnnaBridge 167:e84263d55307 125 } else if (value > 1.0f) {
AnnaBridge 167:e84263d55307 126 dactemp = (DAC_POSITIVE_FULL_SCALE<<16) | DAC_POSITIVE_FULL_SCALE;
AnnaBridge 167:e84263d55307 127 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC0_FIFO_WR, dactemp);
AnnaBridge 167:e84263d55307 128 } else {
AnnaBridge 167:e84263d55307 129 if (value >= 0.5) {
AnnaBridge 167:e84263d55307 130 dactemp = (uint32_t)((((value-0.5)/0.5) * (2^12)) * DAC_POSITIVE_FULL_SCALE);
AnnaBridge 167:e84263d55307 131 dactemp = dactemp / (2^12);
AnnaBridge 167:e84263d55307 132 dactemp = (dactemp<<16) | dactemp;
AnnaBridge 167:e84263d55307 133 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC0_FIFO_WR, dactemp);
AnnaBridge 167:e84263d55307 134 } else {
AnnaBridge 167:e84263d55307 135 dacnegtemp = (DAC_NEGATIVE_FULL_SCALE & 0x7FF);
AnnaBridge 167:e84263d55307 136 dacnegtemp = ((~dacnegtemp) + 1) & 0x7FF;
AnnaBridge 167:e84263d55307 137 dactemp = (uint32_t)(((0.5-value)/0.5) * (2^12) * dacnegtemp);
AnnaBridge 167:e84263d55307 138 dactemp = dactemp / (2^12);
AnnaBridge 167:e84263d55307 139 dactemp = 0x1000 - dactemp; //change to 2's complement
AnnaBridge 167:e84263d55307 140 dactemp = (dactemp<<16) | dactemp;
AnnaBridge 167:e84263d55307 141 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC0_FIFO_WR, dactemp);
AnnaBridge 167:e84263d55307 142 }
AnnaBridge 167:e84263d55307 143 }
AnnaBridge 167:e84263d55307 144 }
AnnaBridge 167:e84263d55307 145
AnnaBridge 167:e84263d55307 146 /** \brief analogout_write_u16:\n
AnnaBridge 167:e84263d55307 147 * to execute analogout_write_u16
AnnaBridge 167:e84263d55307 148 *
AnnaBridge 167:e84263d55307 149 * The register value of DAC input is a format of 2's complement.
AnnaBridge 167:e84263d55307 150 * The most maximum value of positive value drives DAC to output a voltage about 3.3V.
AnnaBridge 167:e84263d55307 151 * The most mimimum value of negative value drives DAC to output a voltage about 0.
AnnaBridge 167:e84263d55307 152 * And the middle value of 0x000 will drive DAC to output a voltage of half of max voltage.
AnnaBridge 167:e84263d55307 153 *
AnnaBridge 167:e84263d55307 154 * \para dac_t * : obj
AnnaBridge 167:e84263d55307 155 * \para float : value
AnnaBridge 167:e84263d55307 156 */
AnnaBridge 167:e84263d55307 157 void analogout_write_u16(dac_t *obj, uint16_t value)
AnnaBridge 167:e84263d55307 158 {
AnnaBridge 167:e84263d55307 159 uint32_t dactemp;
AnnaBridge 167:e84263d55307 160 PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)&(obj->DACpara);
AnnaBridge 167:e84263d55307 161
AnnaBridge 167:e84263d55307 162 /* To give a two point data */
AnnaBridge 167:e84263d55307 163 dactemp = (value << 16) | value;
AnnaBridge 167:e84263d55307 164 HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC0_FIFO_WR, dactemp);
AnnaBridge 167:e84263d55307 165 }
AnnaBridge 167:e84263d55307 166
AnnaBridge 167:e84263d55307 167 /** \brief analogout_read_u16:\n
AnnaBridge 167:e84263d55307 168 * to read back analog output value in float format
AnnaBridge 167:e84263d55307 169 *
AnnaBridge 167:e84263d55307 170 * This function is NOT available in rtl8195a hardware design.
AnnaBridge 167:e84263d55307 171 * It always returns a fixed value of 0.0;
AnnaBridge 167:e84263d55307 172 * \para dac_t * : obj
AnnaBridge 167:e84263d55307 173 */
AnnaBridge 167:e84263d55307 174 float analogout_read(dac_t *obj)
AnnaBridge 167:e84263d55307 175 {
AnnaBridge 167:e84263d55307 176 return (float)0.0;
AnnaBridge 167:e84263d55307 177 }
AnnaBridge 167:e84263d55307 178
AnnaBridge 167:e84263d55307 179 /** \brief analogout_read_u16:\n
AnnaBridge 167:e84263d55307 180 * to read back analog output register value
AnnaBridge 167:e84263d55307 181 *
AnnaBridge 167:e84263d55307 182 * This function is NOT available in rtl8195a hardware design.
AnnaBridge 167:e84263d55307 183 * It always returns a fixed value of 0xFFFF;
AnnaBridge 167:e84263d55307 184 * \para dac_t * : obj
AnnaBridge 167:e84263d55307 185 */
AnnaBridge 167:e84263d55307 186 uint16_t analogout_read_u16(dac_t *obj)
AnnaBridge 167:e84263d55307 187 {
AnnaBridge 167:e84263d55307 188 return (uint16_t)0xFFFF;
AnnaBridge 167:e84263d55307 189 }
AnnaBridge 167:e84263d55307 190
AnnaBridge 167:e84263d55307 191 #endif