Skip to content

Commit de6e86c

Browse files
committed
nRF51 analogReference functional
1 parent 2e12e13 commit de6e86c

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

cores/nRF5/wiring_analog.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,24 @@ extern "C" {
2828
/*
2929
* \brief SAMD products have only one reference for ADC
3030
*/
31+
#ifdef NRF52
3132
typedef enum _eAnalogReference
3233
{
3334
AR_DEFAULT,
3435
AR_INTERNAL,
3536
AR_VDD4
3637
} eAnalogReference ;
38+
#else
39+
typedef enum _eAnalogReference
40+
{
41+
AR_DEFAULT,
42+
AR_VBG,
43+
AR_SUPPLY_ONE_HALF,
44+
AR_SUPPLY_ONE_THIRD,
45+
AR_EXT0,
46+
AR_EXT1
47+
} eAnalogReference ;
48+
#endif
3749

3850

3951
/*

cores/nRF5/wiring_analog_nRF51.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#ifdef NRF51
2121

22+
#include "nrf_adc.h"
2223
#include "nrf_timer.h"
2324
#include "nrf_gpio.h"
2425

@@ -48,6 +49,8 @@ static struct PWMContext pwmContext[PWM_COUNT] = {
4849

4950
static int timerEnabled = 0;
5051

52+
static nrf_adc_config_reference_t adcReference = NRF_ADC_CONFIG_REF_VBG;
53+
5154
static uint32_t readResolution = 10;
5255
static uint32_t writeResolution = 8;
5356

@@ -86,6 +89,97 @@ static inline uint32_t mapResolution( uint32_t value, uint32_t from, uint32_t to
8689
*/
8790
void analogReference( eAnalogReference ulMode )
8891
{
92+
switch ( ulMode ) {
93+
case AR_DEFAULT:
94+
case AR_VBG:
95+
default:
96+
adcReference = NRF_ADC_CONFIG_REF_VBG;
97+
break;
98+
99+
case AR_SUPPLY_ONE_HALF:
100+
adcReference = NRF_ADC_CONFIG_REF_SUPPLY_ONE_HALF;
101+
break;
102+
103+
case AR_SUPPLY_ONE_THIRD:
104+
adcReference = NRF_ADC_CONFIG_REF_SUPPLY_ONE_THIRD;
105+
break;
106+
107+
case AR_EXT0:
108+
adcReference = NRF_ADC_CONFIG_REF_EXT_REF0;
109+
break;
110+
111+
case AR_EXT1:
112+
adcReference = NRF_ADC_CONFIG_REF_EXT_REF1;
113+
break;
114+
}
115+
}
116+
117+
uint32_t analogRead( uint32_t ulPin )
118+
{
119+
nrf_adc_config_input_t pin = NRF_ADC_CONFIG_INPUT_DISABLED;
120+
nrf_adc_config_t config;
121+
nrf_adc_config_resolution_t adcResolution;
122+
uint32_t resolution;
123+
uint32_t value;
124+
125+
if (ulPin >= PINS_COUNT) {
126+
return 0;
127+
}
128+
129+
ulPin = g_ADigitalPinMap[ulPin];
130+
131+
switch ( ulPin ) {
132+
case 1:
133+
pin = NRF_ADC_CONFIG_INPUT_2;
134+
break;
135+
136+
case 2:
137+
pin = NRF_ADC_CONFIG_INPUT_3;
138+
break;
139+
140+
case 3:
141+
pin = NRF_ADC_CONFIG_INPUT_4;
142+
break;
143+
144+
case 4:
145+
pin = NRF_ADC_CONFIG_INPUT_5;
146+
break;
147+
148+
case 5:
149+
pin = NRF_ADC_CONFIG_INPUT_6;
150+
break;
151+
152+
case 6:
153+
pin = NRF_ADC_CONFIG_INPUT_7;
154+
break;
155+
156+
default:
157+
return 0;
158+
}
159+
160+
if (readResolution <= 8) {
161+
resolution = 8;
162+
adcResolution = NRF_ADC_CONFIG_RES_8BIT;
163+
} else if (readResolution <= 9) {
164+
resolution = 9;
165+
adcResolution = NRF_ADC_CONFIG_RES_9BIT;
166+
} else {
167+
resolution = 10;
168+
adcResolution = NRF_ADC_CONFIG_RES_10BIT;
169+
}
170+
171+
config.resolution = adcResolution;
172+
config.scaling = NRF_ADC_CONFIG_SCALING_INPUT_TWO_THIRDS;
173+
config.reference = adcReference;
174+
175+
nrf_adc_enable();
176+
177+
nrf_adc_configure(&config);
178+
value = nrf_adc_convert_single(pin);
179+
180+
nrf_adc_disable();
181+
182+
return mapResolution(value, resolution, readResolution);
89183
}
90184

91185
// Right now, PWM output only works on the pins with

0 commit comments

Comments
 (0)