1 /*
2 * Copyright 2024 NXP
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #ifndef FSL_SDADC_H_
9 #define FSL_SDADC_H_
10
11 #include "fsl_common.h"
12
13 /*!
14 * @addtogroup sdadc
15 * @{
16 */
17
18 /******************************************************************************
19 * Definitions
20 ******************************************************************************/
21 /*! @name Driver version */
22 /*!
23 * @{
24 */
25 /*! @brief SDADC driver version 2.0.0. */
26 #define FSL_SDADC_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
27 /*!
28 * @}
29 */
30
31 /*! @brief Macros are used to configure decimator volume. */
32 #define SDADC_DECIMATOR_VOL_CTRL_P_MASK(offset) (SDADC_DECIMATOR_CTL_2_VOL_CTRL_P_0_MASK << offset)
33 #define SDADC_DECIMATOR_VOL_CTRL_P_SHIFT(offset) (SDADC_DECIMATOR_CTL_2_VOL_CTRL_P_0_SHIFT + offset)
34 #define SDADC_DECIMATOR_VOL_CTRL_P(volume, offset) \
35 (((uint32_t)(((uint32_t)(volume)) << SDADC_DECIMATOR_VOL_CTRL_P_SHIFT(offset))) & \
36 SDADC_DECIMATOR_VOL_CTRL_P_MASK(offset))
37 #define SDADC_DECIMATOR_VOL_CTRL_N_MASK(offset) (SDADC_DECIMATOR_CTL_2_VOL_CTRL_N_0_MASK << offset)
38 #define SDADC_DECIMATOR_VOL_CTRL_N_SHIFT(offset) (SDADC_DECIMATOR_CTL_2_VOL_CTRL_N_0_SHIFT + offset)
39 #define SDADC_DECIMATOR_VOL_CTRL_N(volume, offset) \
40 (((uint32_t)(((uint32_t)(volume)) << SDADC_DECIMATOR_VOL_CTRL_N_SHIFT(offset))) & \
41 SDADC_DECIMATOR_VOL_CTRL_N_MASK(offset))
42
43 /*! @brief Macros are used to configure decimator sample rate. */
44 #define SDADC_DECIMATOR_SET_SPEED_P_MASK(offset) (SDADC_DECIMATOR_CTL_4_SET_SPEED_P_0_MASK << (offset * 4U))
45 #define SDADC_DECIMATOR_SET_SPEED_P_SHIFT(offset) (SDADC_DECIMATOR_CTL_4_SET_SPEED_P_0_SHIFT + (offset * 4U))
46 #define SDADC_DECIMATOR_SET_SPEED_P(rate, offset) \
47 (((uint32_t)(((uint32_t)(rate)) << SDADC_DECIMATOR_SET_SPEED_P_SHIFT(offset))) & \
48 SDADC_DECIMATOR_SET_SPEED_P_MASK(offset))
49 #define SDADC_DECIMATOR_SET_SPEED_N_MASK(offset) (SDADC_DECIMATOR_CTL_4_SET_SPEED_N_0_MASK << (offset * 4U))
50 #define SDADC_DECIMATOR_SET_SPEED_N_SHIFT(offset) (SDADC_DECIMATOR_CTL_4_SET_SPEED_N_0_SHIFT + (offset * 4U))
51 #define SDADC_DECIMATOR_SET_SPEED_N(rate, offset) \
52 (((uint32_t)(((uint32_t)(rate)) << SDADC_DECIMATOR_SET_SPEED_N_SHIFT(offset))) & \
53 SDADC_DECIMATOR_SET_SPEED_N_MASK(offset))
54
55 /*! @brief Macros are used to configure the dither amplitude. */
56 #define SDADC_ADC_CTL_2_SET_DITHER_MASK(offset) (SDADC_ADC_CTL_2_SET_DITHER3_MASK << ((3U - offset) * 4U))
57 #define SDADC_ADC_CTL_2_SET_DITHER_SHIFT(offset) (SDADC_ADC_CTL_2_SET_DITHER3_SHIFT + ((3U - offset) * 4U))
58 #define SDADC_ADC_CTL_2_SET_DITHER(val, offset) \
59 (((uint32_t)(((uint32_t)(val)) << SDADC_ADC_CTL_2_SET_DITHER_SHIFT(offset))) & \
60 SDADC_ADC_CTL_2_SET_DITHER_MASK(offset))
61
62 /*! @brief Macros are used to configure FIFO watermark. */
63 #define SDADC_FIFO_WATERMARK_CTL_P_MASK(offset) (SDADC_FIFO_WATERMARK_CTL_WATERMARK_0_P_MASK << (offset * 8U))
64 #define SDADC_FIFO_WATERMARK_CTL_P_SHIFT(offset) (SDADC_FIFO_WATERMARK_CTL_WATERMARK_0_P_SHIFT + (offset * 8U))
65 #define SDADC_FIFO_WATERMARK_CTL_P(watermark, offset) \
66 (((uint32_t)(((uint32_t)(watermark)) << SDADC_FIFO_WATERMARK_CTL_P_SHIFT(offset))) & \
67 SDADC_FIFO_WATERMARK_CTL_P_MASK(offset))
68 #define SDADC_FIFO_WATERMARK_CTL_N_MASK(offset) (SDADC_FIFO_WATERMARK_CTL_WATERMARK_0_N_MASK << (offset * 8U))
69 #define SDADC_FIFO_WATERMARK_CTL_N_SHIFT(offset) (SDADC_FIFO_WATERMARK_CTL_WATERMARK_0_N_SHIFT + (offset * 8U))
70 #define SDADC_FIFO_WATERMARK_CTL_N(watermark, offset) \
71 (((uint32_t)(((uint32_t)(watermark)) << SDADC_FIFO_WATERMARK_CTL_N_SHIFT(offset))) & \
72 SDADC_FIFO_WATERMARK_CTL_N_MASK(offset))
73
74 /*! @brief Macros are used for FIFO operations. */
75 #define SDADC_FIFO_WATERMARK_STATUS_MASK 0xFFU
76 #define SDADC_FIFO_WATERMARK_STATUS_SHIFT SDADC_FIFO_WATERMARK_ERROR_ST_WM_0_P_ST_SHIFT
77 #define SDADC_FIFO_FULL_INT_STATUS_MASK 0xFF00U
78 #define SDADC_FIFO_FULL_INT_STATUS_SHIFT SDADC_FIFO_WATERMARK_ERROR_ST_ERR_0_P_SHIFT
79 #define SDADC_FIFO_MASK SDADC_FIFO_0_P_FIFO_0_P_MASK
80 #define SDADC_FIFO_SHIFT SDADC_FIFO_0_P_FIFO_0_P_SHIFT
81 #define SDADC_FIFO_ENTRIES_AVAIL_MASK SDADC_FIFO_ENTRIES_AVAIL_0_FIFO_0_P_AVAIL_MASK
82 #define SDADC_FIFO_DEPTH (16U)
83 #define SDADC_FIFO_WIDTH (4U)
84
85 /*!
86 * @brief This enumeration provides the mask for the SDADC channel P-Side and N-Side FIFO full interrupt enable/disable.
87 */
88 enum _sdadc_fifo_int_enable
89 {
90 kSDADC_Channel0_PSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_0_P_EN_MASK,
91 kSDADC_Channel0_NSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_0_N_EN_MASK,
92 kSDADC_Channel1_PSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_1_P_EN_MASK,
93 kSDADC_Channel1_NSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_1_N_EN_MASK,
94 kSDADC_Channel2_PSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_2_P_EN_MASK,
95 kSDADC_Channel2_NSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_2_N_EN_MASK,
96 kSDADC_Channel3_PSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_3_P_EN_MASK,
97 kSDADC_Channel3_NSide_FifoFullIntEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_ERR_3_N_EN_MASK,
98 };
99
100 /*!
101 * @brief This enumeration provides the mask for the SDADC channel P-Side and N-Side FIFO watermark enable/disable.
102 */
103 enum _sdadc_fifo_watermark_enable
104 {
105 kSDADC_Channel0_PSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_0_P_EN_MASK,
106 kSDADC_Channel0_NSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_0_N_EN_MASK,
107 kSDADC_Channel1_PSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_1_P_EN_MASK,
108 kSDADC_Channel1_NSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_1_N_EN_MASK,
109 kSDADC_Channel2_PSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_2_P_EN_MASK,
110 kSDADC_Channel2_NSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_2_N_EN_MASK,
111 kSDADC_Channel3_PSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_3_P_EN_MASK,
112 kSDADC_Channel3_NSide_FifoWatermarkEnable = SDADC_FIFO_WATERMARK_ERROR_CTL_WM_3_N_EN_MASK,
113 };
114
115 /*!
116 * @brief This enumeration provides the mask for the SDADC channel P-Side and N-Side FIFO full interrupt status flag.
117 */
118 enum _sdadc_fifo_int_status_flag
119 {
120 kSDADC_Channel0_PSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_0_P_MASK,
121 kSDADC_Channel0_NSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_0_N_MASK,
122 kSDADC_Channel1_PSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_1_P_MASK,
123 kSDADC_Channel1_NSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_1_N_MASK,
124 kSDADC_Channel2_PSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_2_P_MASK,
125 kSDADC_Channel2_NSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_2_N_MASK,
126 kSDADC_Channel3_PSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_3_P_MASK,
127 kSDADC_Channel3_NSide_FifoFullIntStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_ERR_3_N_MASK,
128 };
129
130 /*!
131 * @brief This enumeration provides the mask for the SDADC channel P-Side and N-Side FIFO watermark status flag.
132 */
133 enum _sdadc_fifo_watermark_status_flag
134 {
135 kSDADC_Channel0_PSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_0_P_ST_MASK,
136 kSDADC_Channel0_NSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_0_N_ST_MASK,
137 kSDADC_Channel1_PSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_1_P_ST_MASK,
138 kSDADC_Channel1_NSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_1_N_ST_MASK,
139 kSDADC_Channel2_PSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_2_P_ST_MASK,
140 kSDADC_Channel2_NSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_2_N_ST_MASK,
141 kSDADC_Channel3_PSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_3_P_ST_MASK,
142 kSDADC_Channel3_NSide_FifoWatermarkStatusFlag = SDADC_FIFO_WATERMARK_ERROR_ST_WM_3_N_ST_MASK,
143 };
144
145 /*!
146 * @brief This enumeration provides the selection of the SDADC channel mode.
147 */
148 typedef enum _sdadc_channel_mode
149 {
150 kSDADC_SingleEnd_Mode = 0U, /*!< Single-end mode. */
151 kSDADC_Differential_Mode = 1U, /*!< Differential mode. */
152 } sdadc_channel_mode_t;
153
154 /*!
155 * @brief This enumeration provides the selection of the SDADC channel number.
156 */
157 typedef enum _sdadc_channel_number
158 {
159 kSDADC_Channel0 = 0U, /*!< SDADC channel 0. */
160 kSDADC_Channel1 = 1U, /*!< SDADC channel 1. */
161 kSDADC_Channel2 = 2U, /*!< SDADC channel 2. */
162 kSDADC_Channel3 = 3U, /*!< SDADC channel 3. */
163 } sdadc_channel_number_t;
164
165 /*!
166 * @brief This enumeration provides the selection of the SDADC channel type.
167 */
168 typedef enum _sdadc_channel_type
169 {
170 kSDADC_Channel_NSide_Type = 0x01U, /*!< N-side selected. */
171 kSDADC_Channel_PSide_Type = 0x10U, /*!< P-side selected. */
172 kSDADC_Channel_NandPSide_Type = 0x11U, /*!< N- and P-side selected. */
173 } sdadc_channel_type_t;
174
175 /*!
176 * @brief This enumeration provides the selection of the SDADC decimator sample rate.
177 */
178 typedef enum _sdadc_decimator_sample_rate
179 {
180 kSDADC_DecimatorSampleRate48kHz = 0x0U, /*!< 48kHz decimator sample rate. */
181 kSDADC_DecimatorSampleRate32kHz = 0x1U, /*!< 32kHz decimator sample rate. */
182 kSDADC_DecimatorSampleRate16kHz = 0x2U, /*!< 16kHz decimator sample rate. */
183 } sdadc_decimator_sample_rate_t;
184
185 /*!
186 * @brief This enumeration provides the selection of the SDADC LDO drive capability.
187 */
188 typedef enum _sdadc_ldo_drive_capability
189 {
190 kSDADC_LdoLowPower = 0x0U, /*!< To drive 1 single-end mode or 1 differential mode SDADC. */
191 kSDADC_LdoHighPower = 0x1U, /*!< To drive more than 1 SDADC */
192 } sdadc_ldo_drive_capability_t;
193
194 /*!
195 * @brief This enumeration provides the selection of the SDADC reference mode.
196 *
197 * @details The SDADC reference module has four modes, these modes are controlled via REF_CTL register
198 * 'fast_ref_enable' and 'pwr_fast_ref_enable' bitfields.
199 * 1.Retain mode: pwr_fast_ref_enable = 0b, fast_ref_enable = 0b.
200 * 2.Low noise mode: pwr_fast_ref_enable = 0b, fast_ref_enable = 1b.
201 * 3.Low power mode: pwr_fast_ref_enable = 1b, fast_ref_enable = 0b.
202 * 4.Fast charge mode: pwr_fast_ref_enable = 1b, fast_ref_enable = 1b.
203 */
204 typedef enum _sdadc_ref_mode
205 {
206 kSDADC_RefRetainMode = 0x0U, /*!< Reference in retain mode. */
207 kSDADC_RefLowNoiseMode = 0x1U, /*!< Reference in low noise mode. */
208 kSDADC_RefLowPowerMode = 0x2U, /*!< Reference in low power mode. */
209 kSDADC_RefFastChargeMode = 0x3U, /*!< Reference in fast charge mode. */
210 } sdadc_ref_mode_t;
211
212 /*!
213 * @brief This enumeration provides the selection of the SDADC FIFO write or/and read operation.
214 */
215 typedef enum _sdadc_fifo_reset_operation
216 {
217 kSDADC_FifoWriteReset = 0x1U, /*!< FIFO write reset. */
218 kSDADC_FifoReadReset = 0x2U, /*!< FIFO read reset. */
219 kSDADC_FifoWriteAndReadReset = 0x3U, /*!< FIFO write and read reset. */
220 } sdadc_fifo_reset_operation_t;
221
222 /*!
223 * @brief This structure is used to configure the decimator volume (gain).
224 *
225 * @note The gain setting is not applicable for the channel N-Side when executing the differential mode. For the
226 * specific gain setting value please refer to the reference manual.
227 */
228 typedef struct _sdadc_volume
229 {
230 uint8_t pSideVolume; /*!< Sets the gain for the P-Side decimator. */
231 uint8_t nSideVolume; /*!< Sets the gain for the N-Side decimator. */
232 } sdadc_volume_control_t;
233
234 /*!
235 * @brief This structure is used to configure the decimator sample rate.
236 */
237 typedef struct _sdadc_sample_rate
238 {
239 sdadc_decimator_sample_rate_t pSideSampleRate; /*!< Sets the P-Side decimator sample rate. */
240 sdadc_decimator_sample_rate_t nSideSampleRate; /*!< Sets the N-Side decimator sample rate. */
241 } sdadc_sample_rate_t;
242
243 /*!
244 * @brief This structure is used to configure the FIFO watermark.
245 *
246 * @note In the differential mode, the bitstream is converted to 24bit data (FIFO_x_P[23:0]) by P-Side decimator,
247 * the output of N-Side decimator (FIFO_x_N[23:0]) is not valid.
248 */
249 typedef struct _sdadc_watermark
250 {
251 uint8_t pSideWatermark; /*!< Sets the channel N-Side FIFO watermark. */
252 uint8_t nSideWatermark; /*!< Sets the channel P-Side FIFO watermark. */
253 } sdadc_watermark_t;
254
255 /*!
256 * @brief This structure is used to configure the SDADC channels.
257 */
258 typedef struct _sdadc_channel_config
259 {
260 sdadc_channel_mode_t mode; /*!< Sets channel mode. */
261 sdadc_channel_number_t number; /*!< Sets channel number. */
262 sdadc_channel_type_t type; /*!< Sets channel type. */
263
264 sdadc_volume_control_t volume; /*!< Sets N- and P-side decimator volume. */
265 sdadc_sample_rate_t samplerate; /*!< Sets N- and P-side decimator samplerate. */
266 sdadc_watermark_t watermark; /*!< Sets N- and P-side FIFO watermark. */
267
268 bool enableDacCompensation; /*!< Decides whether to enable the compensation feature for the ADCp[3:0] or/and
269 ADCn[3:0] in the single-end mode, is used to avoid large data-dependent ripple
270 on LDO output which will impact the ADC performance. */
271 bool enableDCLoop; /*!< In some cases of the single-end mode, the microphone output is connected
272 directly to ADC input without the coupling capacitor, DC Loop is activated to
273 regulate input common-mode voltage of the ADCp[3:0] or/and ADCn[3:0]. In the
274 single-end mode, there is the possibility to connect MEMS or JFET microphone
275 directly to the input (DC-coupled). In this configuration, DC Loop mode needs
276 to be activated to establish the correct common mode input voltage level at
277 the input pin. The DC Loop function should disabled in the differential mode. */
278 bool enableDcFilter; /*!< Decides whether to enable the decimator DC Filter to remove DC components.*/
279 bool enablePolarityInvert; /*!< Decides whether to enable the polarity invert function, for example: if the input to
280 ADC is a pure sinus signal, then if the polarity invert is enabled, the decimation output
281 will be a sinus signal 180 out of phase with the input. */
282 } sdadc_channel_config_t;
283
284 /*!
285 * @brief This structure is used to configure the SDADC module.
286 */
287 typedef struct _sdadc_config
288 {
289 uint8_t channelCount; /*!< Indicates how many channels to execute the conversion. */
290 sdadc_channel_config_t *channelConfig; /*!< SDADC channels configuration. */
291 } sdadc_config_t;
292
293 /*!
294 * @brief This structure is used to construct channel groups.
295 */
296 typedef struct _sdadc_channel_group
297 {
298 sdadc_channel_number_t number; /*!< Channel number. */
299 sdadc_channel_type_t type; /*!< Channel type. */
300 } sdadc_channel_group;
301
302 /******************************************************************************
303 * API
304 ******************************************************************************/
305 #if defined(__cplusplus)
306 extern "C" {
307 #endif
308
309 /*!
310 * @name SDADC initialization and de-initialization.
311 * @{
312 */
313 /*!
314 * @brief This function is used to get available predefined configurations for the SDADC initialization.
315 *
316 * @param config Pointer to the SDADC configuration structure, please refer to @ref sdadc_config_t for details.
317 */
318 void SDADC_GetDefaultConfig(sdadc_config_t *config);
319
320 /*!
321 * @brief This function is used to initialize the SDADC.
322 *
323 * @param base SDADC peripheral base address.
324 * @param config Pointer to the SDADC configuration structure, please refer to @ref sdadc_config_t for details.
325 */
326 void SDADC_Init(SDADC_Type *base, const sdadc_config_t *config);
327
328 /*!
329 * @brief This function is used to de-initialize the SDADC.
330 *
331 * @param base SDADC peripheral base address.
332 * @param config Pointer to the SDADC configuration structure, please refer to @ref sdadc_config_t for details.
333 */
334 void SDADC_Deinit(SDADC_Type *base, const sdadc_config_t *config);
335 /*!
336 * @}
337 */
338
339 /*!
340 * @name SDADC channel modulator, reference, and LDO configuration.
341 * @{
342 */
343 /*!
344 * @brief This function is used to power up the SDADC in the initialization state.
345 *
346 * @param base SDADC peripheral base address.
347 * @param config Pointer to the SDADC configuration structure, please refer to @ref sdadc_config_t for details.
348 * @param clock Core clock frequency with Hz.
349 */
350 void SDADC_DoInitPowerUp(SDADC_Type *base, sdadc_config_t *config, uint32_t clock);
351
352 /*!
353 * @brief This function is used to enable or disable SDADC specific channel's P-Side or/and N-Side sigma-delta
354 * modulator power.
355 *
356 * @param base SDADC peripheral base address.
357 * @param number channel number, refer @ref sdadc_channel_number_t for details.
358 * @param type channel type, refer @ref sdadc_channel_type_t for details.
359 * @param enable Decides whether to enable or disable.
360 * - @b true Enable
361 * - @b false Disable
362 */
SDADC_ControlModulatorPowerEnable(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool enable)363 static inline void SDADC_ControlModulatorPowerEnable(SDADC_Type *base,
364 sdadc_channel_number_t number,
365 sdadc_channel_type_t type,
366 bool enable)
367 {
368 if (enable)
369 {
370 if (type == kSDADC_Channel_PSide_Type)
371 {
372 base->ADC_CTL_0 |= (0x1U << (number + SDADC_ADC_CTL_0_ADCP_POWER_ENABLE_SHIFT));
373 }
374 else if (type == kSDADC_Channel_NSide_Type)
375 {
376 base->ADC_CTL_0 |= (0x1U << (number + SDADC_ADC_CTL_0_ADCN_POWER_ENABLE_SHIFT));
377 }
378 else
379 {
380 base->ADC_CTL_0 |= ((0x1U << (number + SDADC_ADC_CTL_0_ADCP_POWER_ENABLE_SHIFT)) |
381 (0x1U << (number + SDADC_ADC_CTL_0_ADCN_POWER_ENABLE_SHIFT)));
382 }
383 }
384 else
385 {
386 if (type == kSDADC_Channel_PSide_Type)
387 {
388 base->ADC_CTL_0 &= ~(0x1U << (number + SDADC_ADC_CTL_0_ADCP_POWER_ENABLE_SHIFT));
389 }
390 else if (type == kSDADC_Channel_NSide_Type)
391 {
392 base->ADC_CTL_0 &= ~(0x1U << (number + SDADC_ADC_CTL_0_ADCN_POWER_ENABLE_SHIFT));
393 }
394 else
395 {
396 base->ADC_CTL_0 &= ~((0x1U << (number + SDADC_ADC_CTL_0_ADCP_POWER_ENABLE_SHIFT)) |
397 (0x1U << (number + SDADC_ADC_CTL_0_ADCN_POWER_ENABLE_SHIFT)));
398 }
399 }
400 }
401
402 /*!
403 * @brief This function is used to enable or disable the reference power.
404 *
405 * @param base SDADC peripheral base address.
406 * @param enable Indicates enable or disable the reference power.
407 * - @b true Enable
408 * - @b false Disable
409 */
SDADC_ControlReferencePowerEnable(SDADC_Type * base,bool enable)410 static inline void SDADC_ControlReferencePowerEnable(SDADC_Type *base, bool enable)
411 {
412 if (enable)
413 {
414 base->REF_CTL |= SDADC_REF_CTL_REF_POWER_ENABLE_MASK;
415 }
416 else
417 {
418 base->REF_CTL &= ~SDADC_REF_CTL_REF_POWER_ENABLE_MASK;
419 }
420 }
421
422 /*!
423 * @brief This function is used to configure the reference mode.
424 *
425 * @note Setting the reference to fast charge mode is mainly used during startup where fast startup
426 * is required, the current consumption in this mode is the largest, so, it is recommended to switch
427 * to other modes to minimize current consumption. If the ADC works on the single-end mode, recommend
428 * switching to the low-noise mode, if the ADC works on the differential mode, recommend switching to
429 * the retain mode.
430 *
431 * @param base SDADC peripheral base address.
432 * @param referenceMode Reference mode to be configured, see @ref sdadc_ref_mode_t for details.
433 */
SDADC_ConfigureReferenceMode(SDADC_Type * base,sdadc_ref_mode_t referenceMode)434 static inline void SDADC_ConfigureReferenceMode(SDADC_Type *base, sdadc_ref_mode_t referenceMode)
435 {
436 base->REF_CTL =
437 ((base->REF_CTL & (~(SDADC_REF_CTL_FAST_REF_ENABLE_MASK | SDADC_REF_CTL_PWR_FAST_REF_ENABLE_MASK))) |
438 ((((referenceMode & 0x2U) != 0UL) ? SDADC_REF_CTL_PWR_FAST_REF_ENABLE_MASK : 0U) |
439 (((referenceMode & 0x1U) != 0UL) ? SDADC_REF_CTL_FAST_REF_ENABLE_MASK : 0U)));
440 }
441
442 /*!
443 * @brief This function is used to enable or disable the LDO power.
444 *
445 * @param base SDADC peripheral base address.
446 * @param enable Indicates enable or disable the LDO power.
447 * - @b true Enable
448 * - @b false Disable
449 */
SDADC_ControlLdoPowerEnable(SDADC_Type * base,bool enable)450 static inline void SDADC_ControlLdoPowerEnable(SDADC_Type *base, bool enable)
451 {
452 if (enable)
453 {
454 base->LDO_CTL |= SDADC_LDO_CTL_LDO_POWER_ENABLE_MASK;
455 }
456 else
457 {
458 base->LDO_CTL &= ~SDADC_LDO_CTL_LDO_POWER_ENABLE_MASK;
459 }
460 }
461
462 /*!
463 * @brief This function is used to configure the drive capability.
464 *
465 * @param base SDADC peripheral base address.
466 * @param capability SDADC LDO drive capability to be set, see @ref sdadc_ldo_drive_capability_t for details.
467 */
SDADC_ConfigureLdoDriveCapability(SDADC_Type * base,sdadc_ldo_drive_capability_t capability)468 static inline void SDADC_ConfigureLdoDriveCapability(SDADC_Type *base, sdadc_ldo_drive_capability_t capability)
469 {
470 base->LDO_CTL = ((base->LDO_CTL & (~SDADC_LDO_CTL_LDO_SETTING_MASK)) | (SDADC_LDO_CTL_LDO_SETTING(capability)));
471 }
472 /*!
473 * @}
474 */
475
476 /*!
477 * @name SDADC channel mode, DAC compensation, modulator DC Loop, decimator DC Filter configuration.
478 * @{
479 */
480 /*!
481 * @brief This function is used to configure the channel mode.
482 *
483 * @param base SDADC peripheral base address.
484 * @param number channel number, refer @ref sdadc_channel_number_t for details.
485 * @param mode channel mode, refer @ref sdadc_channel_mode_t for details.
486 */
SDADC_ConfigureChannelMode(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_mode_t mode)487 static inline void SDADC_ConfigureChannelMode(SDADC_Type *base,
488 sdadc_channel_number_t number,
489 sdadc_channel_mode_t mode)
490 {
491 if (kSDADC_SingleEnd_Mode == mode)
492 {
493 base->ADC_CTL_1 &= ~(0x01U << (SDADC_ADC_CTL_1_DIFF_ENABLE_SHIFT + number));
494 }
495 else
496 {
497 base->ADC_CTL_1 |= (0x01U << (SDADC_ADC_CTL_1_DIFF_ENABLE_SHIFT + number));
498 }
499 }
500
501 /*!
502 * @brief This function is used to enable or disable the DAC compensation function.
503 *
504 * @param base SDADC peripheral base address.
505 * @param number channel number, refer @ref sdadc_channel_number_t for details.
506 * @param type channel type, refer @ref sdadc_channel_type_t for details.
507 * @param enable Decides whether to enable or disable.
508 * - @b true Enable
509 * - @b false Disable
510 */
SDADC_ControlDacCompensationEnable(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool enable)511 static inline void SDADC_ControlDacCompensationEnable(SDADC_Type *base,
512 sdadc_channel_number_t number,
513 sdadc_channel_type_t type,
514 bool enable)
515 {
516 if (enable)
517 {
518 if (type == kSDADC_Channel_PSide_Type)
519 {
520 base->ADC_CTL_0 |= (0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCP_ENABLE_SHIFT));
521 }
522 else if (type == kSDADC_Channel_NSide_Type)
523 {
524 base->ADC_CTL_0 |= (0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCN_ENABLE_SHIFT));
525 }
526 else
527 {
528 base->ADC_CTL_0 |= ((0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCP_ENABLE_SHIFT)) |
529 (0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCN_ENABLE_SHIFT)));
530 }
531 }
532 else
533 {
534 if (type == kSDADC_Channel_PSide_Type)
535 {
536 base->ADC_CTL_0 &= ~(0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCP_ENABLE_SHIFT));
537 }
538 else if (type == kSDADC_Channel_NSide_Type)
539 {
540 base->ADC_CTL_0 &= ~(0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCN_ENABLE_SHIFT));
541 }
542 else
543 {
544 base->ADC_CTL_0 &= ~((0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCP_ENABLE_SHIFT)) |
545 (0x1U << (number + SDADC_ADC_CTL_0_COMP_ADCN_ENABLE_SHIFT)));
546 }
547 }
548 }
549
550 /*!
551 * @brief This function is used to enable or disable the modulator DC Loop function.
552 *
553 * @param base SDADC peripheral base address.
554 * @param number channel number, refer @ref sdadc_channel_number_t for details.
555 * @param type channel type, refer @ref sdadc_channel_type_t for details.
556 * @param enable Decides whether to enable or disable.
557 * - @b true Enable
558 * - @b false Disable
559 */
SDADC_ControlModulatorDcLoopEnable(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool enable)560 static inline void SDADC_ControlModulatorDcLoopEnable(SDADC_Type *base,
561 sdadc_channel_number_t number,
562 sdadc_channel_type_t type,
563 bool enable)
564 {
565 if (enable)
566 {
567 if (type == kSDADC_Channel_PSide_Type)
568 {
569 base->ADC_CTL_1 |= (0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_P_ANA_ENABLE_SHIFT));
570 base->DC_LOOP_CTL_0 |= (0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_P_ENABLE_SHIFT));
571 }
572 else if (type == kSDADC_Channel_NSide_Type)
573 {
574 base->ADC_CTL_1 |= (0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_N_ANA_ENABLE_SHIFT));
575 base->DC_LOOP_CTL_0 |= (0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_N_ENABLE_SHIFT));
576 }
577 else
578 {
579 base->ADC_CTL_1 |= ((0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_P_ANA_ENABLE_SHIFT)) |
580 (0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_N_ANA_ENABLE_SHIFT)));
581 base->DC_LOOP_CTL_0 |= ((0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_P_ENABLE_SHIFT)) |
582 (0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_N_ENABLE_SHIFT)));
583 }
584 }
585 else
586 {
587 if (type == kSDADC_Channel_PSide_Type)
588 {
589 base->ADC_CTL_1 &= ~(0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_P_ANA_ENABLE_SHIFT));
590 base->DC_LOOP_CTL_0 &= ~(0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_P_ENABLE_SHIFT));
591 }
592 else if (type == kSDADC_Channel_NSide_Type)
593 {
594 base->ADC_CTL_1 &= ~(0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_N_ANA_ENABLE_SHIFT));
595 base->DC_LOOP_CTL_0 &= ~(0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_N_ENABLE_SHIFT));
596 }
597 else
598 {
599 base->ADC_CTL_1 &= ~((0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_P_ANA_ENABLE_SHIFT)) |
600 (0x1U << (number + SDADC_ADC_CTL_1_DCLOOP_N_ANA_ENABLE_SHIFT)));
601 base->DC_LOOP_CTL_0 &= ~((0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_P_ENABLE_SHIFT)) |
602 (0x1U << (number + SDADC_DC_LOOP_CTL_0_DCLOOP_N_ENABLE_SHIFT)));
603 }
604 }
605 }
606
607 /*!
608 * @brief This function is used to enable or disable the decimator DC Filter function.
609 *
610 * @param base SDADC peripheral base address.
611 * @param number channel number, refer @ref sdadc_channel_number_t for details.
612 * @param type channel type, refer @ref sdadc_channel_type_t for details.
613 * @param enable Decides whether to enable or disable.
614 * - @b true Enable
615 * - @b false Disable
616 */
SDADC_ControlDecimatorDcFilterEnable(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool enable)617 static inline void SDADC_ControlDecimatorDcFilterEnable(SDADC_Type *base,
618 sdadc_channel_number_t number,
619 sdadc_channel_type_t type,
620 bool enable)
621 {
622 if (enable)
623 {
624 if (type == kSDADC_Channel_PSide_Type)
625 {
626 base->DECIMATOR_CTL_0 |= (0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_P_ENABLE_SHIFT));
627 }
628 else if (type == kSDADC_Channel_NSide_Type)
629 {
630 base->DECIMATOR_CTL_0 |= (0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_N_ENABLE_SHIFT));
631 }
632 else
633 {
634 base->DECIMATOR_CTL_0 |= ((0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_P_ENABLE_SHIFT)) |
635 (0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_N_ENABLE_SHIFT)));
636 }
637 }
638 else
639 {
640 if (type == kSDADC_Channel_PSide_Type)
641 {
642 base->DECIMATOR_CTL_0 &= ~(0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_P_ENABLE_SHIFT));
643 }
644 else if (type == kSDADC_Channel_NSide_Type)
645 {
646 base->DECIMATOR_CTL_0 &= ~(0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_N_ENABLE_SHIFT));
647 }
648 else
649 {
650 base->DECIMATOR_CTL_0 &= ~((0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_P_ENABLE_SHIFT)) |
651 (0x1U << (number + SDADC_DECIMATOR_CTL_0_DCFILTI_N_ENABLE_SHIFT)));
652 }
653 }
654 }
655
656 /*!
657 * @brief This function is used to enable or disable the decimator output invert.
658 *
659 * @param base SDADC peripheral base address.
660 * @param number channel number, refer @ref sdadc_channel_number_t for details.
661 * @param type channel type, refer @ref sdadc_channel_type_t for details.
662 * @param enable Decides whether to enable or disable.
663 * - @b true Enable
664 * - @b false Disable
665 */
SDADC_ControlDecimatorOutputInvertEnable(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool enable)666 static inline void SDADC_ControlDecimatorOutputInvertEnable(SDADC_Type *base,
667 sdadc_channel_number_t number,
668 sdadc_channel_type_t type,
669 bool enable)
670 {
671 if (enable)
672 {
673 if (type == kSDADC_Channel_PSide_Type)
674 {
675 base->DECIMATOR_CTL_0 |= (0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_P_ENABLE_SHIFT));
676 }
677 else if (type == kSDADC_Channel_NSide_Type)
678 {
679 base->DECIMATOR_CTL_0 |= (0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_N_ENABLE_SHIFT));
680 }
681 else
682 {
683 base->DECIMATOR_CTL_0 |= ((0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_P_ENABLE_SHIFT)) |
684 (0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_N_ENABLE_SHIFT)));
685 }
686 }
687 else
688 {
689 if (type == kSDADC_Channel_PSide_Type)
690 {
691 base->DECIMATOR_CTL_0 &= ~(0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_P_ENABLE_SHIFT));
692 }
693 else if (type == kSDADC_Channel_NSide_Type)
694 {
695 base->DECIMATOR_CTL_0 &= ~(0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_N_ENABLE_SHIFT));
696 }
697 else
698 {
699 base->DECIMATOR_CTL_0 &= ~((0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_P_ENABLE_SHIFT)) |
700 (0x1U << (number + SDADC_DECIMATOR_CTL_0_POL_INV_N_ENABLE_SHIFT)));
701 }
702 }
703 }
704
705 /*!
706 * @brief This function is used to configure the decimator volume.
707 *
708 * @param base SDADC peripheral base address.
709 * @param number channel number, refer @ref sdadc_channel_number_t for details.
710 * @param type channel type, refer @ref sdadc_channel_type_t for details.
711 * @param volume Volume level, see @ref sdadc_volume_control_t for details.
712 */
SDADC_ConfigureDecimatorVolume(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,sdadc_volume_control_t volume)713 static inline void SDADC_ConfigureDecimatorVolume(SDADC_Type *base,
714 sdadc_channel_number_t number,
715 sdadc_channel_type_t type,
716 sdadc_volume_control_t volume)
717 {
718 uint8_t registerOffset = number / 2U;
719 uint8_t bitfieldOffset = number % 2U * 16U;
720
721 if (type == kSDADC_Channel_PSide_Type)
722 {
723 (*((&(base->DECIMATOR_CTL_2)) + registerOffset)) =
724 (((*((&(base->DECIMATOR_CTL_2)) + registerOffset)) & (~(SDADC_DECIMATOR_VOL_CTRL_P_MASK(bitfieldOffset)))) |
725 SDADC_DECIMATOR_VOL_CTRL_P(volume.pSideVolume, bitfieldOffset));
726 }
727 else if (type == kSDADC_Channel_NSide_Type)
728 {
729 (*((&(base->DECIMATOR_CTL_2)) + registerOffset)) =
730 (((*((&(base->DECIMATOR_CTL_2)) + registerOffset)) & (~(SDADC_DECIMATOR_VOL_CTRL_N_MASK(bitfieldOffset)))) |
731 SDADC_DECIMATOR_VOL_CTRL_N(volume.nSideVolume, bitfieldOffset));
732 }
733 else
734 {
735 (*((&(base->DECIMATOR_CTL_2)) + registerOffset)) =
736 (((*((&(base->DECIMATOR_CTL_2)) + registerOffset)) &
737 (~(SDADC_DECIMATOR_VOL_CTRL_P_MASK(bitfieldOffset) | SDADC_DECIMATOR_VOL_CTRL_N_MASK(bitfieldOffset)))) |
738 (SDADC_DECIMATOR_VOL_CTRL_P(volume.pSideVolume, bitfieldOffset) |
739 SDADC_DECIMATOR_VOL_CTRL_N(volume.nSideVolume, bitfieldOffset)));
740 }
741 }
742
743 /*!
744 * @brief This function is used to configure the decimator sample rate.
745 *
746 * @param base SDADC peripheral base address.
747 * @param number channel number, refer @ref sdadc_channel_number_t for details.
748 * @param type channel type, refer @ref sdadc_channel_type_t for details.
749 * @param sampleRate Sample rate, see @ref sdadc_sample_rate_t for details.
750 */
SDADC_ConfigureDecimatorSampleRate(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,sdadc_sample_rate_t sampleRate)751 static inline void SDADC_ConfigureDecimatorSampleRate(SDADC_Type *base,
752 sdadc_channel_number_t number,
753 sdadc_channel_type_t type,
754 sdadc_sample_rate_t sampleRate)
755 {
756 if (type == kSDADC_Channel_PSide_Type)
757 {
758 base->DECIMATOR_CTL_4 = ((base->DECIMATOR_CTL_4 & (~SDADC_DECIMATOR_SET_SPEED_P_MASK(number))) |
759 SDADC_DECIMATOR_SET_SPEED_P(sampleRate.pSideSampleRate, number));
760 }
761 else if (type == kSDADC_Channel_NSide_Type)
762 {
763 base->DECIMATOR_CTL_4 = ((base->DECIMATOR_CTL_4 & (~SDADC_DECIMATOR_SET_SPEED_N_MASK(number))) |
764 SDADC_DECIMATOR_SET_SPEED_N(sampleRate.nSideSampleRate, number));
765 }
766 else
767 {
768 base->DECIMATOR_CTL_4 =
769 ((base->DECIMATOR_CTL_4 &
770 (~(SDADC_DECIMATOR_SET_SPEED_P_MASK(number) | SDADC_DECIMATOR_SET_SPEED_N_MASK(number)))) |
771 (SDADC_DECIMATOR_SET_SPEED_P(sampleRate.pSideSampleRate, number) |
772 SDADC_DECIMATOR_SET_SPEED_N(sampleRate.nSideSampleRate, number)));
773 }
774 }
775
776 /*!
777 * @brief This function is used to set the dither amplitude.
778 *
779 * @details In the ADC conversion process, adding dither can improve the ADC dynamic performance, but too large a dither
780 * will cause the input signal to overflow, the user needs to set the appropriate dither amplitude according to their
781 * own needs.
782 *
783 * @param base SDADC peripheral base address.
784 * @param number channel number, refer @ref sdadc_channel_number_t for details.
785 * @param ditherAmplitude The dither amplitude that will be introduced, the range is from 000b to 111b, 000b means
786 * disable the dither.
787 */
SDADC_ConfigureDitherAmplitude(SDADC_Type * base,sdadc_channel_number_t number,uint8_t ditherAmplitude)788 static inline void SDADC_ConfigureDitherAmplitude(SDADC_Type *base,
789 sdadc_channel_number_t number,
790 uint8_t ditherAmplitude)
791 {
792 base->ADC_CTL_2 = ((base->ADC_CTL_2 & (~SDADC_ADC_CTL_2_SET_DITHER_MASK(number))) |
793 (SDADC_ADC_CTL_2_SET_DITHER(ditherAmplitude, number)));
794 }
795 /*!
796 * @}
797 */
798
799 /*!
800 * @name SDADC modulator, decimator, and modulator DC Loop reset and release reset.
801 * @{
802 */
803 /*!
804 * @brief This function is used to reset or release reset for the SDADC specific channel's P-Side or N-Side sigma-delta
805 * modulator.
806 *
807 * @note Needs to be reset for at least 15us after start-up, and then release the reset.
808 *
809 * @param base SDADC peripheral base address.
810 * @param number channel number, refer @ref sdadc_channel_number_t for details.
811 * @param type channel type, refer @ref sdadc_channel_type_t for details.
812 * @param reset Indicates reset or release reset for the sigma-delta modulator.
813 * - @b true Reset
814 * - @b false Release reset
815 */
SDADC_ControlModulatorReset(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool reset)816 static inline void SDADC_ControlModulatorReset(SDADC_Type *base,
817 sdadc_channel_number_t number,
818 sdadc_channel_type_t type,
819 bool reset)
820 {
821 if (reset)
822 {
823 if (type == kSDADC_Channel_PSide_Type)
824 {
825 base->ADC_CTL_0 &= ~(0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCP_SHIFT));
826 }
827 else if (type == kSDADC_Channel_NSide_Type)
828 {
829 base->ADC_CTL_0 &= ~(0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCN_SHIFT));
830 }
831 else
832 {
833 base->ADC_CTL_0 &= ~((0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCP_SHIFT)) |
834 (0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCN_SHIFT)));
835 }
836 }
837 else
838 {
839 if (type == kSDADC_Channel_PSide_Type)
840 {
841 base->ADC_CTL_0 |= (0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCP_SHIFT));
842 }
843 else if (type == kSDADC_Channel_NSide_Type)
844 {
845 base->ADC_CTL_0 |= (0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCN_SHIFT));
846 }
847 else
848 {
849 base->ADC_CTL_0 |= ((0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCP_SHIFT)) |
850 (0x1U << (number + SDADC_ADC_CTL_0_RST_AN_ADCN_SHIFT)));
851 }
852 }
853 }
854
855 /*!
856 * @brief This function is used to reset or release reset for the SDADC channeln's P-Side or/and N-Side decimator.
857 *
858 * @param base SDADC peripheral base address.
859 * @param number channel number, refer @ref sdadc_channel_number_t for details.
860 * @param type channel type, refer @ref sdadc_channel_type_t for details.
861 * @param reset Indicates reset or release reset for the decimator.
862 * - @b true Reset
863 * - @b false Release reset
864 */
SDADC_ControlDecimatorReset(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool reset)865 static inline void SDADC_ControlDecimatorReset(SDADC_Type *base,
866 sdadc_channel_number_t number,
867 sdadc_channel_type_t type,
868 bool reset)
869 {
870 if (reset)
871 {
872 if (type == kSDADC_Channel_PSide_Type)
873 {
874 base->DECIMATOR_CTL_1 &= ~(0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_P_SHIFT));
875 }
876 else if (type == kSDADC_Channel_NSide_Type)
877 {
878 base->DECIMATOR_CTL_1 &= ~(0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_N_SHIFT));
879 }
880 else
881 {
882 base->DECIMATOR_CTL_1 &= ~((0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_P_SHIFT)) |
883 (0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_N_SHIFT)));
884 }
885 }
886 else
887 {
888 if (type == kSDADC_Channel_PSide_Type)
889 {
890 base->DECIMATOR_CTL_1 |= (0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_P_SHIFT));
891 }
892 else if (type == kSDADC_Channel_NSide_Type)
893 {
894 base->DECIMATOR_CTL_1 |= (0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_N_SHIFT));
895 }
896 else
897 {
898 base->DECIMATOR_CTL_1 |= ((0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_P_SHIFT)) |
899 (0x1U << (number + SDADC_DECIMATOR_CTL_1_FUNC_LOCAL_RST_AN_DEC_N_SHIFT)));
900 }
901 }
902 }
903
904 /*!
905 * @brief This function is used to reset or release reset for the SDADC channeln's P-Side or/and N-Side madulator DC
906 * Loop.
907 *
908 * @param base SDADC peripheral base address.
909 * @param number channel number, refer @ref sdadc_channel_number_t for details.
910 * @param type channel type, refer @ref sdadc_channel_type_t for details.
911 * @param reset Indicates whether reset or release reset for the madulator DC Loop.
912 * - @b true Reset
913 * - @b false Release reset
914 */
SDADC_ConfigureModulatorDcLoopReset(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,bool reset)915 static inline void SDADC_ConfigureModulatorDcLoopReset(SDADC_Type *base,
916 sdadc_channel_number_t number,
917 sdadc_channel_type_t type,
918 bool reset)
919 {
920 if (reset)
921 {
922 if (type == kSDADC_Channel_PSide_Type)
923 {
924 base->DC_LOOP_CTL_1 &= ~(0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_P_SHIFT));
925 }
926 else if (type == kSDADC_Channel_NSide_Type)
927 {
928 base->DC_LOOP_CTL_1 &= ~(0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_N_SHIFT));
929 }
930 else
931 {
932 base->DC_LOOP_CTL_1 &= ~((0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_P_SHIFT)) |
933 (0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_N_SHIFT)));
934 }
935 }
936 else
937 {
938 if (type == kSDADC_Channel_PSide_Type)
939 {
940 base->DC_LOOP_CTL_1 |= (0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_P_SHIFT));
941 }
942 else if (type == kSDADC_Channel_NSide_Type)
943 {
944 base->DC_LOOP_CTL_1 |= (0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_N_SHIFT));
945 }
946 else
947 {
948 base->DC_LOOP_CTL_1 |= ((0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_P_SHIFT)) |
949 (0x1U << (number + SDADC_DC_LOOP_CTL_1_FUNC_LOCAL_RST_AN_DCLOOP_N_SHIFT)));
950 }
951 }
952 }
953 /*!
954 * @}
955 */
956
957 /*!
958 * @name SDADC FIFO related operations.
959 * @{
960 */
961 /*!
962 * @brief This function is used to enable or disable the global FIFO full interrupt.
963 *
964 * @param base SDADC peripheral base address.
965 * @param enable Indicates whether enable or disable the global FIFO full interrupt.
966 * - @b true Enable interrupt
967 * - @b false Disable interrupt
968 */
SDADC_ControlGlobalFifoIntEnable(SDADC_Type * base,bool enable)969 static inline void SDADC_ControlGlobalFifoIntEnable(SDADC_Type *base, bool enable)
970 {
971 if (enable)
972 {
973 base->FIFO_INTERRUPT |= SDADC_FIFO_INTERRUPT_FIFO_INTERRUPT_EN_MASK;
974 }
975 else
976 {
977 base->FIFO_INTERRUPT &= ~SDADC_FIFO_INTERRUPT_FIFO_INTERRUPT_EN_MASK;
978 }
979 }
980
981 /*!
982 * @brief This function is used to check whether the FIFO full interrupt has occurred.
983 *
984 * @param base SDADC peripheral base address.
985 *
986 * @return The FIFO full interrupt status flag.
987 * - @b true The FIFO full interrupt has occurred.
988 * - @b false The FIFO full interrupt has not occurred.
989 */
SDADC_CheckGlobalFifoInterrupted(SDADC_Type * base)990 static inline bool SDADC_CheckGlobalFifoInterrupted(SDADC_Type *base)
991 {
992 return (0UL != ((base->FIFO_INTERRUPT & SDADC_FIFO_INTERRUPT_FIFO_INTERRUPT_MASK) >>
993 SDADC_FIFO_INTERRUPT_FIFO_INTERRUPT_SHIFT));
994 }
995
996 /*!
997 * @brief This function is used to clear the FIFO full interrupt status flag.
998 *
999 * @param base SDADC peripheral base address.
1000 */
SDADC_ClearGlobalFifoIntStatusFlag(SDADC_Type * base)1001 static inline void SDADC_ClearGlobalFifoIntStatusFlag(SDADC_Type *base)
1002 {
1003 base->FIFO_INTERRUPT |= SDADC_FIFO_INTERRUPT_FIFO_INTERRUPT_MASK;
1004 }
1005
1006 /*!
1007 * @brief This function is used to enable or disable the FIFO full interrupt.
1008 *
1009 * @param base SDADC peripheral base address.
1010 * @param mask Mask value to enable or disable interrupt, please refer to @ref _sdadc_fifo_int_enable for details.
1011 * @param enable Indicates enable or disable the FIFO full interrupt.
1012 * - @b true Enable interrupt
1013 * - @b false Disable interrupt
1014 */
SDADC_ControlFifoIntEnable(SDADC_Type * base,uint32_t mask,bool enable)1015 static inline void SDADC_ControlFifoIntEnable(SDADC_Type *base, uint32_t mask, bool enable)
1016 {
1017 if (enable)
1018 {
1019 base->FIFO_WATERMARK_ERROR_CTL |= mask;
1020 }
1021 else
1022 {
1023 base->FIFO_WATERMARK_ERROR_CTL &= ~mask;
1024 }
1025 }
1026
1027 /*!
1028 * @brief This function is used to enable or disable the FIFO watermark.
1029 *
1030 * @param base SDADC peripheral base address.
1031 * @param mask Mask value to enable or disable watermark, please refer to @ref _sdadc_fifo_watermark_enable for details.
1032 * @param enable Indicates enable or disable the FIFO watermark.
1033 * - @b true Enable watermark
1034 * - @b false Disable watermark
1035 */
SDADC_ControlFifoWatermarkEnable(SDADC_Type * base,uint32_t mask,bool enable)1036 static inline void SDADC_ControlFifoWatermarkEnable(SDADC_Type *base, uint32_t mask, bool enable)
1037 {
1038 if (enable)
1039 {
1040 base->FIFO_WATERMARK_ERROR_CTL |= mask;
1041 }
1042 else
1043 {
1044 base->FIFO_WATERMARK_ERROR_CTL &= ~mask;
1045 }
1046 }
1047
1048 /*!
1049 * @brief This function is used to get the FIFO full interrupt status flags.
1050 *
1051 * @param base SDADC peripheral base address.
1052 *
1053 * @return Status flags of the FIFO full interrupt.
1054 */
SDADC_GetFifoIntStatusFlags(SDADC_Type * base)1055 static inline uint8_t SDADC_GetFifoIntStatusFlags(SDADC_Type *base)
1056 {
1057 return (uint8_t)((base->FIFO_WATERMARK_ERROR_ST & SDADC_FIFO_FULL_INT_STATUS_MASK) >>
1058 SDADC_FIFO_FULL_INT_STATUS_SHIFT);
1059 }
1060
1061 /*!
1062 * @brief This function is used to get the FIFO watermark status flags.
1063 *
1064 * @param base SDADC peripheral base address.
1065 *
1066 * @return Status flags of the FIFO watermark.
1067 */
SDADC_GetFifoWatermarkStatusFlags(SDADC_Type * base)1068 static inline uint8_t SDADC_GetFifoWatermarkStatusFlags(SDADC_Type *base)
1069 {
1070 return (uint8_t)((base->FIFO_WATERMARK_ERROR_ST & SDADC_FIFO_WATERMARK_STATUS_MASK) >>
1071 SDADC_FIFO_WATERMARK_STATUS_SHIFT);
1072 }
1073
1074 /*!
1075 * @brief This function is used to configure FIFO watermark.
1076 *
1077 * @param base SDADC peripheral base address.
1078 * @param number channel number, refer @ref sdadc_channel_number_t for details.
1079 * @param type channel type, refer @ref sdadc_channel_type_t for details.
1080 * @param waterMark WaterMark value, see @ref sdadc_watermark_t for details.
1081 */
SDADC_ConfigureFifoWatermark(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,sdadc_watermark_t waterMark)1082 static inline void SDADC_ConfigureFifoWatermark(SDADC_Type *base,
1083 sdadc_channel_number_t number,
1084 sdadc_channel_type_t type,
1085 sdadc_watermark_t waterMark)
1086 {
1087 if (type == kSDADC_Channel_PSide_Type)
1088 {
1089 base->FIFO_WATERMARK_CTL = ((base->FIFO_WATERMARK_CTL & (~SDADC_FIFO_WATERMARK_CTL_P_MASK(number))) |
1090 SDADC_FIFO_WATERMARK_CTL_P(waterMark.pSideWatermark, number));
1091 }
1092 else if (type == kSDADC_Channel_NSide_Type)
1093 {
1094 base->FIFO_WATERMARK_CTL = ((base->FIFO_WATERMARK_CTL & (~SDADC_FIFO_WATERMARK_CTL_N_MASK(number))) |
1095 SDADC_FIFO_WATERMARK_CTL_N(waterMark.nSideWatermark, number));
1096 }
1097 else
1098 {
1099 base->FIFO_WATERMARK_CTL =
1100 ((base->FIFO_WATERMARK_CTL &
1101 (~(SDADC_FIFO_WATERMARK_CTL_P_MASK(number) | SDADC_FIFO_WATERMARK_CTL_N_MASK(number)))) |
1102 (SDADC_FIFO_WATERMARK_CTL_P(waterMark.pSideWatermark, number) |
1103 SDADC_FIFO_WATERMARK_CTL_N(waterMark.nSideWatermark, number)));
1104 }
1105 }
1106
1107 /*!
1108 * @brief This function is used to reset the specific channel side FIFO's read or/and write pointer.
1109 *
1110 * @param base SDADC peripheral base address.
1111 * @param number channel number, refer @ref sdadc_channel_number_t for details.
1112 * @param type channel type, refer @ref sdadc_channel_type_t for details.
1113 * @param operation Indicates which reset operation to do, refer @ref sdadc_fifo_reset_operation_t for details.
1114 */
SDADC_ControlFifoReadWriteReset(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type,sdadc_fifo_reset_operation_t operation)1115 static inline void SDADC_ControlFifoReadWriteReset(SDADC_Type *base,
1116 sdadc_channel_number_t number,
1117 sdadc_channel_type_t type,
1118 sdadc_fifo_reset_operation_t operation)
1119 {
1120 if (type == kSDADC_Channel_PSide_Type)
1121 {
1122 base->FIFO_WR_RD_CTL |= (operation << ((number * 4U) + SDADC_FIFO_WR_RD_CTL_WR_0_P_RST_SHIFT));
1123 }
1124 else if (type == kSDADC_Channel_NSide_Type)
1125 {
1126 base->FIFO_WR_RD_CTL |= (operation << ((number * 4U) + SDADC_FIFO_WR_RD_CTL_WR_0_N_RST_SHIFT));
1127 }
1128 else
1129 {
1130 base->FIFO_WR_RD_CTL |= ((operation << ((number * 4U) + SDADC_FIFO_WR_RD_CTL_WR_0_P_RST_SHIFT)) |
1131 (operation << ((number * 4U) + SDADC_FIFO_WR_RD_CTL_WR_0_N_RST_SHIFT)));
1132 }
1133 }
1134
1135 /*!
1136 * @brief This function is used to get the specific channel side FIFO's available entries.
1137 *
1138 * @note In the differential mode, the bit stream is converted to 24bit data (FIFO_x_P[23:0]) by the P-Side decimator,
1139 * the output of N-Side decimator (FIFO_x_N[23:0]) is not valid.
1140 *
1141 * @param base SDADC peripheral base address.
1142 * @param number channel number, refer @ref sdadc_channel_number_t for details.
1143 * @param type channel type, refer @ref sdadc_channel_type_t for details.
1144 *
1145 * @return The available entries of the specified FIFO, note that only the lower 5 bits of the returned data are valid.
1146 */
SDADC_GetConvChannelFifoAvailableEntries(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type)1147 static inline uint8_t SDADC_GetConvChannelFifoAvailableEntries(SDADC_Type *base,
1148 sdadc_channel_number_t number,
1149 sdadc_channel_type_t type)
1150 {
1151 uint8_t registerOffset = number / 2U;
1152 uint8_t bitfieldOffset = number % 2U * 16U;
1153 uint8_t temp = 0U;
1154
1155 if (type == kSDADC_Channel_PSide_Type)
1156 {
1157 temp =
1158 (((*((&(base->FIFO_ENTRIES_AVAIL_0)) + registerOffset)) >> bitfieldOffset) & SDADC_FIFO_ENTRIES_AVAIL_MASK);
1159 }
1160 else if (type == kSDADC_Channel_NSide_Type)
1161 {
1162 temp = (((*((&(base->FIFO_ENTRIES_AVAIL_0)) + registerOffset)) >> (bitfieldOffset + 8U)) &
1163 SDADC_FIFO_ENTRIES_AVAIL_MASK);
1164 }
1165
1166 return temp;
1167 }
1168
1169 /*!
1170 * @brief This function is used to get the specific channel side FIFO's raw data.
1171 *
1172 * @note In the differential mode, the bit stream is converted to 24bit data (FIFO_x_P[23:0]) by the P-Side decimator,
1173 * the output of N-Side decimator (FIFO_x_N[23:0]) is not valid. So the type that needs to be passed in in differential
1174 * mode is @ref kSDADC_Channel_PSide_Type.
1175 *
1176 * @param base SDADC peripheral base address.
1177 * @param number channel number, refer @ref sdadc_channel_number_t for details.
1178 * @param type channel type, refer @ref sdadc_channel_type_t for details.
1179 *
1180 * @return The raw data of the specified FIFO.
1181 */
SDADC_GetConvChannelFifoRawData(SDADC_Type * base,sdadc_channel_number_t number,sdadc_channel_type_t type)1182 static inline uint32_t SDADC_GetConvChannelFifoRawData(SDADC_Type *base,
1183 sdadc_channel_number_t number,
1184 sdadc_channel_type_t type)
1185 {
1186 uint8_t offset = 0U;
1187
1188 if (type == kSDADC_Channel_PSide_Type)
1189 {
1190 offset = number * 2U;
1191 }
1192 else if (type == kSDADC_Channel_NSide_Type)
1193 {
1194 offset = number * 2U + 1U;
1195 }
1196 else
1197 {
1198 assert(false);
1199 }
1200
1201 return (((*((&(base->FIFO_0_P)) + offset)) & SDADC_FIFO_MASK) >> SDADC_FIFO_SHIFT);
1202 }
1203
1204 /*!
1205 * @brief This function is used to copy specific conversion channels' data from FIFO to buffer.
1206 *
1207 * @note This function will copy all 16 entries in the specified FIFO.
1208 *
1209 * @param base SDADC peripheral base address.
1210 * @param group Indicates which group of channels data to obtain.
1211 * @param count Indicates how many channels in the specified group.
1212 * @param buffer The buffer which stores conversion data.
1213 */
1214 void SDADC_CopyConvChannelFifoToBuffer(SDADC_Type *base, sdadc_channel_group *group, uint8_t count, void *buffer);
1215 /*!
1216 * @}
1217 */
1218
1219 #if defined(__cplusplus)
1220 }
1221 #endif
1222
1223 /*!
1224 * @}
1225 */
1226
1227 #endif /* FSL_SDADC_H_ */
1228