Skip to content

Commit 9d137c8

Browse files
committed
AnalogIn for nRF52 add u16 readout API realization. Polish rest of the code.
1 parent f19efb6 commit 9d137c8

File tree

1 file changed

+25
-5
lines changed
  • hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832

1 file changed

+25
-5
lines changed

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/analogin_api.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
#define ADC_12BIT_RANGE 0xFFF
2626
#define ADC_RANGE ADC_12BIT_RANGE
2727

28-
void analog_in_event_handler(nrf_drv_saadc_evt_t const *p_event)// type of nrf_drv_saadc_event_handler_t
28+
static void analog_in_event_handler(nrf_drv_saadc_evt_t const *p_event)// type of nrf_drv_saadc_event_handler_t
2929
{
3030
(void) p_event;
3131
}
3232

33-
const nrf_drv_saadc_config_t saadc_config =
33+
static const nrf_drv_saadc_config_t saadc_config =
3434
{
3535
.resolution = NRF_SAADC_RESOLUTION_12BIT,
3636
.oversample = NRF_SAADC_OVERSAMPLE_DISABLED,
@@ -39,7 +39,6 @@ const nrf_drv_saadc_config_t saadc_config =
3939

4040
void analogin_init(analogin_t *obj, PinName pin)
4141
{
42-
/// @todo check if initialized
4342
ret_code_t ret_code;
4443

4544
ret_code = nrf_drv_saadc_init(&saadc_config, analog_in_event_handler);
@@ -52,13 +51,17 @@ void analogin_init(analogin_t *obj, PinName pin)
5251
obj->adc_pin = saadcIn - 1;
5352

5453
nrf_saadc_channel_config_t channel_config =
55-
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(saadcIn);
54+
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(saadcIn); //Single ended, negative input to ADC shorted to GND.
5655

5756
ret_code = nrf_drv_saadc_channel_init(obj->adc_pin, &channel_config);
5857
MBED_ASSERT(ret_code == NRF_SUCCESS);
5958
}
6059

61-
int16_t analogin_read_i16(analogin_t *obj)
60+
/**
61+
* NRF52 SAR ADC module provides measurement with sign.
62+
* Already mbed API dosn't support readout of signed integer value.
63+
*/
64+
static int16_t analogin_read_i16(analogin_t *obj)
6265
{
6366
nrf_saadc_value_t adc_value;
6467
ret_code_t ret_code;
@@ -69,6 +72,23 @@ int16_t analogin_read_i16(analogin_t *obj)
6972
return adc_value;
7073
}
7174

75+
uint16_t analogin_read_u16(analogin_t *obj)
76+
{
77+
int16_t adc_value;
78+
79+
adc_value = analogin_read_i16(obj);
80+
81+
if (adc_value < 0)
82+
{
83+
// Even in the single ended mode measured value can be {-0}. Saturation for avoid casting to a big integer.
84+
return 0;
85+
}
86+
else
87+
{
88+
return (uint16_t) adc_value;
89+
}
90+
}
91+
7292
float analogin_read(analogin_t *obj)
7393
{
7494
int16_t value = analogin_read_i16(obj);

0 commit comments

Comments
 (0)