NetBurner 3.5.8
PDF Version
mimx11xx_acmp.h
1#ifndef __MIMX11XX_ACMP_H
2#define __MIMX11XX_ACMP_H
3/*NB_REVISION*/
4
5/*NB_COPYRIGHT*/
6
7#include <predef.h>
8#include <sim.h>
9
10#define ACMP_MAX_INPUTS 4
11#define ACMP_FAST_CLK_MIN_DIV 2
12#define ACMP_INT_DAC_CH 0x6
13#define ACMP_IRQ_DEF_PRIO 4
14
15class MIMX_ACMP {
16public:
17 typedef void (*IrqHandler_t)(MIMX_ACMP &, uint32_t status);
18 enum class eFastClock : uint8_t {
19 OSC_RC_48M_DIV2 = 0,
20 OSC_24M = 1,
21 OSC_400M = 2,
22 OSC_RC_16M = 3,
23 SYS_PLL3_CLK = 4,
24 SYS_PLL1_DIV5 = 5,
25 AUDIO_PLL_CLK = 6,
26 SYS_PLL2_PFD3 = 7
27 };
28 enum class eHyst : uint8_t {
29 Hyst_5mv = 0,
30 Hyst_10mv = 1,
31 Hyst_20mv = 2,
32 Hyst_30mv = 3,
33 };
34
35 enum class eSamplePeriod : uint8_t {
36 Samp_1 = 0,
37 Samp_2 = 1,
38 Samp_4 = 2,
39 Samp_8 = 3,
40 Samp_16 = 4,
41 Samp_32 = 5,
42 Samp_64 = 6,
43 Samp_256= 7,
44 };
45
46private:
47 static IrqHandler_t irqCb[];
48
49 CMP_Type &cmp;
50
51 static void sIrqHandler();
52// void IrqHandler();
53
54 MIMX_ACMP(CMP_Type *acmp);
55
56public:
57
58 MIMX_ACMP(uint32_t moduleIdx, uint16_t PosCh, uint16_t NegCh, uint8_t DacVal = 0,
59 int OutPol = 0, uint8_t filtPer = 0, uint8_t filtCount = 0,
60 eSamplePeriod sampPer = eSamplePeriod::Samp_16,
61 eHyst hyst = eHyst::Hyst_5mv);
62
63 uint32_t HwIdx();
64
65 void Enable();
66 void Disable();
67
68 void SetInputs(uint8_t PosCh, uint8_t NegCh);
69 void SetPosInput(uint8_t ch);
70 void SetNegInput(uint8_t ch);
71 uint8_t GetPosInput();
72 uint8_t GetNegInput();
73 void SetDacVal(uint8_t dacVal);
74 uint8_t GetDacVal();
75 void SetOutputPolarity(int pol);
76 int GetOutputPolarity();
77 IrqHandler_t RegisterIsr(IrqHandler_t handler);
78 IrqHandler_t SetIrqPrio(uint8_t prio);
79 void EnableIrq(bool falling = true, bool rising = true);
80 void DisableIrq(bool falling = true, bool rising = true);
81
82 void SetFilter(uint8_t period, uint8_t count);
83 void SetFilterPeriod(uint8_t period);
84 void SetFilterCount(uint8_t count);
85 uint8_t GetFilterPeriod();
86 uint8_t GetFilterCount();
87
88 bool GetState();
89};
90
91inline void
92MIMX_ACMP::Enable()
93 { cmp.C0 |= CMP_C0_EN(1); }
94
95inline void
96MIMX_ACMP::Disable()
97 { cmp.C0 &= ~CMP_C0_EN_MASK; }
98
99inline void
100MIMX_ACMP::SetInputs(uint8_t PosCh, uint8_t NegCh)
101{
102 cmp.C1 = (cmp.C1 & ~(CMP_C1_PSEL_MASK | CMP_C1_MSEL_MASK))
103 | CMP_C1_PSEL((PosCh & 0xF)+1) | CMP_C1_MSEL((NegCh & 0xF)+1);
104}
105
106inline void
107MIMX_ACMP::SetPosInput(uint8_t ch)
108 { cmp.C1 = (cmp.C1 & ~CMP_C1_PSEL_MASK) | CMP_C1_PSEL((ch & 0xF)+1); }
109
110inline void
111MIMX_ACMP::SetNegInput(uint8_t ch)
112 { cmp.C1 = (cmp.C1 & ~CMP_C1_MSEL_MASK) | CMP_C1_MSEL((ch & 0xF)+1); }
113
114inline uint8_t
115MIMX_ACMP::GetPosInput()
116 { return ((cmp.C1 & CMP_C1_PSEL_MASK)>>CMP_C1_PSEL_SHIFT)-1; }
117
118inline uint8_t
119MIMX_ACMP::GetNegInput()
120 { return ((cmp.C1 & CMP_C1_MSEL_MASK)>>CMP_C1_MSEL_SHIFT)-1; }
121
122inline void
123MIMX_ACMP::SetDacVal(uint8_t dacVal)
124{
125 cmp.C1 = (cmp.C1 & ~CMP_C1_VOSEL_MASK) | CMP_C1_DACEN(1) | CMP_C1_VRSEL(1)
126 | CMP_C1_DMODE(1) | CMP_C1_VOSEL(dacVal);
127}
128
129inline uint8_t
130MIMX_ACMP::GetDacVal()
131 { return ((cmp.C1 & CMP_C1_VOSEL_MASK) >> CMP_C1_VOSEL_SHIFT); }
132
133inline void
134MIMX_ACMP::SetOutputPolarity(int pol)
135 { (pol < 0) ? (cmp.C0 |= CMP_C0_INVT_MASK) : (cmp.C0 &= ~CMP_C0_INVT_MASK); }
136
137inline int
138MIMX_ACMP::GetOutputPolarity()
139 { return (cmp.C0 & CMP_C0_INVT_MASK) ? -1 : 1; }
140
141inline void
142MIMX_ACMP::EnableIrq(bool falling, bool rising)
143 { cmp.C0 |= (falling ? CMP_C0_IEF_MASK : 0) | (rising ? CMP_C0_IER_MASK : 0); }
144
145inline void
146MIMX_ACMP::DisableIrq(bool falling, bool rising)
147 { cmp.C0 &= ~((falling ? CMP_C0_IEF_MASK : 0) | (rising ? CMP_C0_IER_MASK : 0)); }
148
149inline void
150MIMX_ACMP::SetFilter(uint8_t period, uint8_t count)
151{
152 cmp.C0 = (cmp.C0 & ~(CMP_C0_FPR_MASK | CMP_C0_FILTER_CNT_MASK | CMP_C0_COS_MASK))
153 | CMP_C0_FPR(period) | CMP_C0_FILTER_CNT((count > 7)?7:count)
154 | CMP_C0_COS(!period || !count);
155}
156
157inline void
158MIMX_ACMP::SetFilterPeriod(uint8_t period)
159{
160 cmp.C0 = (cmp.C0 & ~(CMP_C0_FPR_MASK | CMP_C0_COS_MASK))
161 | CMP_C0_FPR(period)
162 | CMP_C0_COS(!period || !(cmp.C0 & CMP_C0_FILTER_CNT_MASK));
163}
164
165inline void
166MIMX_ACMP::SetFilterCount(uint8_t count)
167{
168 cmp.C0 = (cmp.C0 & ~(CMP_C0_FILTER_CNT_MASK| CMP_C0_COS_MASK))
169 | CMP_C0_FILTER_CNT(count)
170 | CMP_C0_COS(!count || !(cmp.C0 & CMP_C0_FPR_MASK));
171}
172
173inline uint8_t
174MIMX_ACMP::GetFilterPeriod()
175 { return (cmp.C0 & CMP_C0_FPR_MASK) >> CMP_C0_FPR_SHIFT; }
176
177inline uint8_t
178MIMX_ACMP::GetFilterCount()
179 { return (cmp.C0 & CMP_C0_FILTER_CNT_MASK) >> CMP_C0_FILTER_CNT_SHIFT; }
180
181inline bool
182MIMX_ACMP::GetState()
183 { return (cmp.C0 & CMP_C0_COUT_MASK) != 0; }
184
185
186#endif /* ----- #ifndef __MIMX11XX_ACMP_H ----- */