fixed drive strength

Dependents:   capstone_i2c

Fork of mbed-dev by mbed official

Revision:
149:156823d33999
Parent:
144:ef7eb2e8f9f7
Child:
150:02e0a0aed4ec
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF51822_UNIFIED/analogin_api.c	Fri Oct 28 11:17:30 2016 +0100
@@ -0,0 +1,88 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */ 
+#include "mbed_assert.h"
+#include "analogin_api.h"
+#include "cmsis.h"
+#include "pinmap.h"
+#include "nrf_drv_adc.h"
+
+#ifdef DEVICE_ANALOGIN
+
+
+#define ADC_10BIT_RANGE  0x3FF
+#define ADC_RANGE        ADC_10BIT_RANGE
+
+static const PinMap PinMap_ADC[] = {
+    {p1, ADC0_0, 4},
+    {p2, ADC0_0, 8},
+    {p3, ADC0_0, 16},
+    {p4, ADC0_0, 32},
+    {p5, ADC0_0, 64},
+    {p6, ADC0_0, 128},
+#ifndef TARGET_NRF51_DONGLE
+    {p26, ADC0_0, 1},
+    {p27, ADC0_0, 2},
+#endif
+    {NC, NC, 0}
+};
+
+
+void analogin_init(analogin_t *obj, PinName pin)
+{
+    obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
+    MBED_ASSERT(obj->adc != (ADCName)NC);
+
+    uint32_t pinFunc = pinmap_function(pin, PinMap_ADC);
+    MBED_ASSERT(pinFunc != (uint32_t)NC);
+    
+    obj->adc_pin =  pinFunc;
+    
+    ret_code_t ret_code;
+                                              // p_config, event_handler
+    ret_code = nrf_drv_adc_init(NULL , NULL); // select blocking mode
+    MBED_ASSERT((ret_code == NRF_SUCCESS) || (ret_code == NRF_ERROR_INVALID_STATE)); //NRF_ERROR_INVALID_STATE expected for multiple channels used.
+}
+
+uint16_t analogin_read_u16(analogin_t *obj)
+{
+    nrf_adc_value_t adc_value;
+       
+    nrf_drv_adc_channel_t adc_channel;
+    
+    // initialization by assigment because IAR dosen't support variable initializer in declaration statement.
+    adc_channel.config.config.resolution = NRF_ADC_CONFIG_RES_10BIT;
+    adc_channel.config.config.input      = NRF_ADC_CONFIG_SCALING_INPUT_FULL_SCALE;
+    adc_channel.config.config.reference  = NRF_ADC_CONFIG_REF_VBG;
+    adc_channel.config.config.ain        = (obj->adc_pin);
+    adc_channel.p_next = NULL;
+    
+
+    ret_code_t ret_code;
+    
+    ret_code = nrf_drv_adc_sample_convert( &adc_channel, &adc_value);
+    MBED_ASSERT(ret_code == NRF_SUCCESS);
+    
+    return adc_value;
+}
+
+float analogin_read(analogin_t *obj)
+{
+    uint16_t value = analogin_read_u16(obj);
+
+    return (float)value * (1.0f / (float)ADC_RANGE);
+}
+
+#endif // DEVICE_ANALOGIN