4
4
* The MIT License (MIT)
5
5
*
6
6
* Copyright (c) 2016 Scott Shawcroft for Adafruit Industries
7
+ * Copyright (c) 2018 Artur Pacholec
7
8
*
8
9
* Permission is hereby granted, free of charge, to any person obtaining a copy
9
10
* of this software and associated documentation files (the "Software"), to deal
25
26
*/
26
27
27
28
#include "common-hal/analogio/AnalogIn.h"
29
+ #include "py/runtime.h"
28
30
29
- #include <string.h>
31
+ #include "nrfx_saadc.h"
32
+ #include "nrf_gpio.h"
30
33
31
- #include "py/gc.h"
32
- #include "py/nlr.h"
33
- #include "py/runtime.h"
34
- #include "py/binary.h"
35
- #include "py/mphal.h"
36
- #include "shared-bindings/analogio/AnalogIn.h"
37
- #include "nrf.h"
38
-
39
- void common_hal_analogio_analogin_construct (analogio_analogin_obj_t * self , const mcu_pin_obj_t * pin ) {
40
- if (!pin -> adc_channel ) {
41
- // No ADC function on that pin
34
+ #define CHANNEL_NO 0
35
+
36
+ void common_hal_analogio_analogin_construct (analogio_analogin_obj_t * self , const mcu_pin_obj_t * pin ) {
37
+ if (pin -> adc_channel == 0 )
42
38
mp_raise_ValueError ("Pin does not have ADC capabilities" );
43
- }
44
39
45
40
hal_gpio_cfg_pin (pin -> port , pin -> pin , HAL_GPIO_MODE_INPUT , HAL_GPIO_PULL_DISABLED );
41
+
46
42
self -> pin = pin ;
47
43
}
48
44
@@ -51,66 +47,61 @@ bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t *self) {
51
47
}
52
48
53
49
void common_hal_analogio_analogin_deinit (analogio_analogin_obj_t * self ) {
54
- if (common_hal_analogio_analogin_deinited (self )) {
50
+ if (common_hal_analogio_analogin_deinited (self ))
55
51
return ;
56
- }
57
- reset_pin (self -> pin -> pin );
58
- self -> pin = mp_const_none ;
59
- }
60
52
61
- void analogin_reset () {
53
+ nrf_gpio_cfg_default (NRF_GPIO_PIN_MAP (self -> pin -> port , self -> pin -> pin ));
54
+
55
+ self -> pin = mp_const_none ;
62
56
}
63
57
64
58
uint16_t common_hal_analogio_analogin_get_value (analogio_analogin_obj_t * self ) {
65
- // Something else might have used the ADC in a different way,
66
- // so we completely re-initialize it.
67
-
68
- int16_t value ;
69
-
70
- NRF_SAADC -> RESOLUTION = SAADC_RESOLUTION_VAL_14bit ;
71
- NRF_SAADC -> ENABLE = 1 ;
72
-
73
- for (int i = 0 ; i < 8 ; i ++ ) {
74
- NRF_SAADC -> CH [i ].PSELN = SAADC_CH_PSELP_PSELP_NC ;
75
- NRF_SAADC -> CH [i ].PSELP = SAADC_CH_PSELP_PSELP_NC ;
76
- }
77
-
78
- NRF_SAADC -> CH [0 ].CONFIG = ((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos ) & SAADC_CH_CONFIG_RESP_Msk )
79
- | ((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESN_Pos ) & SAADC_CH_CONFIG_RESN_Msk )
80
- | ((SAADC_CH_CONFIG_GAIN_Gain1_6 << SAADC_CH_CONFIG_GAIN_Pos ) & SAADC_CH_CONFIG_GAIN_Msk )
81
- | ((SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos ) & SAADC_CH_CONFIG_REFSEL_Msk )
82
- | ((SAADC_CH_CONFIG_TACQ_3us << SAADC_CH_CONFIG_TACQ_Pos ) & SAADC_CH_CONFIG_TACQ_Msk )
83
- | ((SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos ) & SAADC_CH_CONFIG_MODE_Msk );
84
- NRF_SAADC -> CH [0 ].PSELN = self -> pin -> adc_channel ;
85
- NRF_SAADC -> CH [0 ].PSELP = self -> pin -> adc_channel ;
59
+ // Something else might have used the ADC in a different way,
60
+ // so we completely re-initialize it.
86
61
62
+ nrf_saadc_value_t value ;
87
63
88
- NRF_SAADC -> RESULT .PTR = (uint32_t )& value ;
89
- NRF_SAADC -> RESULT .MAXCNT = 1 ;
64
+ const nrf_saadc_channel_config_t config = {
65
+ .resistor_p = NRF_SAADC_RESISTOR_DISABLED ,
66
+ .resistor_n = NRF_SAADC_RESISTOR_DISABLED ,
67
+ .gain = NRF_SAADC_GAIN1_6 ,
68
+ .reference = NRF_SAADC_REFERENCE_INTERNAL ,
69
+ .acq_time = NRF_SAADC_ACQTIME_3US ,
70
+ .mode = NRF_SAADC_MODE_SINGLE_ENDED ,
71
+ .burst = NRF_SAADC_BURST_DISABLED ,
72
+ .pin_p = self -> pin -> adc_channel ,
73
+ .pin_n = self -> pin -> adc_channel ,
74
+ };
90
75
91
- NRF_SAADC -> TASKS_START = 0x01UL ;
76
+ nrf_saadc_resolution_set (NRF_SAADC_RESOLUTION_14BIT );
77
+ nrf_saadc_oversample_set (NRF_SAADC_OVERSAMPLE_DISABLED );
78
+ nrf_saadc_enable ();
92
79
93
- while (! NRF_SAADC -> EVENTS_STARTED );
94
- NRF_SAADC -> EVENTS_STARTED = 0x00UL ;
80
+ for ( uint32_t i = 0 ; i < NRF_SAADC_CHANNEL_COUNT ; i ++ )
81
+ nrf_saadc_channel_input_set ( i , NRF_SAADC_INPUT_DISABLED , NRF_SAADC_INPUT_DISABLED ) ;
95
82
96
- NRF_SAADC -> TASKS_SAMPLE = 0x01UL ;
83
+ nrf_saadc_channel_init (CHANNEL_NO , & config );
84
+ nrf_saadc_buffer_init (& value , 1 );
97
85
98
- while (!NRF_SAADC -> EVENTS_END );
99
- NRF_SAADC -> EVENTS_END = 0x00UL ;
86
+ nrf_saadc_task_trigger (NRF_SAADC_TASK_START );
87
+ while (nrf_saadc_event_check (NRF_SAADC_EVENT_STARTED ) == 0 );
88
+ nrf_saadc_event_clear (NRF_SAADC_EVENT_STARTED );
100
89
101
- NRF_SAADC -> TASKS_STOP = 0x01UL ;
90
+ nrf_saadc_task_trigger (NRF_SAADC_TASK_SAMPLE );
91
+ while (nrf_saadc_event_check (NRF_SAADC_EVENT_END ) == 0 );
92
+ nrf_saadc_event_clear (NRF_SAADC_EVENT_END );
102
93
103
- while (!NRF_SAADC -> EVENTS_STOPPED );
104
- NRF_SAADC -> EVENTS_STOPPED = 0x00UL ;
94
+ nrf_saadc_task_trigger (NRF_SAADC_TASK_STOP );
95
+ while (nrf_saadc_event_check (NRF_SAADC_EVENT_STOPPED ) == 0 );
96
+ nrf_saadc_event_clear (NRF_SAADC_EVENT_STOPPED );
105
97
106
- if (value < 0 ) {
107
- value = 0 ;
108
- }
98
+ nrf_saadc_disable ();
109
99
110
- NRF_SAADC -> ENABLE = 0 ;
100
+ if (value < 0 )
101
+ value = 0 ;
111
102
112
- // Map value to from 14 to 16 bits
113
- return (value << 2 );
103
+ // Map value to from 14 to 16 bits
104
+ return (value << 2 );
114
105
}
115
106
116
107
float common_hal_analogio_analogin_get_reference_voltage (analogio_analogin_obj_t * self ) {
0 commit comments