]>
git.gir.st - tmk_keyboard.git/blob - tool/mbed/mbed-sdk/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_K20XX/analogin_api.c
1 /* mbed Microcontroller Library
2 * Copyright (c) 2006-2015 ARM Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 #include "mbed_assert.h"
17 #include "analogin_api.h"
21 #include "clk_freqs.h"
22 #include "PeripheralPins.h"
24 #define MAX_FADC 6000000
26 void analogin_init(analogin_t
*obj
, PinName pin
) {
27 obj
->adc
= (ADCName
)pinmap_peripheral(pin
, PinMap_ADC
);
28 MBED_ASSERT(obj
->adc
!= (ADCName
)NC
);
30 SIM
->SCGC6
|= SIM_SCGC6_ADC0_MASK
;
32 uint32_t port
= (uint32_t)pin
>> PORT_SHIFT
;
33 SIM
->SCGC5
|= 1 << (SIM_SCGC5_PORTA_SHIFT
+ port
);
36 uint32_t PCLK
= bus_frequency();
38 for (clkdiv
= 0; clkdiv
< 4; clkdiv
++) {
39 if ((PCLK
>> clkdiv
) <= MAX_FADC
)
42 if (clkdiv
== 4) //Set max div
45 ADC0
->SC1
[1] = ADC_SC1_ADCH(obj
->adc
);
47 ADC0
->CFG1
= ADC_CFG1_ADLPC_MASK
// Low-Power Configuration
48 | ADC_CFG1_ADIV(clkdiv
& 0x3) // Clock Divide Select
49 | ADC_CFG1_ADLSMP_MASK
// Long Sample Time
50 | ADC_CFG1_MODE(3) // (16)bits Resolution
51 | ADC_CFG1_ADICLK(clkdiv
>> 2); // Input Clock
53 ADC0
->CFG2
= ADC_CFG2_MUXSEL_MASK
// ADxxb or ADxxa channels
54 | ADC_CFG2_ADHSC_MASK
// High-Speed Configuration
55 | ADC_CFG2_ADLSTS(0); // Long Sample Time Select
57 ADC0
->SC2
= ADC_SC2_REFSEL(0); // Default Voltage Reference
59 ADC0
->SC3
= ADC_SC3_AVGE_MASK
// Hardware Average Enable
60 | ADC_SC3_AVGS(0); // 4 Samples Averaged
62 pinmap_pinout(pin
, PinMap_ADC
);
65 uint16_t analogin_read_u16(analogin_t
*obj
) {
67 ADC0
->SC1
[0] = ADC_SC1_ADCH(obj
->adc
);
69 // Wait Conversion Complete
70 while ((ADC0
->SC1
[0] & ADC_SC1_COCO_MASK
) != ADC_SC1_COCO_MASK
);
72 return (uint16_t)ADC0
->R
[0];
75 float analogin_read(analogin_t
*obj
) {
76 uint16_t value
= analogin_read_u16(obj
);
77 return (float)value
* (1.0f
/ (float)0xFFFF);