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:
180:96ed750bd169
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 178:79309dc6340a 1 /*******************************************************************************
AnnaBridge 178:79309dc6340a 2 * Copyright (c) 2010-2017 Analog Devices, Inc.
AnnaBridge 178:79309dc6340a 3 *
AnnaBridge 178:79309dc6340a 4 * All rights reserved.
AnnaBridge 178:79309dc6340a 5 *
AnnaBridge 178:79309dc6340a 6 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 178:79309dc6340a 7 * are permitted provided that the following conditions are met:
AnnaBridge 178:79309dc6340a 8 * - Redistributions of source code must retain the above copyright notice,
AnnaBridge 178:79309dc6340a 9 * this list of conditions and the following disclaimer.
AnnaBridge 178:79309dc6340a 10 * - Redistributions in binary form must reproduce the above copyright notice,
AnnaBridge 178:79309dc6340a 11 * this list of conditions and the following disclaimer in the documentation
AnnaBridge 178:79309dc6340a 12 * and/or other materials provided with the distribution.
AnnaBridge 178:79309dc6340a 13 * - Modified versions of the software must be conspicuously marked as such.
AnnaBridge 178:79309dc6340a 14 * - This software is licensed solely and exclusively for use with processors
AnnaBridge 178:79309dc6340a 15 * manufactured by or for Analog Devices, Inc.
AnnaBridge 178:79309dc6340a 16 * - This software may not be combined or merged with other code in any manner
AnnaBridge 178:79309dc6340a 17 * that would cause the software to become subject to terms and conditions
AnnaBridge 178:79309dc6340a 18 * which differ from those listed here.
AnnaBridge 178:79309dc6340a 19 * - Neither the name of Analog Devices, Inc. nor the names of its
AnnaBridge 178:79309dc6340a 20 * contributors may be used to endorse or promote products derived
AnnaBridge 178:79309dc6340a 21 * from this software without specific prior written permission.
AnnaBridge 178:79309dc6340a 22 * - The use of this software may or may not infringe the patent rights of one
AnnaBridge 178:79309dc6340a 23 * or more patent holders. This license does not release you from the
AnnaBridge 178:79309dc6340a 24 * requirement that you obtain separate licenses from these patent holders
AnnaBridge 178:79309dc6340a 25 * to use this software.
AnnaBridge 178:79309dc6340a 26 *
AnnaBridge 178:79309dc6340a 27 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS"
AnnaBridge 178:79309dc6340a 28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-
AnnaBridge 178:79309dc6340a 29 * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 178:79309dc6340a 30 * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE
AnnaBridge 178:79309dc6340a 31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR
AnnaBridge 178:79309dc6340a 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF
AnnaBridge 178:79309dc6340a 33 * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF
AnnaBridge 178:79309dc6340a 34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
AnnaBridge 178:79309dc6340a 35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
AnnaBridge 178:79309dc6340a 36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
AnnaBridge 178:79309dc6340a 37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
AnnaBridge 178:79309dc6340a 38 * POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 178:79309dc6340a 39 ******************************************************************************/
AnnaBridge 178:79309dc6340a 40
AnnaBridge 178:79309dc6340a 41 #include "mbed_assert.h"
AnnaBridge 178:79309dc6340a 42 #include "analogin_api.h"
AnnaBridge 178:79309dc6340a 43
AnnaBridge 178:79309dc6340a 44 #if DEVICE_ANALOGIN
AnnaBridge 178:79309dc6340a 45
AnnaBridge 178:79309dc6340a 46 #include "adi_adc_def.h"
AnnaBridge 178:79309dc6340a 47 #include "pinmap.h"
AnnaBridge 178:79309dc6340a 48 #include "PeripheralPins.h"
AnnaBridge 178:79309dc6340a 49
AnnaBridge 178:79309dc6340a 50 #ifdef __cplusplus
AnnaBridge 178:79309dc6340a 51 extern "C" {
AnnaBridge 178:79309dc6340a 52 #endif
AnnaBridge 178:79309dc6340a 53
AnnaBridge 178:79309dc6340a 54 /* ADC Device number */
AnnaBridge 178:79309dc6340a 55 #define ADC_DEV_NUM (0u)
AnnaBridge 178:79309dc6340a 56
AnnaBridge 178:79309dc6340a 57 /* Memory Required for adc driver */
AnnaBridge 178:79309dc6340a 58 static uint32_t DeviceMemory[(ADI_ADC_MEMORY_SIZE+3)/4];
AnnaBridge 178:79309dc6340a 59 /* Active channel */
AnnaBridge 178:79309dc6340a 60 static uint32_t adi_pin2channel(PinName pin);
AnnaBridge 178:79309dc6340a 61
AnnaBridge 178:79309dc6340a 62 /**
AnnaBridge 178:79309dc6340a 63 * \defgroup hal_analogin Analogin hal functions
AnnaBridge 178:79309dc6340a 64 * @{
AnnaBridge 178:79309dc6340a 65 */
AnnaBridge 178:79309dc6340a 66
AnnaBridge 178:79309dc6340a 67 /** Initialize the analogin peripheral
AnnaBridge 178:79309dc6340a 68 *
AnnaBridge 178:79309dc6340a 69 * Configures the pin used by analogin.
AnnaBridge 178:79309dc6340a 70 * @param obj The analogin object to initialize
AnnaBridge 178:79309dc6340a 71 * @param pin The analogin pin name
AnnaBridge 178:79309dc6340a 72 */
AnnaBridge 178:79309dc6340a 73 void analogin_init(analogin_t *obj, PinName pin)
AnnaBridge 178:79309dc6340a 74 {
AnnaBridge 178:79309dc6340a 75 ADI_ADC_HANDLE hDevice;
AnnaBridge 178:79309dc6340a 76 bool bCalibrationDone = false;
AnnaBridge 178:79309dc6340a 77 bool bReady = false;
AnnaBridge 178:79309dc6340a 78
AnnaBridge 178:79309dc6340a 79 ADCName peripheral;
AnnaBridge 178:79309dc6340a 80 uint32_t function, channel;
AnnaBridge 178:79309dc6340a 81
Anna Bridge 180:96ed750bd169 82 memset(obj, 0, sizeof(analogin_t) );
Anna Bridge 180:96ed750bd169 83 memset( DeviceMemory, 0, sizeof( DeviceMemory ) );
Anna Bridge 180:96ed750bd169 84
Anna Bridge 180:96ed750bd169 85 peripheral = (ADCName)pinmap_peripheral(pin, &PinMap_ADC[0]); // gives peripheral
AnnaBridge 178:79309dc6340a 86 MBED_ASSERT(peripheral != (ADCName)NC);
AnnaBridge 178:79309dc6340a 87
AnnaBridge 178:79309dc6340a 88 /* verify read function */
AnnaBridge 178:79309dc6340a 89 function = pinmap_function(pin, &PinMap_ADC[0]);
AnnaBridge 178:79309dc6340a 90 MBED_ASSERT(function == 1);
AnnaBridge 178:79309dc6340a 91
AnnaBridge 178:79309dc6340a 92 /* Configure PORT2_MUX registers */
AnnaBridge 178:79309dc6340a 93 pin_function(pin, function);
AnnaBridge 178:79309dc6340a 94
AnnaBridge 178:79309dc6340a 95 /* Configure active channel */
AnnaBridge 178:79309dc6340a 96 channel = adi_pin2channel(pin);
AnnaBridge 178:79309dc6340a 97 MBED_ASSERT(channel != 0xFFFFFFFF);
AnnaBridge 178:79309dc6340a 98 obj->UserBuffer.nChannels = channel;
AnnaBridge 178:79309dc6340a 99
AnnaBridge 178:79309dc6340a 100 /* Set ACLK to CCLK/16 */
AnnaBridge 178:79309dc6340a 101 adi_pwr_SetClockDivider(ADI_CLOCK_ACLK,16);
AnnaBridge 178:79309dc6340a 102
AnnaBridge 178:79309dc6340a 103 /* Set default values for conversion and delay cycles. This sets up a sampling rate of
AnnaBridge 178:79309dc6340a 104 16kHz. The sampling frequency is worked out from the following:
AnnaBridge 178:79309dc6340a 105
AnnaBridge 178:79309dc6340a 106 if delay time > 0:
AnnaBridge 178:79309dc6340a 107 Fs = ACLK / [((14 + sampling time) * oversample factor) + (delay time + 2)]
AnnaBridge 178:79309dc6340a 108 if delay time = 0:
AnnaBridge 178:79309dc6340a 109 Fs = ACLK / ((14 + sampling time) * oversample factor)
AnnaBridge 178:79309dc6340a 110
AnnaBridge 178:79309dc6340a 111 The sampling (or acquisition) and delay times are in number of ACLK clock cycles.
AnnaBridge 178:79309dc6340a 112 */
AnnaBridge 178:79309dc6340a 113 obj->DelayCycles = 0;
AnnaBridge 178:79309dc6340a 114 obj->SampleCycles = 88;
AnnaBridge 178:79309dc6340a 115
AnnaBridge 178:79309dc6340a 116 /* Open the ADC device */
AnnaBridge 178:79309dc6340a 117 adi_adc_Open(ADC_DEV_NUM, DeviceMemory, sizeof(DeviceMemory), &hDevice);
AnnaBridge 178:79309dc6340a 118 obj->hDevice = hDevice;
AnnaBridge 178:79309dc6340a 119
AnnaBridge 178:79309dc6340a 120 /* Power up ADC */
AnnaBridge 178:79309dc6340a 121 adi_adc_PowerUp(hDevice, true);
AnnaBridge 178:79309dc6340a 122
AnnaBridge 178:79309dc6340a 123 /* Set ADC reference */
AnnaBridge 178:79309dc6340a 124 adi_adc_SetVrefSource(hDevice, ADI_ADC_VREF_SRC_INT_2_50_V);
AnnaBridge 178:79309dc6340a 125
AnnaBridge 178:79309dc6340a 126 /* Enable ADC sub system */
AnnaBridge 178:79309dc6340a 127 adi_adc_EnableADCSubSystem(hDevice, true);
AnnaBridge 178:79309dc6340a 128
AnnaBridge 178:79309dc6340a 129 /* Wait untilthe ADC is ready for sampling */
AnnaBridge 178:79309dc6340a 130 while(bReady == false) {
AnnaBridge 178:79309dc6340a 131 adi_adc_IsReady(hDevice, &bReady);
AnnaBridge 178:79309dc6340a 132 }
AnnaBridge 178:79309dc6340a 133
AnnaBridge 178:79309dc6340a 134 /* Start calibration */
AnnaBridge 178:79309dc6340a 135 adi_adc_StartCalibration(hDevice);
AnnaBridge 178:79309dc6340a 136
AnnaBridge 178:79309dc6340a 137 /* Wait until calibration is done */
AnnaBridge 178:79309dc6340a 138 while (!bCalibrationDone) {
AnnaBridge 178:79309dc6340a 139 adi_adc_IsCalibrationDone(hDevice, &bCalibrationDone);
AnnaBridge 178:79309dc6340a 140 }
AnnaBridge 178:79309dc6340a 141
AnnaBridge 178:79309dc6340a 142 /* Set the delay time */
AnnaBridge 178:79309dc6340a 143 adi_adc_SetDelayTime(hDevice, obj->DelayCycles);
AnnaBridge 178:79309dc6340a 144
AnnaBridge 178:79309dc6340a 145 /* Set the acquisition time. (Application need to change it based on the impedence) */
AnnaBridge 178:79309dc6340a 146 adi_adc_SetAcquisitionTime(hDevice, obj->SampleCycles);
Anna Bridge 180:96ed750bd169 147
AnnaBridge 178:79309dc6340a 148 }
AnnaBridge 178:79309dc6340a 149
AnnaBridge 178:79309dc6340a 150 /** Read the input voltage, represented as a float in the range [0.0, 1.0]
AnnaBridge 178:79309dc6340a 151 *
AnnaBridge 178:79309dc6340a 152 * @param obj The analogin object
AnnaBridge 178:79309dc6340a 153 * @return A floating value representing the current input voltage
AnnaBridge 178:79309dc6340a 154 */
AnnaBridge 178:79309dc6340a 155 float analogin_read(analogin_t *obj)
AnnaBridge 178:79309dc6340a 156 {
AnnaBridge 178:79309dc6340a 157 float fl32 = (float)analogin_read_u16(obj)/(float)4095.0;
AnnaBridge 178:79309dc6340a 158
AnnaBridge 178:79309dc6340a 159 return(fl32);
AnnaBridge 178:79309dc6340a 160 }
AnnaBridge 178:79309dc6340a 161
AnnaBridge 178:79309dc6340a 162 /** Read the value from analogin pin, represented as an unsigned 16bit value
AnnaBridge 178:79309dc6340a 163 *
AnnaBridge 178:79309dc6340a 164 * @param obj The analogin object
AnnaBridge 178:79309dc6340a 165 * @return An unsigned 16bit value representing the current input voltage
AnnaBridge 178:79309dc6340a 166 */
AnnaBridge 178:79309dc6340a 167 uint16_t analogin_read_u16(analogin_t *obj)
AnnaBridge 178:79309dc6340a 168 {
AnnaBridge 178:79309dc6340a 169 ADI_ADC_HANDLE hDevice = obj->hDevice;
AnnaBridge 178:79309dc6340a 170 ADI_ADC_BUFFER *pAdcBuffer;
Anna Bridge 180:96ed750bd169 171 uint32_t ADCsample;
Anna Bridge 180:96ed750bd169 172
Anna Bridge 180:96ed750bd169 173 obj->UserBuffer.pDataBuffer = &ADCsample;
Anna Bridge 180:96ed750bd169 174 obj->UserBuffer.nNumConversionPasses = 1;
Anna Bridge 180:96ed750bd169 175 obj->UserBuffer.nBuffSize = 1;
AnnaBridge 178:79309dc6340a 176
AnnaBridge 178:79309dc6340a 177 /* Submit the buffer to the driver */
AnnaBridge 178:79309dc6340a 178 adi_adc_SubmitBuffer(hDevice, &obj->UserBuffer);
AnnaBridge 178:79309dc6340a 179
AnnaBridge 178:79309dc6340a 180 /* Enable the ADC */
AnnaBridge 178:79309dc6340a 181 adi_adc_Enable(hDevice, true);
AnnaBridge 178:79309dc6340a 182
AnnaBridge 178:79309dc6340a 183 adi_adc_GetBuffer(hDevice, &pAdcBuffer);
AnnaBridge 178:79309dc6340a 184 MBED_ASSERT(pAdcBuffer == &obj->UserBuffer);
AnnaBridge 178:79309dc6340a 185
AnnaBridge 178:79309dc6340a 186 return( (uint16_t)( ((uint16_t *)pAdcBuffer->pDataBuffer)[(pAdcBuffer->nNumConversionPasses) - 1]) );
AnnaBridge 178:79309dc6340a 187 }
AnnaBridge 178:79309dc6340a 188
Anna Bridge 180:96ed750bd169 189 /* Retrieve the active channel corresponding to the input pin */
Anna Bridge 180:96ed750bd169 190 static uint32_t adi_pin2channel(PinName pin)
Anna Bridge 180:96ed750bd169 191 {
AnnaBridge 178:79309dc6340a 192
AnnaBridge 178:79309dc6340a 193 uint32_t activech;
AnnaBridge 178:79309dc6340a 194
AnnaBridge 178:79309dc6340a 195 switch(pin) {
AnnaBridge 178:79309dc6340a 196 case ADC_VIN0:
AnnaBridge 178:79309dc6340a 197 activech = ADI_ADC_CHANNEL_0;
AnnaBridge 178:79309dc6340a 198 break;
AnnaBridge 178:79309dc6340a 199 case ADC_VIN1:
AnnaBridge 178:79309dc6340a 200 activech = ADI_ADC_CHANNEL_1;
AnnaBridge 178:79309dc6340a 201 break;
AnnaBridge 178:79309dc6340a 202 case ADC_VIN2:
AnnaBridge 178:79309dc6340a 203 activech = ADI_ADC_CHANNEL_2;
AnnaBridge 178:79309dc6340a 204 break;
AnnaBridge 178:79309dc6340a 205 case ADC_VIN3:
AnnaBridge 178:79309dc6340a 206 activech = ADI_ADC_CHANNEL_3;
AnnaBridge 178:79309dc6340a 207 break;
AnnaBridge 178:79309dc6340a 208 case ADC_VIN4:
AnnaBridge 178:79309dc6340a 209 activech = ADI_ADC_CHANNEL_4;
AnnaBridge 178:79309dc6340a 210 break;
AnnaBridge 178:79309dc6340a 211 case ADC_VIN5:
AnnaBridge 178:79309dc6340a 212 activech = ADI_ADC_CHANNEL_5;
AnnaBridge 178:79309dc6340a 213 break;
AnnaBridge 178:79309dc6340a 214 case ADC_VIN6:
AnnaBridge 178:79309dc6340a 215 activech = ADI_ADC_CHANNEL_6;
AnnaBridge 178:79309dc6340a 216 break;
AnnaBridge 178:79309dc6340a 217 case ADC_VIN7:
AnnaBridge 178:79309dc6340a 218 activech = ADI_ADC_CHANNEL_7;
AnnaBridge 178:79309dc6340a 219 break;
AnnaBridge 178:79309dc6340a 220 default:
AnnaBridge 178:79309dc6340a 221 activech = (uint32_t) 0xFFFFFFFF;
AnnaBridge 178:79309dc6340a 222 break;
AnnaBridge 178:79309dc6340a 223 }
AnnaBridge 178:79309dc6340a 224
AnnaBridge 178:79309dc6340a 225 return ((uint32_t)activech);
AnnaBridge 178:79309dc6340a 226 }
AnnaBridge 178:79309dc6340a 227
AnnaBridge 178:79309dc6340a 228
AnnaBridge 178:79309dc6340a 229
AnnaBridge 178:79309dc6340a 230 /**@}*/
AnnaBridge 178:79309dc6340a 231
AnnaBridge 178:79309dc6340a 232 #ifdef __cplusplus
AnnaBridge 178:79309dc6340a 233 }
AnnaBridge 178:79309dc6340a 234 #endif
AnnaBridge 178:79309dc6340a 235
AnnaBridge 178:79309dc6340a 236 #endif // #if DEVICE_ANALOGIN