mbed library sources. Supersedes mbed-src.

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

Committer:
Anna Bridge
Date:
Tue Mar 20 17:01:51 2018 +0000
Revision:
183:5166a824ec1a
Parent:
160:d5399cc887bb
Fix mbed lib version

Who changed what in which revision?

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