Gleb Klochkov / Mbed OS Climatcontroll_Main

Dependencies:   esp8266-driver

Committer:
glebiuskv
Date:
Fri Apr 13 08:53:46 2018 +0000
Revision:
0:2f0e1e23c242
initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
glebiuskv 0:2f0e1e23c242 1 /*
glebiuskv 0:2f0e1e23c242 2 * PackageLicenseDeclared: Apache-2.0
glebiuskv 0:2f0e1e23c242 3 * Copyright (c) 2016 ARM Limited
glebiuskv 0:2f0e1e23c242 4 *
glebiuskv 0:2f0e1e23c242 5 * Licensed under the Apache License, Version 2.0 (the "License");
glebiuskv 0:2f0e1e23c242 6 * you may not use this file except in compliance with the License.
glebiuskv 0:2f0e1e23c242 7 * You may obtain a copy of the License at
glebiuskv 0:2f0e1e23c242 8 *
glebiuskv 0:2f0e1e23c242 9 * http://www.apache.org/licenses/LICENSE-2.0
glebiuskv 0:2f0e1e23c242 10 *
glebiuskv 0:2f0e1e23c242 11 * Unless required by applicable law or agreed to in writing, software
glebiuskv 0:2f0e1e23c242 12 * distributed under the License is distributed on an "AS IS" BASIS,
glebiuskv 0:2f0e1e23c242 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
glebiuskv 0:2f0e1e23c242 14 * See the License for the specific language governing permissions and
glebiuskv 0:2f0e1e23c242 15 * limitations under the License.
glebiuskv 0:2f0e1e23c242 16 */
glebiuskv 0:2f0e1e23c242 17 #include "cmsis.h"
glebiuskv 0:2f0e1e23c242 18 #include "mbed_assert.h"
glebiuskv 0:2f0e1e23c242 19 #include "mbed_wait_api.h"
glebiuskv 0:2f0e1e23c242 20 #include "analogin_api.h"
glebiuskv 0:2f0e1e23c242 21 #include "gpio_api.h"
glebiuskv 0:2f0e1e23c242 22 #include "spi_api.h"
glebiuskv 0:2f0e1e23c242 23 #include "pinmap.h"
glebiuskv 0:2f0e1e23c242 24
glebiuskv 0:2f0e1e23c242 25 #if DEVICE_ANALOGIN
glebiuskv 0:2f0e1e23c242 26
glebiuskv 0:2f0e1e23c242 27 /*
glebiuskv 0:2f0e1e23c242 28 * Channel Address for the next acquisition:
glebiuskv 0:2f0e1e23c242 29 * XXAAAXXX XXXXXXXX
glebiuskv 0:2f0e1e23c242 30 */
glebiuskv 0:2f0e1e23c242 31 #define ADC_SPI_ADDRESS 11
glebiuskv 0:2f0e1e23c242 32
glebiuskv 0:2f0e1e23c242 33 /* ADC Resolution */
glebiuskv 0:2f0e1e23c242 34 #define ADC_RESOLUTION 0xFFF
glebiuskv 0:2f0e1e23c242 35
glebiuskv 0:2f0e1e23c242 36 /* ADC Voltage Divider */
glebiuskv 0:2f0e1e23c242 37 #define ADC_DIV 819.0
glebiuskv 0:2f0e1e23c242 38
glebiuskv 0:2f0e1e23c242 39 /* PinMap structure for ADC IN */
glebiuskv 0:2f0e1e23c242 40 static const PinMap PinMap_ADC[] = {
glebiuskv 0:2f0e1e23c242 41 {A0, ADC0_0, 0},
glebiuskv 0:2f0e1e23c242 42 {A1, ADC0_1, 0},
glebiuskv 0:2f0e1e23c242 43 {A2, ADC0_2, 0},
glebiuskv 0:2f0e1e23c242 44 {A3, ADC0_3, 0},
glebiuskv 0:2f0e1e23c242 45 {A4, ADC0_4, 0},
glebiuskv 0:2f0e1e23c242 46 {A5, ADC0_5, 0},
glebiuskv 0:2f0e1e23c242 47 {NC, NC, 0}
glebiuskv 0:2f0e1e23c242 48 };
glebiuskv 0:2f0e1e23c242 49
glebiuskv 0:2f0e1e23c242 50 /* ADC SPI Private Data */
glebiuskv 0:2f0e1e23c242 51 typedef struct {
glebiuskv 0:2f0e1e23c242 52 /* ADC SPI */
glebiuskv 0:2f0e1e23c242 53 spi_t analogin_spi;
glebiuskv 0:2f0e1e23c242 54 /* ADC SPI CS */
glebiuskv 0:2f0e1e23c242 55 gpio_t adc_spi_cs_gpio;
glebiuskv 0:2f0e1e23c242 56 /* ADC SPI State */
glebiuskv 0:2f0e1e23c242 57 uint32_t analog_spi_inited;
glebiuskv 0:2f0e1e23c242 58 } analogin_spi_t;
glebiuskv 0:2f0e1e23c242 59 /* ADC SPI Device */
glebiuskv 0:2f0e1e23c242 60 static analogin_spi_t analogin_spi_dev;
glebiuskv 0:2f0e1e23c242 61
glebiuskv 0:2f0e1e23c242 62 /*
glebiuskv 0:2f0e1e23c242 63 * ADC SPI CS
glebiuskv 0:2f0e1e23c242 64 */
glebiuskv 0:2f0e1e23c242 65 #define ADC_SPI_CS P1_2
glebiuskv 0:2f0e1e23c242 66
glebiuskv 0:2f0e1e23c242 67 /*
glebiuskv 0:2f0e1e23c242 68 * Initialize the analogin peripheral
glebiuskv 0:2f0e1e23c242 69 * Configures the pin used by analogin.
glebiuskv 0:2f0e1e23c242 70 * obj: The analogin object to initialize
glebiuskv 0:2f0e1e23c242 71 * pin: The analogin pin name
glebiuskv 0:2f0e1e23c242 72 */
glebiuskv 0:2f0e1e23c242 73 void analogin_init(analogin_t *obj, PinName pin)
glebiuskv 0:2f0e1e23c242 74 {
glebiuskv 0:2f0e1e23c242 75 /* Initialize ADC Pin */
glebiuskv 0:2f0e1e23c242 76 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
glebiuskv 0:2f0e1e23c242 77 /* Verify if pin is valid */
glebiuskv 0:2f0e1e23c242 78 MBED_ASSERT(obj->adc != (ADCName)NC);
glebiuskv 0:2f0e1e23c242 79
glebiuskv 0:2f0e1e23c242 80 /* Initialize the ADC SPI */
glebiuskv 0:2f0e1e23c242 81 if(analogin_spi_dev.analog_spi_inited == 0){
glebiuskv 0:2f0e1e23c242 82 /* Initialize SPI for ADC */
glebiuskv 0:2f0e1e23c242 83 spi_init(&(analogin_spi_dev.analogin_spi), ADC_SPI_MOSI,
glebiuskv 0:2f0e1e23c242 84 ADC_SPI_MISO, ADC_SPI_SCK, ADC_SPI_nCS);
glebiuskv 0:2f0e1e23c242 85 spi_format(&(analogin_spi_dev.analogin_spi), 16, 3, 0);
glebiuskv 0:2f0e1e23c242 86 /* Set SPI to MAX Freq */
glebiuskv 0:2f0e1e23c242 87 spi_frequency(&(analogin_spi_dev.analogin_spi), 0);
glebiuskv 0:2f0e1e23c242 88
glebiuskv 0:2f0e1e23c242 89 /* Initialize CS GPIO */
glebiuskv 0:2f0e1e23c242 90 gpio_init_out(&(analogin_spi_dev.adc_spi_cs_gpio), ADC_SPI_CS);
glebiuskv 0:2f0e1e23c242 91
glebiuskv 0:2f0e1e23c242 92 analogin_spi_dev.analog_spi_inited = 1;
glebiuskv 0:2f0e1e23c242 93 }
glebiuskv 0:2f0e1e23c242 94
glebiuskv 0:2f0e1e23c242 95 /* If pin is valid assign it to the ADC data structure */
glebiuskv 0:2f0e1e23c242 96 obj->pin = pin;
glebiuskv 0:2f0e1e23c242 97 obj->pin_number = pin-600;
glebiuskv 0:2f0e1e23c242 98 obj->address = (0x0000 | (pin-600));
glebiuskv 0:2f0e1e23c242 99
glebiuskv 0:2f0e1e23c242 100 /* Configure the pinout */
glebiuskv 0:2f0e1e23c242 101 pinmap_pinout(pin, PinMap_ADC);
glebiuskv 0:2f0e1e23c242 102 }
glebiuskv 0:2f0e1e23c242 103
glebiuskv 0:2f0e1e23c242 104 /*
glebiuskv 0:2f0e1e23c242 105 * Read the value from analogin pin, represented as an unsigned 16bit value
glebiuskv 0:2f0e1e23c242 106 * obj: The analogin object
glebiuskv 0:2f0e1e23c242 107 * @return: An unsigned 16bit value representing the current input voltage
glebiuskv 0:2f0e1e23c242 108 */
glebiuskv 0:2f0e1e23c242 109 uint16_t analogin_read_u16(analogin_t *obj)
glebiuskv 0:2f0e1e23c242 110 {
glebiuskv 0:2f0e1e23c242 111 uint16_t result = 0;
glebiuskv 0:2f0e1e23c242 112
glebiuskv 0:2f0e1e23c242 113 /*
glebiuskv 0:2f0e1e23c242 114 * The ADC SPI hw is 8 bit format, 16 bit emulation is required
glebiuskv 0:2f0e1e23c242 115 * in the SPI driver.
glebiuskv 0:2f0e1e23c242 116 */
glebiuskv 0:2f0e1e23c242 117 /* CS = 1 */
glebiuskv 0:2f0e1e23c242 118 gpio_write(&(analogin_spi_dev.adc_spi_cs_gpio), 1);
glebiuskv 0:2f0e1e23c242 119 /* Do the first read */
glebiuskv 0:2f0e1e23c242 120 (void)spi_master_write(&(analogin_spi_dev.analogin_spi),
glebiuskv 0:2f0e1e23c242 121 ((obj->pin_number) << ADC_SPI_ADDRESS));
glebiuskv 0:2f0e1e23c242 122 /* CS = 0 */
glebiuskv 0:2f0e1e23c242 123 gpio_write(&(analogin_spi_dev.adc_spi_cs_gpio), 0);
glebiuskv 0:2f0e1e23c242 124 /* Wait 50 us */
glebiuskv 0:2f0e1e23c242 125 wait_us(50);
glebiuskv 0:2f0e1e23c242 126 /* CS = 1 */
glebiuskv 0:2f0e1e23c242 127 gpio_write(&(analogin_spi_dev.adc_spi_cs_gpio), 1);
glebiuskv 0:2f0e1e23c242 128 /* The second read provides the result */
glebiuskv 0:2f0e1e23c242 129 result = spi_master_write(&(analogin_spi_dev.analogin_spi),
glebiuskv 0:2f0e1e23c242 130 ((obj->pin_number) << ADC_SPI_ADDRESS));
glebiuskv 0:2f0e1e23c242 131 /* CS = 0 */
glebiuskv 0:2f0e1e23c242 132 gpio_write(&(analogin_spi_dev.adc_spi_cs_gpio), 0);
glebiuskv 0:2f0e1e23c242 133
glebiuskv 0:2f0e1e23c242 134 return result;
glebiuskv 0:2f0e1e23c242 135 }
glebiuskv 0:2f0e1e23c242 136
glebiuskv 0:2f0e1e23c242 137 /*
glebiuskv 0:2f0e1e23c242 138 * Read the input voltage, represented as a float in the range [0.0, 1.0]
glebiuskv 0:2f0e1e23c242 139 * obj: The analogin object
glebiuskv 0:2f0e1e23c242 140 * @return: A floating value representing the current input voltage
glebiuskv 0:2f0e1e23c242 141 */
glebiuskv 0:2f0e1e23c242 142 float analogin_read(analogin_t *obj)
glebiuskv 0:2f0e1e23c242 143 {
glebiuskv 0:2f0e1e23c242 144 uint16_t result = analogin_read_u16(obj);
glebiuskv 0:2f0e1e23c242 145 return (float)((result & ADC_RESOLUTION) * 1.0f) / ADC_DIV;
glebiuskv 0:2f0e1e23c242 146 }
glebiuskv 0:2f0e1e23c242 147
glebiuskv 0:2f0e1e23c242 148 #endif