ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
jacobjohnson
Date:
Mon Feb 27 17:45:05 2017 +0000
Revision:
1:f30bdcd2b33b
Parent:
0:098463de4c5d
changed the inputscale from 1 to 7 in analogin_api.c.  This will need to be changed later, and accessed from the main level, but for now this allows the  adc to read a value from 0 to 3.7V, instead of just up to 1V.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /*******************************************************************************
group-onsemi 0:098463de4c5d 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
group-onsemi 0:098463de4c5d 3 *
group-onsemi 0:098463de4c5d 4 * Permission is hereby granted, free of charge, to any person obtaining a
group-onsemi 0:098463de4c5d 5 * copy of this software and associated documentation files (the "Software"),
group-onsemi 0:098463de4c5d 6 * to deal in the Software without restriction, including without limitation
group-onsemi 0:098463de4c5d 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
group-onsemi 0:098463de4c5d 8 * and/or sell copies of the Software, and to permit persons to whom the
group-onsemi 0:098463de4c5d 9 * Software is furnished to do so, subject to the following conditions:
group-onsemi 0:098463de4c5d 10 *
group-onsemi 0:098463de4c5d 11 * The above copyright notice and this permission notice shall be included
group-onsemi 0:098463de4c5d 12 * in all copies or substantial portions of the Software.
group-onsemi 0:098463de4c5d 13 *
group-onsemi 0:098463de4c5d 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
group-onsemi 0:098463de4c5d 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
group-onsemi 0:098463de4c5d 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
group-onsemi 0:098463de4c5d 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
group-onsemi 0:098463de4c5d 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
group-onsemi 0:098463de4c5d 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
group-onsemi 0:098463de4c5d 20 * OTHER DEALINGS IN THE SOFTWARE.
group-onsemi 0:098463de4c5d 21 *
group-onsemi 0:098463de4c5d 22 * Except as contained in this notice, the name of Maxim Integrated
group-onsemi 0:098463de4c5d 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
group-onsemi 0:098463de4c5d 24 * Products, Inc. Branding Policy.
group-onsemi 0:098463de4c5d 25 *
group-onsemi 0:098463de4c5d 26 * The mere transfer of this software does not imply any licenses
group-onsemi 0:098463de4c5d 27 * of trade secrets, proprietary technology, copyrights, patents,
group-onsemi 0:098463de4c5d 28 * trademarks, maskwork rights, or any other form of intellectual
group-onsemi 0:098463de4c5d 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
group-onsemi 0:098463de4c5d 30 * ownership rights.
group-onsemi 0:098463de4c5d 31 *******************************************************************************
group-onsemi 0:098463de4c5d 32 */
group-onsemi 0:098463de4c5d 33
group-onsemi 0:098463de4c5d 34 #include "mbed_assert.h"
group-onsemi 0:098463de4c5d 35 #include "analogin_api.h"
group-onsemi 0:098463de4c5d 36 #include "clkman_regs.h"
group-onsemi 0:098463de4c5d 37 #include "pwrman_regs.h"
group-onsemi 0:098463de4c5d 38 #include "trim_regs.h"
group-onsemi 0:098463de4c5d 39 #include "PeripheralPins.h"
group-onsemi 0:098463de4c5d 40
group-onsemi 0:098463de4c5d 41 #define PGA_TRK_CNT 0x1F
group-onsemi 0:098463de4c5d 42 #define ADC_ACT_CNT 0x1
group-onsemi 0:098463de4c5d 43 #define ADC_PGA_CNT 0x1
group-onsemi 0:098463de4c5d 44 #define ADC_ACQ_CNT 0x1
group-onsemi 0:098463de4c5d 45 #define ADC_SLP_CNT 0x1
group-onsemi 0:098463de4c5d 46
group-onsemi 0:098463de4c5d 47 #define ADC_FULL_SCALE 0x3FF
group-onsemi 0:098463de4c5d 48 #define ADC_EXTERNAL_LAST_INPUT 3
group-onsemi 0:098463de4c5d 49
group-onsemi 0:098463de4c5d 50 // Only allow initialization once
group-onsemi 0:098463de4c5d 51 static int initialized = 0;
group-onsemi 0:098463de4c5d 52
group-onsemi 0:098463de4c5d 53 //******************************************************************************
group-onsemi 0:098463de4c5d 54 void analogin_init(analogin_t *obj, PinName pin)
group-onsemi 0:098463de4c5d 55 {
group-onsemi 0:098463de4c5d 56 // Make sure pin is an analog pin we can use for ADC
group-onsemi 0:098463de4c5d 57 MBED_ASSERT((ADCName)pinmap_peripheral(pin, PinMap_ADC) != (ADCName)NC);
group-onsemi 0:098463de4c5d 58
group-onsemi 0:098463de4c5d 59 // Set the object pointer
group-onsemi 0:098463de4c5d 60 obj->adc = MXC_ADC;
group-onsemi 0:098463de4c5d 61 obj->adc_pin = pin;
group-onsemi 0:098463de4c5d 62
group-onsemi 0:098463de4c5d 63 if (initialized == 0) {
group-onsemi 0:098463de4c5d 64 // Enable AFE power
group-onsemi 0:098463de4c5d 65 MXC_PWRMAN->pwr_rst_ctrl |= MXC_F_PWRMAN_PWR_RST_CTRL_AFE_POWERED;
group-onsemi 0:098463de4c5d 66
group-onsemi 0:098463de4c5d 67 // Enable the clock
group-onsemi 0:098463de4c5d 68 MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_ADC_CLOCK_ENABLE;
group-onsemi 0:098463de4c5d 69
group-onsemi 0:098463de4c5d 70 // Enable clock gate
group-onsemi 0:098463de4c5d 71 MXC_CLKMAN->clk_gate_ctrl2 |= MXC_F_CLKMAN_CLK_GATE_CTRL2_ADC_CLK_GATER;
group-onsemi 0:098463de4c5d 72
group-onsemi 0:098463de4c5d 73 // Enable interface clock
group-onsemi 0:098463de4c5d 74 obj->adc->ctrl |= MXC_F_ADC_CTRL_ADC_CLK_EN;
group-onsemi 0:098463de4c5d 75
group-onsemi 0:098463de4c5d 76 if ((MXC_TRIM->reg11_adc_trim0 == 0xFFFFFFFF) && (MXC_TRIM->reg12_adc_trim1 == 0xFFFFFFFF)) {
group-onsemi 0:098463de4c5d 77 // Set default trim for untrimmed parts.
group-onsemi 0:098463de4c5d 78 MXC_TRIM->reg11_adc_trim0 = 0x02000200;
group-onsemi 0:098463de4c5d 79 MXC_TRIM->reg12_adc_trim1 = 0x02000200;
group-onsemi 0:098463de4c5d 80 }
group-onsemi 0:098463de4c5d 81
group-onsemi 0:098463de4c5d 82 // Clear ADC ready interrupt (wite 1 to clr)
group-onsemi 0:098463de4c5d 83 obj->adc->intr = (obj->adc->intr & 0xFFFF) | MXC_F_ADC_INTR_ADC_REF_READY_IF;
group-onsemi 0:098463de4c5d 84
group-onsemi 0:098463de4c5d 85 // Using internal reference of 1.20V
group-onsemi 0:098463de4c5d 86
group-onsemi 0:098463de4c5d 87 // Enable ADC power bypass the buffer
group-onsemi 0:098463de4c5d 88 obj->adc->ctrl |= (MXC_F_ADC_CTRL_ADC_PU | MXC_F_ADC_CTRL_ADC_REFBUF_PU |
group-onsemi 0:098463de4c5d 89 MXC_F_ADC_CTRL_ADC_CHGPUMP_PU | MXC_F_ADC_CTRL_BUF_BYPASS);
group-onsemi 0:098463de4c5d 90
group-onsemi 0:098463de4c5d 91 // Wait for ADC ready
group-onsemi 0:098463de4c5d 92 while (!(obj->adc->intr & MXC_F_ADC_INTR_ADC_REF_READY_IF));
group-onsemi 0:098463de4c5d 93
group-onsemi 0:098463de4c5d 94 initialized = 1;
group-onsemi 0:098463de4c5d 95 }
group-onsemi 0:098463de4c5d 96 }
group-onsemi 0:098463de4c5d 97
group-onsemi 0:098463de4c5d 98 //******************************************************************************
group-onsemi 0:098463de4c5d 99 float analogin_read(analogin_t *obj)
group-onsemi 0:098463de4c5d 100 {
group-onsemi 0:098463de4c5d 101 // Convert integer to float
group-onsemi 0:098463de4c5d 102 return (((float)analogin_read_u16(obj)/(float)ADC_FULL_SCALE));
group-onsemi 0:098463de4c5d 103 }
group-onsemi 0:098463de4c5d 104
group-onsemi 0:098463de4c5d 105 //******************************************************************************
group-onsemi 0:098463de4c5d 106 uint16_t analogin_read_u16(analogin_t *obj)
group-onsemi 0:098463de4c5d 107 {
group-onsemi 0:098463de4c5d 108 // Set the pin to take readings from
group-onsemi 0:098463de4c5d 109 uint32_t adc_input = PINNAME_TO_PIN(obj->adc_pin);
group-onsemi 0:098463de4c5d 110
group-onsemi 0:098463de4c5d 111 // Select the channel
group-onsemi 0:098463de4c5d 112 obj->adc->ctrl &= ~MXC_F_ADC_CTRL_ADC_CHSEL;
group-onsemi 0:098463de4c5d 113 obj->adc->ctrl |= (adc_input << MXC_F_ADC_CTRL_ADC_CHSEL_POS) & MXC_F_ADC_CTRL_ADC_CHSEL;
group-onsemi 0:098463de4c5d 114
group-onsemi 0:098463de4c5d 115 // We want unity gain, to get full 0-Vref range
group-onsemi 0:098463de4c5d 116 // So, both ref and adc input scale should be enabled
group-onsemi 0:098463de4c5d 117 obj->adc->ctrl |= MXC_F_ADC_CTRL_ADC_SCALE | MXC_F_ADC_CTRL_ADC_REFSCL;
group-onsemi 0:098463de4c5d 118
group-onsemi 0:098463de4c5d 119 // Not using internal buffer, disable anyway
group-onsemi 0:098463de4c5d 120 obj->adc->ctrl &= ~MXC_F_ADC_CTRL_BUF_PU;
group-onsemi 0:098463de4c5d 121 obj->adc->ctrl |= MXC_F_ADC_CTRL_BUF_BYPASS;
group-onsemi 0:098463de4c5d 122
group-onsemi 0:098463de4c5d 123 // Normal LSB justified data alignment
group-onsemi 0:098463de4c5d 124
group-onsemi 0:098463de4c5d 125 // Not using limits
group-onsemi 0:098463de4c5d 126
group-onsemi 0:098463de4c5d 127 // Clear ADC done flag (wite 1 to clr)
group-onsemi 0:098463de4c5d 128 obj->adc->intr = (obj->adc->intr & 0xFFFF) | MXC_F_ADC_INTR_ADC_DONE_IF;
group-onsemi 0:098463de4c5d 129
group-onsemi 0:098463de4c5d 130 // Start the conversion
group-onsemi 0:098463de4c5d 131 obj->adc->ctrl |= MXC_F_ADC_CTRL_CPU_ADC_START;
group-onsemi 0:098463de4c5d 132
group-onsemi 0:098463de4c5d 133 // Wait for ADC done
group-onsemi 0:098463de4c5d 134 while (!(obj->adc->intr & MXC_F_ADC_INTR_ADC_DONE_IF));
group-onsemi 0:098463de4c5d 135
group-onsemi 0:098463de4c5d 136 // Get sample from the fifo
group-onsemi 0:098463de4c5d 137 uint16_t sample = obj->adc->data;
group-onsemi 0:098463de4c5d 138
group-onsemi 0:098463de4c5d 139 // Check for overflow, hardware will report overflow as 0
group-onsemi 0:098463de4c5d 140 if (obj->adc->status & MXC_F_ADC_STATUS_ADC_OVERFLOW) {
group-onsemi 0:098463de4c5d 141 sample = (uint16_t)ADC_FULL_SCALE;
group-onsemi 0:098463de4c5d 142 }
group-onsemi 0:098463de4c5d 143
group-onsemi 0:098463de4c5d 144 return sample;
group-onsemi 0:098463de4c5d 145 }