-
Notifications
You must be signed in to change notification settings - Fork 1
/
hsadc_18xx_43xx.h
575 lines (524 loc) · 23.9 KB
/
hsadc_18xx_43xx.h
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
/*
* @brief LPC18xx/43xx High speed ADC driver
*
* @note
* Copyright(C) NXP Semiconductors, 2013
* All rights reserved.
*
* @par
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* LPC products. This software is supplied "AS IS" without any warranties of
* any kind, and NXP Semiconductors and its licensor disclaim any and
* all warranties, express or implied, including all implied warranties of
* merchantability, fitness for a particular purpose and non-infringement of
* intellectual property rights. NXP Semiconductors assumes no responsibility
* or liability for the use of the software, conveys no license or rights under any
* patent, copyright, mask work right, or any other intellectual property rights in
* or to any products. NXP Semiconductors reserves the right to make changes
* in the software without notification. NXP Semiconductors also makes no
* representation or warranty that such application will be suitable for the
* specified use without further testing or modification.
*
* @par
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, under NXP Semiconductors' and its
* licensor's relevant copyrights in the software, without fee, provided that it
* is used in conjunction with NXP Semiconductors microcontrollers. This
* copyright, permission, and disclaimer notice must appear in all copies of
* this code.
*/
#ifndef __HSADC_18XX_43XX_H_
#define __HSADC_18XX_43XX_H_
#ifdef __cplusplus
extern "C" {
#endif
/** @defgroup HSADC_18XX_43XX CHIP: LPC18xx/43xx High speed ADC driver
* @ingroup CHIP_18XX_43XX_Drivers
* @{
*/
/**
* @brief High speed ADC interrupt control structure
*/
typedef struct {
__O uint32_t CLR_EN; /*!< Interrupt clear mask */
__O uint32_t SET_EN; /*!< Interrupt set mask */
__I uint32_t MASK; /*!< Interrupt mask */
__I uint32_t STATUS; /*!< Interrupt status */
__O uint32_t CLR_STAT; /*!< Interrupt clear status */
__O uint32_t SET_STAT; /*!< Interrupt set status */
uint32_t RESERVED[2];
} HSADCINTCTRL_T;
/**
* @brief HSADC register block structure
*/
typedef struct { /*!< HSADC Structure */
__O uint32_t FLUSH; /*!< Flushes FIFO */
__IO uint32_t DMA_REQ; /*!< Set or clear DMA write request */
__I uint32_t FIFO_STS; /*!< Indicates FIFO fill level status */
__IO uint32_t FIFO_CFG; /*!< Configures FIFO fill level */
__O uint32_t TRIGGER; /*!< Enable software trigger to start descriptor processing */
__IO uint32_t DSCR_STS; /*!< Indicates active descriptor table and descriptor entry */
__IO uint32_t POWER_DOWN; /*!< Set or clear power down mode */
__IO uint32_t CONFIG; /*!< Configures external trigger mode, store channel ID in FIFO and walk-up recovery time from power down */
__IO uint32_t THR[2]; /*!< Configures window comparator A or B levels */
__I uint32_t LAST_SAMPLE[6]; /*!< Contains last converted sample of input M [M=0..5) and result of window comparator */
uint32_t RESERVED0[49];
__IO uint32_t ADC_SPEED; /*!< ADC speed control */
__IO uint32_t POWER_CONTROL; /*!< Configures ADC power vs. speed, DC-in biasing, output format and power gating */
uint32_t RESERVED1[61];
__I uint32_t FIFO_OUTPUT[16]; /*!< FIFO output mapped to 16 consecutive address locations */
uint32_t RESERVED2[48];
__IO uint32_t DESCRIPTOR[2][8]; /*!< Table 0 and 1 descriptors */
uint32_t RESERVED3[752];
HSADCINTCTRL_T INTS[2]; /*!< Interrupt 0 and 1 control and status registers */
} LPC_HSADC_T;
#define HSADC_MAX_SAMPLEVAL 0xFFF
/**
* @brief Initialize the High speed ADC
* @param pHSADC : The base of HSADC peripheral on the chip
* @return Nothing
*/
void Chip_HSADC_Init(LPC_HSADC_T *pHSADC);
/**
* @brief Shutdown HSADC
* @param pHSADC : The base of HSADC peripheral on the chip
* @return Nothing
*/
void Chip_HSADC_DeInit(LPC_HSADC_T *pHSADC);
/**
* @brief Flush High speed ADC FIFO
* @param pHSADC : The base of HSADC peripheral on the chip
* @return Nothing
*/
STATIC INLINE void Chip_HSADC_FlushFIFO(LPC_HSADC_T *pHSADC)
{
pHSADC->FLUSH = 1;
}
/**
* @brief Load a descriptor table from memory by requesting a DMA write
* @param pHSADC : The base of HSADC peripheral on the chip
* @return Nothing
* @note WHat is this used for?
*/
STATIC INLINE void Chip_HSADC_LoadDMADesc(LPC_HSADC_T *pHSADC)
{
pHSADC->DMA_REQ = 1;
}
/**
* @brief Returns current HSADC FIFO fill level
* @param pHSADC : The base of HSADC peripheral on the chip
* @return FIFO level, 0 for empty, 1 to 15, or 16 for full
* @note WHat is this used for?
*/
STATIC INLINE uint32_t Chip_HSADC_GetFIFOLevel(LPC_HSADC_T *pHSADC)
{
return pHSADC->FIFO_STS;
}
/**
* @brief Sets up HSADC FIFO trip level and packing
* @param pHSADC : The base of HSADC peripheral on the chip
* @param trip : HSADC FIFO trip point (1 to 15 samples)
* @param packed : true to pack samples, false for no packing
* @return Nothing
* @note The FIFO trip point is used for the DMA or interrupt level.
* Sample packging allows packing 2 samples into a single 32-bit
* word.
*/
void Chip_HSADC_SetupFIFO(LPC_HSADC_T *pHSADC, uint8_t trip, bool packed);
/**
* @brief Starts a manual (software) trigger of HSADC descriptors
* @param pHSADC : The base of HSADC peripheral on the chip
* @return Nothing
*/
STATIC INLINE void Chip_HSADC_SWTrigger(LPC_HSADC_T *pHSADC)
{
pHSADC->TRIGGER = 1;
}
/**
* @brief Set active table descriptor index and number
* @param pHSADC : The base of HSADC peripheral on the chip
* @param table : Table index, 0 or 1
* @param desc : Descriptor index, 0 to 7
* @return Nothing
* @note This function can be used to set active descriptor table and
* active descriptor entry values. The new values will be updated
* immediately. This should only be updated when descriptors are
* not running (halted).
*/
STATIC INLINE void Chip_HSADC_SetActiveDescriptor(LPC_HSADC_T *pHSADC, uint8_t table, uint8_t desc)
{
pHSADC->DSCR_STS = (uint32_t) ((desc << 1) | table);
}
/**
* @brief Returns currently active descriptor index being processed
* @param pHSADC : The base of HSADC peripheral on the chip
* @return the current active descriptor index, 0 to 7
*/
STATIC INLINE uint8_t Chip_HSADC_GetActiveDescriptorIndex(LPC_HSADC_T *pHSADC)
{
return (uint8_t) ((pHSADC->DSCR_STS >> 1) & 0x7);
}
/**
* @brief Returns currently active descriptor table being processed
* @param pHSADC : The base of HSADC peripheral on the chip
* @return the current active descriptor table, 0 or 1
*/
STATIC INLINE uint8_t Chip_HSADC_GetActiveDescriptorTable(LPC_HSADC_T *pHSADC)
{
return (uint8_t) (pHSADC->DSCR_STS & 1);
}
/**
* @brief Enables ADC power down mode
* @param pHSADC : The base of HSADC peripheral on the chip
* @return Nothing
* @note In most cases, this function doesn't need to be used as
* the descriptors control power as needed.
*/
STATIC INLINE void Chip_HSADC_EnablePowerDownMode(LPC_HSADC_T *pHSADC)
{
pHSADC->POWER_DOWN = 1;
}
/**
* @brief Disables ADC power down mode
* @param pHSADC : The base of HSADC peripheral on the chip
* @return Nothing
* @note In most cases, this function doesn't need to be used as
* the descriptors control power as needed.
*/
STATIC INLINE void Chip_HSADC_DisablePowerDownMode(LPC_HSADC_T *pHSADC)
{
pHSADC->POWER_DOWN = 0;
}
/* HSADC trigger configuration mask types */
typedef enum {
HSADC_CONFIG_TRIGGER_OFF = 0, /*!< ADCHS triggers off */
HSADC_CONFIG_TRIGGER_SW = 1, /*!< ADCHS software trigger only */
HSADC_CONFIG_TRIGGER_EXT = 2, /*!< ADCHS external trigger only */
HSADC_CONFIG_TRIGGER_BOTH = 3 /*!< ADCHS both software and external triggers allowed */
} HSADC_TRIGGER_MASK_T;
/* HSADC trigger configuration mode types */
typedef enum {
HSADC_CONFIG_TRIGGER_RISEEXT = (0 << 2), /*!< ADCHS rising external trigger */
HSADC_CONFIG_TRIGGER_FALLEXT = (1 << 2), /*!< ADCHS falling external trigger */
HSADC_CONFIG_TRIGGER_LOWEXT = (2 << 2), /*!< ADCHS low external trigger */
HSADC_CONFIG_TRIGGER_HIGHEXT = (3 << 2) /*!< ADCHS high external trigger */
} HSADC_TRIGGER_MODE_T;
/* HSADC trigger configuration sync types */
typedef enum {
HSADC_CONFIG_TRIGGER_NOEXTSYNC = (0 << 4), /*!< do not synchronize external trigger input */
HSADC_CONFIG_TRIGGER_EXTSYNC = (1 << 4), /*!< synchronize external trigger input */
} HSADC_TRIGGER_SYNC_T;
/* HSADC trigger configuration channel ID */
typedef enum {
HSADC_CHANNEL_ID_EN_NONE = (0 << 5), /*!< do not add channel ID to FIFO output data */
HSADC_CHANNEL_ID_EN_ADD = (1 << 5), /*!< add channel ID to FIFO output data */
} HSADC_CHANNEL_ID_EN_T;
/**
* @brief Configure HSADC trigger source and recovery time
* @param pHSADC : The base of HSADC peripheral on the chip
* @param mask : HSADC trigger configuration mask type
* @param mode : HSADC trigger configuration mode type
* @param sync : HSADC trigger configuration sync type
* @param chID : HSADC trigger configuration channel ID enable
* @param recoveryTime : ADC recovery time (in HSADC clocks) from powerdown (255 max)
* @return Nothing
*/
STATIC INLINE void Chip_HSADC_ConfigureTrigger(LPC_HSADC_T *pHSADC,
HSADC_TRIGGER_MASK_T mask,
HSADC_TRIGGER_MODE_T mode,
HSADC_TRIGGER_SYNC_T sync,
HSADC_CHANNEL_ID_EN_T chID, uint16_t recoveryTime)
{
pHSADC->CONFIG = (uint32_t) mask | (uint32_t) mode | (uint32_t) sync |
(uint32_t) chID | (uint32_t) (recoveryTime << 6);
}
/**
* @brief Set HSADC Threshold low value
* @param pHSADC : The base of HSADC peripheral on the chip
* @param thrnum : Threshold register value (0 for threshold register A, 1 for threshold register B)
* @param value : Threshold low data value (should be 12-bit value)
* @return None
*/
void Chip_HSADC_SetThrLowValue(LPC_HSADC_T *pHSADC, uint8_t thrnum, uint16_t value);
/**
* @brief Set HSADC Threshold high value
* @param pHSADC : The base of HSADC peripheral on the chip
* @param thrnum : Threshold register value (0 for threshold register A, 1 for threshold register B)
* @param value : Threshold high data value (should be 12-bit value)
* @return None
*/
void Chip_HSADC_SetThrHighValue(LPC_HSADC_T *pHSADC, uint8_t thrnum, uint16_t value);
/** HSADC last sample registers bit fields */
#define HSADC_LS_DONE (1 << 0) /*!< Sample conversion complete bit */
#define HSADC_LS_OVERRUN (1 << 1) /*!< Sample overrun bit */
#define HSADC_LS_RANGE_IN (0 << 2) /*!< Threshold range comparison is in range */
#define HSADC_LS_RANGE_BELOW (1 << 2) /*!< Threshold range comparison is below range */
#define HSADC_LS_RANGE_ABOVE (2 << 2) /*!< Threshold range comparison is above range */
#define HSADC_LS_RANGE(val) ((val) & 0xC) /*!< Mask for threshold crossing comparison result */
#define HSADC_LS_CROSSING_NONE (0 << 4) /*!< No threshold crossing detected */
#define HSADC_LS_CROSSING_DOWN (1 << 4) /*!< Downward threshold crossing detected */
#define HSADC_LS_CROSSING_UP (2 << 4) /*!< Upward threshold crossing detected */
#define HSADC_LS_CROSSING(val) ((val) & 0x30) /*!< Mask for threshold crossing comparison result */
#define HSADC_LS_DATA(val) ((val) >> 6) /*!< Mask data value out of sample */
/**
* @brief Read a ADC last sample register
* @param pHSADC : The base of ADC peripheral on the chip
* @param channel : Last sample register to read, 0-5
* @return Current raw value of the indexed last sample register
* @note This function returns the raw value of the indexed last sample register
* and clears the sample's DONE and OVERRUN statuses if set. You can determine
* the overrun and datavalid status for the sample by masking the return value
* with HSADC_LS_DONE or HSADC_LS_OVERRUN. To get the data value for the sample,
* use the HSADC_LS_DATA(sample) macro. The threshold range and crossing results
* can be determined by using the HSADC_LS_RANGE(sample) and
* HSADC_LS_CROSSING(sample) macros and comparing the result against the
* HSADC_LS_RANGE_* or HSADC_LS_CROSSING_* definitions.<br>
*/
STATIC INLINE uint32_t Chip_HSADC_GetLastSample(LPC_HSADC_T *pHSADC, uint8_t channel)
{
return pHSADC->LAST_SAMPLE[channel];
}
/**
* @brief Setup speed for a input channel
* @param pHSADC : The base of ADC peripheral on the chip
* @param channel : Input to set, 0-5
* @param speed : Speed value to set (0xF, 0xE, or 0x0), see user manual
* @return Nothing
* @note It is recommended not to use this function, as the values needed
* for this register will be setup with the Chip_HSADC_SetPowerSpeed() function.
*/
void Chip_HSADC_SetSpeed(LPC_HSADC_T *pHSADC, uint8_t channel, uint8_t speed);
/**
* @brief Setup (common) HSADC power and speed settings
* @param pHSADC : The base of ADC peripheral on the chip
* @param comp2 : True sets up for 2's complement, false sets up for offset binary data format
* @return Nothing
* @note This function sets up the HSADC current/power/speed settings that
* apply to all HSADC channels (inputs). Based on the HSADC clock rate, it will
* automatically setup the best current setting (CRS) and speed settings (DGEC)
* for all channels. (See user manual).<br>
* This function is also used to set the data format of the sampled data. It is
* recommended to call this function if the HSADC sample rate changes.
*/
void Chip_HSADC_SetPowerSpeed(LPC_HSADC_T *pHSADC, bool comp2);
/* AC-DC coupling selection for vin_neg and vin_pos sides */
typedef enum {
HSADC_CHANNEL_NODCBIAS = 0, /*!< No DC bias */
HSADC_CHANNEL_DCBIAS = 1, /*!< DC bias on vin_neg side */
} HSADC_DCBIAS_T;
/**
* @brief Setup AC-DC coupling selection for a channel
* @param pHSADC : The base of ADC peripheral on the chip
* @param channel : Input to set, 0-5
* @param dcInNeg : AC-DC coupling selection on vin_neg side
* @param dcInPos : AC-DC coupling selection on vin_pos side
* @return Nothing
* @note This function sets up the HSADC current/power/speed settings that
* apply to all HSADC channels (inputs). Based on the HSADC clock rate, it will
* automatically setup the best current setting (CRS) and speed settings (DGEC)
* for all channels. (See user manual).<br>
* This function is also used to set the data format of the sampled data. It is
* recommended to call this function if the HSADC sample rate changes.
*/
void Chip_HSADC_SetACDCBias(LPC_HSADC_T *pHSADC, uint8_t channel,
HSADC_DCBIAS_T dcInNeg, HSADC_DCBIAS_T dcInPos);
/**
* @brief Enable HSADC power control and band gap reference
* @param pHSADC : The base of ADC peripheral on the chip
* @return Nothing
* @note This function enables both the HSADC power and band gap
* reference.
*/
STATIC INLINE void Chip_HSADC_EnablePower(LPC_HSADC_T *pHSADC)
{
pHSADC->POWER_CONTROL |= (1 << 17) | (1 << 18);
}
/**
* @brief Disable HSADC power control and band gap reference
* @param pHSADC : The base of ADC peripheral on the chip
* @return Nothing
* @note This function disables both the HSADC power and band gap
* reference.
*/
STATIC INLINE void Chip_HSADC_DisablePower(LPC_HSADC_T *pHSADC)
{
pHSADC->POWER_CONTROL &= ~((1 << 17) | (1 << 18));
}
/** HSADC FIFO registers bit fields for unpacked sample in lower 16 bits */
#define HSADC_FIFO_SAMPLE_MASK (0xFFF) /*!< 12-bit sample mask (unpacked) */
#define HSADC_FIFO_SAMPLE(val) ((val) & 0xFFF) /*!< Macro for stripping out unpacked sample data */
#define HSADC_FIFO_CHAN_ID_MASK (0x7000) /*!< Channel ID mask */
#define HSADC_FIFO_CHAN_ID(val) (((val) >> 12) & 0x7) /*!< Macro for stripping out sample data */
#define HSADC_FIFO_EMPTY (0x1 << 15) /*!< FIFO empty (invalid sample) */
#define HSADC_FIFO_SHIFTPACKED(val) ((val) >> 16) /*!< Shifts the packed FIFO sample into the lower 16-bits of a word */
#define HSADC_FIFO_PACKEDMASK (1UL << 31) /*!< Packed sample check mask */
/**
* @brief Reads the HSADC FIFO
* @param pHSADC : The base of ADC peripheral on the chip
* @return HSADC FIFO value
* @note This function reads and pops the HSADC FIFO. The FIFO
* contents can be determined by using the HSADC_FIFO_* macros. If
* FIFO packing is enabled, this may contain 2 samples. Use the
* HSADC_FIFO_SHIFTPACKED macro to shift packed sample data into a
* variable that can be used with the HSADC_FIFO_* macros. Note that
* even if packing is enabled, the packed sample may not be valid.
*/
STATIC INLINE uint32_t Chip_HSADC_GetFIFO(LPC_HSADC_T *pHSADC)
{
return pHSADC->FIFO_OUTPUT[0];
}
/** HSADC descriptor registers bit fields and support macros */
#define HSADC_DESC_CH(ch) (ch) /*!< Converter input channel */
#define HSADC_DESC_HALT (1 << 3) /*!< Descriptor halt after conversion bit */
#define HSADC_DESC_INT (1 << 4) /*!< Raise interrupt when ADC result is available bit */
#define HSADC_DESC_POWERDOWN (1 << 5) /*!< Power down after this conversion bit */
#define HSADC_DESC_BRANCH_NEXT (0 << 6) /*!< Continue with next descriptor */
#define HSADC_DESC_BRANCH_FIRST (1 << 6) /*!< Branch to the first descriptor */
#define HSADC_DESC_BRANCH_SWAP (2 << 6) /*!< Swap tables and branch to the first descriptor of the new table */
#define HSADC_DESC_MATCH(val) ((val) << 8) /*!< Match value used to trigger a descriptor */
#define HSADC_DESC_THRESH_NONE (0 << 22) /*!< No threshold detection performed */
#define HSADC_DESC_THRESH_A (1 << 22) /*!< Use A threshold detection */
#define HSADC_DESC_THRESH_B (2 << 22) /*!< Use B threshold detection */
#define HSADC_DESC_RESET_TIMER (1 << 24) /*!< Reset descriptor timer */
#define HSADC_DESC_UPDATE_TABLE (1UL << 31) /*!< Update table with all 8 descriptors of this table */
/**
* @brief Sets up a raw HSADC descriptor entry
* @param pHSADC : The base of ADC peripheral on the chip
* @param table : Descriptor table number, 0 or 1
* @param descNo : Descriptor number to setup, 0 to 7
* @param desc : Raw descriptor value (see notes)
* @return Nothing
* @note This function sets up a descriptor table entry. To setup
* a descriptor entry, select a OR'ed combination of the HSADC_DESC_CH,
* HSADC_DESC_HALT, HSADC_DESC_INT, HSADC_DESC_POWERDOWN, one of
* HSADC_DESC_BRANCH_*, HSADC_DESC_MATCH, one of HSADC_DESC_THRESH_*, and
* HSADC_DESC_RESET_TIMER definitions.<br>
* Example for setting up a table 0, descriptor number 4 entry for input 0:<br>
* Chip_HSADC_SetupDescEntry(LPC_HSADC, 0, 4, (HSADC_DESC_CH(0) | HSADC_DESC_HALT |
* HSADC_DESC_INT));
*/
STATIC INLINE void Chip_HSADC_SetupDescEntry(LPC_HSADC_T *pHSADC, uint8_t table,
uint8_t descNo, uint32_t desc)
{
pHSADC->DESCRIPTOR[table][descNo] = desc;
}
/**
* @brief Update all descriptors of a table
* @param pHSADC : The base of ADC peripheral on the chip
* @param table : Descriptor table number, 0 or 1
* @return Nothing
* @note Updates descriptor table with all 8 descriptors. This
* function should be used after all descriptors are setup with
* the Chip_HSADC_SetupDescEntry() function.
*/
STATIC INLINE void Chip_HSADC_UpdateDescTable(LPC_HSADC_T *pHSADC, uint8_t table)
{
pHSADC->DESCRIPTOR[table][0] |= HSADC_DESC_UPDATE_TABLE;
}
/* Interrupt selection for interrupt 0 set - these interrupts and statuses
should only be used with the interrupt 0 register set */
#define HSADC_INT0_FIFO_FULL (1 << 0) /*!< number of samples in FIFO is more than FIFO_LEVEL */
#define HSADC_INT0_FIFO_EMPTY (1 << 1) /*!< FIFO is empty */
#define HSADC_INT0_FIFO_OVERFLOW (1 << 2) /*!< FIFO was full; conversion sample is not stored and lost */
#define HSADC_INT0_DSCR_DONE (1 << 3) /*!< The descriptor INTERRUPT field was enabled and its sample is converted */
#define HSADC_INT0_DSCR_ERROR (1 << 4) /*!< The ADC was not fully woken up when a sample was converted and the conversion results is unreliable */
#define HSADC_INT0_ADC_OVF (1 << 5) /*!< Converted sample value was over range of the 12 bit output code */
#define HSADC_INT0_ADC_UNF (1 << 6) /*!< Converted sample value was under range of the 12 bit output code */
/* Interrupt selection for interrupt 1 set - these interrupts and statuses
should only be used with the interrupt 1 register set */
#define HSADC_INT1_THCMP_BRANGE(ch) (1 << ((ch * 5) + 0)) /*!< Input channel result below range */
#define HSADC_INT1_THCMP_ARANGE(ch) (1 << ((ch * 5) + 1)) /*!< Input channel result above range */
#define HSADC_INT1_THCMP_DCROSS(ch) (1 << ((ch * 5) + 2)) /*!< Input channel result downward threshold crossing detected */
#define HSADC_INT1_THCMP_UCROSS(ch) (1 << ((ch * 5) + 3)) /*!< Input channel result upward threshold crossing detected */
#define HSADC_INT1_OVERRUN(ch) (1 << ((ch * 5) + 4)) /*!< New conversion on channel completed and has overwritten the previous contents of register LAST_SAMPLE [0] before it has been read */
/**
* @brief Enable an interrupt for HSADC interrupt group 0 or 1
* @param pHSADC : The base of ADC peripheral on the chip
* @param intGrp : Interrupt group 0 or 1
* @param intMask : Interrupts to enable, use HSADC_INT0_* for group 0
* and HSADC_INT1_* values for group 1
* @return Nothing
*/
STATIC INLINE void Chip_HSADC_EnableInts(LPC_HSADC_T *pHSADC, uint8_t intGrp, uint32_t intMask)
{
pHSADC->INTS[intGrp].SET_EN = intMask;
}
/**
* @brief Disables an interrupt for HSADC interrupt group 0 or 1
* @param pHSADC : The base of ADC peripheral on the chip
* @param intGrp : Interrupt group 0 or 1
* @param intMask : Interrupts to disable, use HSADC_INT0_* for group 0
* and HSADC_INT1_* values for group 1
* @return Nothing
*/
STATIC INLINE void Chip_HSADC_DisableInts(LPC_HSADC_T *pHSADC, uint8_t intGrp, uint32_t intMask)
{
pHSADC->INTS[intGrp].CLR_EN = intMask;
}
/**
* @brief Returns enabled interrupt for HSADC interrupt group 0 or 1
* @param pHSADC : The base of ADC peripheral on the chip
* @param intGrp : Interrupt group 0 or 1
* @return enabled interrupts for the selected group
* @note Mask the return value with a HSADC_INT0_* macro for group 0
* or HSADC_INT1_* values for group 1 to determine which interrupts are enabled.
*/
STATIC INLINE uint32_t Chip_HSADC_GetEnabledInts(LPC_HSADC_T *pHSADC, uint8_t intGrp)
{
return pHSADC->INTS[intGrp].MASK;
}
/**
* @brief Returns status for HSADC interrupt group 0 or 1
* @param pHSADC : The base of ADC peripheral on the chip
* @param intGrp : Interrupt group 0 or 1
* @return interrupt (pending) status for the selected group
* @note Mask the return value with a HSADC_INT0_* macro for group 0
* or HSADC_INT1_* values for group 1 to determine which statuses are active.
*/
STATIC INLINE uint32_t Chip_HSADC_GetIntStatus(LPC_HSADC_T *pHSADC, uint8_t intGrp)
{
return pHSADC->INTS[intGrp].STATUS;
}
/**
* @brief Clear a status for HSADC interrupt group 0 or 1
* @param pHSADC : The base of ADC peripheral on the chip
* @param intGrp : Interrupt group 0 or 1
* @param stsMask : Statuses to clear, use HSADC_INT0_* for group 0
* and HSADC_INT1_* values for group 1
* @return Nothing
*/
STATIC INLINE void Chip_HSADC_ClearIntStatus(LPC_HSADC_T *pHSADC, uint8_t intGrp, uint32_t stsMask)
{
pHSADC->INTS[intGrp].CLR_STAT = stsMask;
}
/**
* @brief Sets a status for HSADC interrupt group 0 or 1
* @param pHSADC : The base of ADC peripheral on the chip
* @param intGrp : Interrupt group 0 or 1
* @param stsMask : Statuses to set, use HSADC_INT0_* for group 0
* and HSADC_INT1_* values for group 1
* @return Nothing
*/
STATIC INLINE void Chip_HSADC_SetIntStatus(LPC_HSADC_T *pHSADC, uint8_t intGrp, uint32_t stsMask)
{
pHSADC->INTS[intGrp].SET_STAT = stsMask;
}
/**
* @brief Returns the clock rate in Hz for the HSADC
* @param pHSADC : The base of HSADC peripheral on the chip
* @return clock rate in Hz for the HSADC
*/
STATIC INLINE uint32_t Chip_HSADC_GetBaseClockRate(LPC_HSADC_T *pHSADC)
{
(void) pHSADC;
/* Return computed sample rate for the high speed ADC peripheral */
return Chip_Clock_GetRate(CLK_ADCHS);
}
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __HSADC_18XX_43XX_H_ */