1#ifndef __MIMX11XX_ACMP_H
2#define __MIMX11XX_ACMP_H
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
17 typedef void (*IrqHandler_t)(MIMX_ACMP &, uint32_t status);
18 enum class eFastClock : uint8_t {
28 enum class eHyst : uint8_t {
35 enum class eSamplePeriod : uint8_t {
47 static IrqHandler_t irqCb[];
51 static void sIrqHandler();
54 MIMX_ACMP(CMP_Type *acmp);
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);
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);
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);
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();
93 { cmp.C0 |= CMP_C0_EN(1); }
97 { cmp.C0 &= ~CMP_C0_EN_MASK; }
100MIMX_ACMP::SetInputs(uint8_t PosCh, uint8_t NegCh)
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);
107MIMX_ACMP::SetPosInput(uint8_t ch)
108 { cmp.C1 = (cmp.C1 & ~CMP_C1_PSEL_MASK) | CMP_C1_PSEL((ch & 0xF)+1); }
111MIMX_ACMP::SetNegInput(uint8_t ch)
112 { cmp.C1 = (cmp.C1 & ~CMP_C1_MSEL_MASK) | CMP_C1_MSEL((ch & 0xF)+1); }
115MIMX_ACMP::GetPosInput()
116 {
return ((cmp.C1 & CMP_C1_PSEL_MASK)>>CMP_C1_PSEL_SHIFT)-1; }
119MIMX_ACMP::GetNegInput()
120 {
return ((cmp.C1 & CMP_C1_MSEL_MASK)>>CMP_C1_MSEL_SHIFT)-1; }
123MIMX_ACMP::SetDacVal(uint8_t dacVal)
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);
130MIMX_ACMP::GetDacVal()
131 {
return ((cmp.C1 & CMP_C1_VOSEL_MASK) >> CMP_C1_VOSEL_SHIFT); }
134MIMX_ACMP::SetOutputPolarity(
int pol)
135 { (pol < 0) ? (cmp.C0 |= CMP_C0_INVT_MASK) : (cmp.C0 &= ~CMP_C0_INVT_MASK); }
138MIMX_ACMP::GetOutputPolarity()
139 {
return (cmp.C0 & CMP_C0_INVT_MASK) ? -1 : 1; }
142MIMX_ACMP::EnableIrq(
bool falling,
bool rising)
143 { cmp.C0 |= (falling ? CMP_C0_IEF_MASK : 0) | (rising ? CMP_C0_IER_MASK : 0); }
146MIMX_ACMP::DisableIrq(
bool falling,
bool rising)
147 { cmp.C0 &= ~((falling ? CMP_C0_IEF_MASK : 0) | (rising ? CMP_C0_IER_MASK : 0)); }
150MIMX_ACMP::SetFilter(uint8_t period, uint8_t count)
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);
158MIMX_ACMP::SetFilterPeriod(uint8_t period)
160 cmp.C0 = (cmp.C0 & ~(CMP_C0_FPR_MASK | CMP_C0_COS_MASK))
162 | CMP_C0_COS(!period || !(cmp.C0 & CMP_C0_FILTER_CNT_MASK));
166MIMX_ACMP::SetFilterCount(uint8_t count)
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));
174MIMX_ACMP::GetFilterPeriod()
175 {
return (cmp.C0 & CMP_C0_FPR_MASK) >> CMP_C0_FPR_SHIFT; }
178MIMX_ACMP::GetFilterCount()
179 {
return (cmp.C0 & CMP_C0_FILTER_CNT_MASK) >> CMP_C0_FILTER_CNT_SHIFT; }
183 {
return (cmp.C0 & CMP_C0_COUT_MASK) != 0; }