1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
|
/**
* Copyright (c) 2015 - 2017, Nordic Semiconductor ASA
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef NRF_DRV_COMP_H__
#define NRF_DRV_COMP_H__
#include "sdk_config.h"
#include "nrf_comp.h"
#include "sdk_errors.h"
#include "nrf_drv_common.h"
#include "app_util_platform.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @addtogroup nrf_comp COMP HAL and driver
* @ingroup nrf_drivers
* @brief @tagAPI52 Comparator (COMP) APIs.
* @details The COMP HAL provides basic APIs for accessing the registers of Comparator.
* The COMP driver provides APIs on a higher level.
*
* @defgroup nrf_drv_comp COMP driver
* @{
* @ingroup nrf_comp
* @brief @tagAPI52 Comparator (COMP) driver.
*/
/**
* @brief Macro to convert the threshold voltage to an integer value (needed by the COMP_TH register).
*
* @param[in] vol Voltage to be changed to COMP_TH register value. This value must not be smaller than
* reference voltage divided by 64.
* @param[in] ref Reference voltage.
*/
#define VOLTAGE_THRESHOLD_TO_INT(vol, ref) (uint8_t)(((vol) > ((ref) / 64)) ? (ROUNDED_DIV((vol) * 64,(ref)) - 1) : 0)
/**@brief COMP event handler function type.
* @param[in] event COMP event.
*/
typedef void (* comp_events_handler_t)(nrf_comp_event_t event);
/**
* @enum nrf_drv_comp_short_mask_t
* @brief COMP shortcut masks.
*/
typedef enum
{
NRF_DRV_COMP_SHORT_STOP_AFTER_CROSS_EVT = COMP_SHORTS_CROSS_STOP_Msk, /*!< Shortcut between the CROSS event and the STOP task. */
NRF_DRV_COMP_SHORT_STOP_AFTER_UP_EVT = COMP_SHORTS_UP_STOP_Msk, /*!< Shortcut between the UP event and the STOP task. */
NRF_DRV_COMP_SHORT_STOP_AFTER_DOWN_EVT = COMP_SHORTS_DOWN_STOP_Msk /*!< Shortcut between the DOWN event and the STOP task. */
}nrf_drv_comp_short_mask_t;
/**
* @enum nrf_drv_comp_evt_en_mask_t
* @brief COMP events masks.
*/
typedef enum
{
NRF_DRV_COMP_EVT_EN_CROSS_MASK = COMP_INTENSET_CROSS_Msk, /*!< CROSS event (generated after VIN+ == VIN-). */
NRF_DRV_COMP_EVT_EN_UP_MASK = COMP_INTENSET_UP_Msk, /*!< UP event (generated when VIN+ crosses VIN- while increasing). */
NRF_DRV_COMP_EVT_EN_DOWN_MASK = COMP_INTENSET_DOWN_Msk, /*!< DOWN event (generated when VIN+ crosses VIN- while decreasing). */
NRF_DRV_COMP_EVT_EN_READY_MASK = COMP_INTENSET_READY_Msk /*!< READY event (generated when the module is ready). */
}nrf_drv_comp_evt_en_mask_t;
/**@brief COMP configuration.
*/
typedef struct
{
nrf_comp_ref_t reference; /**< Reference selection. */
nrf_comp_ext_ref_t ext_ref; /**< External analog reference selection. */
nrf_comp_main_mode_t main_mode; /**< Main operation mode. */
nrf_comp_th_t threshold; /**< Structure holding THDOWN and THUP values needed by the COMP_TH register. */
nrf_comp_sp_mode_t speed_mode; /**< Speed and power mode. */
nrf_comp_hyst_t hyst; /**< Comparator hysteresis.*/
nrf_isource_t isource; /**< Current source selected on analog input. */
nrf_comp_input_t input; /**< Input to be monitored. */
uint8_t interrupt_priority; /**< Interrupt priority. */
} nrf_drv_comp_config_t;
/** @brief COMP threshold default configuration. */
#define COMP_CONFIG_TH \
{ \
.th_down = VOLTAGE_THRESHOLD_TO_INT(0.5, 1.8), \
.th_up = VOLTAGE_THRESHOLD_TO_INT(1.5, 1.8) \
}
/** @brief COMP driver default configuration including the COMP HAL configuration. */
#define NRF_DRV_COMP_DEFAULT_CONFIG(INPUT) \
{ \
.reference = (nrf_comp_ref_t)COMP_CONFIG_REF, \
.main_mode = (nrf_comp_main_mode_t)COMP_CONFIG_MAIN_MODE, \
.threshold = COMP_CONFIG_TH, \
.speed_mode = (nrf_comp_sp_mode_t)COMP_CONFIG_SPEED_MODE, \
.hyst = (nrf_comp_hyst_t)COMP_CONFIG_HYST, \
.isource = (nrf_isource_t)COMP_CONFIG_ISOURCE, \
.input = (nrf_comp_input_t)INPUT, \
.interrupt_priority = COMP_CONFIG_IRQ_PRIORITY \
}
/**
* @brief Function for initializing the COMP driver.
*
* This function initializes the COMP driver, but does not enable the peripheral or any interrupts.
* To start the driver, call the function @ref nrf_drv_comp_start() after initialization.
*
* If no configuration structure is provided, the driver is initialized with the default settings.
*
* @param[in] p_config Initial configuration. If NULL, the default configuration is used.
* @param[in] event_handler Handler function.
*
* @retval NRF_ERROR_INVALID_PARAM If the configuration is invalid.
* @retval NRF_ERROR_INVALID_STATE If the driver has already been initialized.
* @retval NRF_ERROR_BUSY If the LPCOMP driver is initialized.
*/
ret_code_t nrf_drv_comp_init(const nrf_drv_comp_config_t * p_config,
comp_events_handler_t event_handler);
/**
* @brief Function for uninitializing the COMP driver.
*
* This function uninitializes the COMP driver. The COMP peripheral and
* its interrupts are disabled, and local variables are cleaned. After this call, you must
* initialize the driver again by calling nrf_drv_comp_init() if you want to use it.
*
* @sa nrf_drv_comp_stop()
*/
void nrf_drv_comp_uninit(void);
/**
* @brief Function for setting the analog input.
*
* @param[in] psel COMP analog pin selection.
*/
void nrf_drv_comp_pin_select(nrf_comp_input_t psel);
/**
* @brief Function for starting the COMP peripheral and interrupts.
*
* Before calling this function, the driver must be initialized. This function
* enables the COMP peripheral and its interrupts.
*
* @param[in] comp_evt_en_mask Mask of events to be enabled. This parameter should be built as
* 'or' of elements from @ref nrf_drv_comp_evt_en_mask_t.
* @param[in] comp_shorts_mask Mask of shorts to be enabled. This parameter should be built as
* 'or' of elements from @ref nrf_drv_comp_short_mask_t.
*
* @sa nrf_drv_comp_init()
*
*/
void nrf_drv_comp_start(uint32_t comp_evt_en_mask, uint32_t comp_shorts_mask);
/**@brief Function for stopping the COMP peripheral.
*
* Before calling this function, the driver must be enabled. This function disables the COMP
* peripheral and its interrupts.
*
* @sa nrf_drv_comp_uninit()
*
*/
void nrf_drv_comp_stop(void);
/**
* @brief Function for copying the current state of the comparator result to the RESULT register.
*
* @retval 0 If the input voltage is below the threshold (VIN+ < VIN-).
* @retval 1 If the input voltage is above the threshold (VIN+ > VIN-).
*/
uint32_t nrf_drv_comp_sample(void);
/**
* @brief Function for getting the task address.
*
* Before calling this function, the driver must be enabled.
*
* @param[in] comp_task COMP task.
*
* @return Address of the given COMP task.
*/
__STATIC_INLINE uint32_t nrf_drv_comp_task_address_get(nrf_comp_task_t comp_task)
{
return (uint32_t)nrf_comp_task_address_get(comp_task);
}
/**
* @brief Function for getting the event address.
*
* @param[in] comp_event COMP event.
*
* @return Address of the given COMP event.
*/
__STATIC_INLINE uint32_t nrf_drv_comp_event_address_get(nrf_comp_event_t comp_event)
{
return (uint32_t)nrf_comp_event_address_get(comp_event);
}
/**
*@}
**/
#ifdef __cplusplus
}
#endif
#endif /* NRF_DRV_COMP_H__ */
|