1 /**************************************************************************//**
2  * @file     opa.h
3  * @version  V3.00
4  * @brief    M2L31 series OPA driver header file
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  * @copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
8  *****************************************************************************/
9 #ifndef __OPA_H__
10 #define __OPA_H__
11 
12 #ifdef __cplusplus
13 extern "C"
14 {
15 #endif
16 
17 
18 /** @addtogroup Standard_Driver Standard Driver
19   @{
20 */
21 
22 /** @addtogroup OPA_Driver OPA Driver
23   @{
24 */
25 
26 /** @addtogroup OPA_EXPORTED_CONSTANTS OPA Exported Constants
27   @{
28 */
29 #define OPA_MODE_POSCHEN_DISABLE        (0x00UL << OPA_MODE_POSCHEN_Pos)
30 #define OPA_MODE_POSCHEN_P0             (0x01UL << OPA_MODE_POSCHEN_Pos)
31 #define OPA_MODE_POSCHEN_P1             (0x02UL << OPA_MODE_POSCHEN_Pos)
32 #define OPA_MODE_POSCHEN_DAC0_OUT       (0x04UL << OPA_MODE_POSCHEN_Pos)
33 #define OPA_MODE_POSCHEN_DAC1_OUT       (0x08UL << OPA_MODE_POSCHEN_Pos)
34 #define OPA_MODE_POSCHEN_OPA1_INT_OUT   (0x10UL << OPA_MODE_POSCHEN_Pos)
35 #define OPA_MODE_POSCHEN_OPA0_INT_OUT   (0x10UL << OPA_MODE_POSCHEN_Pos)
36 
37 #define OPA_MODE_NEGCHEN_DISABLE        (0x00UL << OPA_MODE_NEGCHEN_Pos)
38 #define OPA_MODE_NEGCHEN_N0             (0x01UL << OPA_MODE_NEGCHEN_Pos)
39 #define OPA_MODE_NEGCHEN_N1             (0x02UL << OPA_MODE_NEGCHEN_Pos)
40 #define OPA_MODE_NEGCHEN_OPA1_INT_OUT   (0x04UL << OPA_MODE_NEGCHEN_Pos)
41 #define OPA_MODE_NEGCHEN_OPA0_INT_OUT   (0x04UL << OPA_MODE_NEGCHEN_Pos)
42 #define OPA_MODE_NEGCHEN_VF_INT         (0x08UL << OPA_MODE_NEGCHEN_Pos)
43 
44 #define OPA_MODE_SWSEL_N0               (0x0UL << OPA_MODE_SWSEL_Pos)
45 #define OPA_MODE_SWSEL_AVSS             (0x1UL << OPA_MODE_SWSEL_Pos)
46 #define OPA_MODE_SWSEL_OPA1_INT_OUT     (0x2UL << OPA_MODE_SWSEL_Pos)
47 #define OPA_MODE_SWSEL_OPA0_INT_OUT     (0x2UL << OPA_MODE_SWSEL_Pos)
48 
49 #define OPA_CALIBRATION_CLK_1K          (0UL)   /*!< OPA calibration clock select 1 KHz  \hideinitializer */
50 #define OPA_CALIBRATION_RV_1_2_AVDD     (0UL)   /*!< OPA calibration reference voltage select 1/2 AVDD  \hideinitializer */
51 #define OPA_CALIBRATION_RV_H_L_VCM      (1UL)   /*!< OPA calibration reference voltage select from high vcm to low vcm \hideinitializer */
52 
53 typedef enum {
54     OPA_OPEN_LOOP = 0,
55     OPA_GAIN_1,
56     OPA_GAIN_2,
57     OPA_GAIN_4,
58     OPA_GAIN_8,
59     OPA_GAIN_16,
60     OPA_GAIN_32,
61     OPA_GAIN_RESERVED
62 } E_NONINVERTING_GAIN;
63 
64 typedef enum {
65     OPA_GAIN_MINUS_1 = 2,
66     OPA_GAIN_MINUS_3,
67     OPA_GAIN_MINUS_7,
68     OPA_GAIN_MINUS_15,
69     OPA_GAIN_MINUS_31,
70     OPA_GAIN_MINUS_RESERVED
71 } E_INVERTING_GAIN;
72 
73 /*@}*/ /* end of group OPA_EXPORTED_CONSTANTS */
74 
75 /** @addtogroup OPA_EXPORTED_FUNCTIONS OPA Exported Functions
76   @{
77 */
78 
79 /*---------------------------------------------------------------------------------------------------------*/
80 /* Define OPA functions prototype                                                                         */
81 /*---------------------------------------------------------------------------------------------------------*/
82 __STATIC_INLINE int32_t OPA_Calibration(OPA_T *opa, uint32_t u32OpaNum, uint32_t u32ClockSel, uint32_t u32LevelSel);
83 
84 /**
85   * @brief This macro is used to power on the OPA circuit
86   * @param[in] opa The pointer of the specified OPA module
87   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
88   * @return None
89   * @details This macro will set OPx_EN (x=0,1,2) bit of OPACR register to power on the OPA circuit.
90   * @note Remember to enable HIRC clock while power on the OPA circuit.
91   * \hideinitializer
92   */
93 #define OPA_POWER_ON(opa, u32OpaNum) ((opa)->CTL |= (1UL<<(OPA_CTL_OPEN0_Pos+(u32OpaNum))))
94 
95 /**
96   * @brief This macro is used to power down the OPA circuit
97   * @param[in] opa The pointer of the specified OPA module
98   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
99   * @return None
100   * @details This macro will clear OPx_EN (x=0,1,2) bit of OPACR register to power down the OPA circuit.
101   * \hideinitializer
102   */
103 #define OPA_POWER_DOWN(opa, u32OpaNum) ((opa)->CTL &= ~(1UL<<(OPA_CTL_OPEN0_Pos+(u32OpaNum))))
104 
105 /**
106   * @brief This macro is used to enable the OPA Schmitt trigger buffer
107   * @param[in] opa The pointer of the specified OPA module
108   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
109   * @return None
110   * @details This macro will set OPSCHx_EN (x=0,1,2) bit of OPACR register to enable the OPA Schmitt trigger buffer.
111   * \hideinitializer
112   */
113 #define OPA_ENABLE_SCH_TRIGGER(opa, u32OpaNum) ((opa)->CTL |= (1UL<<(OPA_CTL_OPDOEN0_Pos+(u32OpaNum))))
114 
115 /**
116   * @brief This macro is used to disable the OPA Schmitt trigger buffer
117   * @param[in] opa The pointer of the specified OPA module
118   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
119   * @return None
120   * @details This macro will clear OPSCHx_EN (x=0,1,2) bit of OPACR register to disable the OPA Schmitt trigger buffer.
121   * \hideinitializer
122   */
123 #define OPA_DISABLE_SCH_TRIGGER(opa, u32OpaNum) ((opa)->CTL &= ~(1UL<<(OPA_CTL_OPDOEN0_Pos+(u32OpaNum))))
124 
125 /**
126   * @brief This macro is used to enable OPA Schmitt trigger digital output interrupt
127   * @param[in] opa The pointer of the specified OPA module
128   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
129   * @return None
130   * @details This macro will set OPDIEx (x=0,1,2) bit of OPACR register to enable the OPA Schmitt trigger digital output interrupt.
131   * \hideinitializer
132   */
133 #define OPA_ENABLE_INT(opa, u32OpaNum) ((opa)->CTL |= (1UL<<(OPA_CTL_OPDOIEN0_Pos+(u32OpaNum))))
134 
135 /**
136   * @brief This macro is used to disable OPA Schmitt trigger digital output interrupt
137   * @param[in] opa The pointer of the specified OPA module
138   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
139   * @return None
140   * @details This macro will clear OPDIEx (x=0,1,2) bit of OPACR register to disable the OPA Schmitt trigger digital output interrupt.
141   * \hideinitializer
142   */
143 #define OPA_DISABLE_INT(opa, u32OpaNum) ((opa)->CTL &= ~(1UL<<(OPA_CTL_OPDOIEN0_Pos+(u32OpaNum))))
144 
145 /**
146   * @brief This macro is used to enable OPA output
147   * @param[in] opa The pointer of the specified OPA module
148   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
149   * @return None
150   * @details This macro will set OUTOE bit of OPA_MODE register to enable the OPA output.
151   * \hideinitializer
152   */
153 #define OPA_ENABLE_OUTPUT(opa, u32OpaNum) *((__IO uint32_t *) (&((opa)->MODE0) + u32OpaNum)) |= OPA_MODE_OUTOE_Msk
154 
155 /**
156   * @brief This macro is used to enable OPA output
157   * @param[in] opa The pointer of the specified OPA module
158   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
159   * @return None
160   * @details This macro will clear OUTOE bit of OPA_MODE register to disable the OPA output.
161   * \hideinitializer
162   */
163 #define OPA_DISABLE_OUTPUT(opa, u32OpaNum) *((__IO uint32_t *) (&((opa)->MODE0) + u32OpaNum)) &= (~OPA_MODE_OUTOE_Msk)
164 
165 /**
166   * @brief This macro is used to get OPA digital output state
167   * @param[in] opa The pointer of the specified OPA module
168   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
169   * @return  OPA digital output state
170   * @details This macro will return the OPA digital output value.
171   * \hideinitializer
172   */
173 #define OPA_GET_DIGITAL_OUTPUT(opa, u32OpaNum) (((opa)->STATUS & (OPA_STATUS_OPDO0_Msk<<(u32OpaNum)))?1UL:0UL)
174 
175 /**
176   * @brief This macro is used to set OPA gain
177   * @param[in] opa The pointer of the specified OPA module
178   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
179   * @return None
180   * @details This macro will set OPA gain.
181   * \hideinitializer
182   */
183 #define OPA_SET_GAIN(opa, u32OpaNum, opa_gain) *((__IO uint32_t *) (&((opa)->MODE0) + u32OpaNum)) = (*((__IO uint32_t *) (&((opa)->MODE0) + u32OpaNum))&(~OPA_MODE_GAIN_Msk)) | (opa_gain << OPA_MODE_GAIN_Pos)
184 
185 /**
186   * @brief This macro is used to get OPA interrupt flag
187   * @param[in] opa The pointer of the specified OPA module
188   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
189   * @retval     0 OPA interrupt does not occur.
190   * @retval     1 OPA interrupt occurs.
191   * @details This macro will return the OPA interrupt flag.
192   * \hideinitializer
193   */
194 #define OPA_GET_INT_FLAG(opa, u32OpaNum) (((opa)->STATUS & (OPA_STATUS_OPDOIF0_Msk<<(u32OpaNum)))?1UL:0UL)
195 
196 /**
197   * @brief This macro is used to clear OPA interrupt flag
198   * @param[in] opa The pointer of the specified OPA module
199   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
200   * @return   None
201   * @details This macro will write 1 to OPDFx (x=0,1,2) bit of OPASR register to clear interrupt flag.
202   * \hideinitializer
203   */
204 #define OPA_CLR_INT_FLAG(opa, u32OpaNum) ((opa)->STATUS = (OPA_STATUS_OPDOIF0_Msk<<(u32OpaNum)))
205 
206 
207 /**
208   * @brief This function is used to configure and start OPA calibration
209   * @param[in] opa The pointer of the specified OPA module
210   * @param[in] u32OpaNum The OPA number. 0 for OPA0; 1 for OPA1; 2 for OPA2.
211   * @param[in] u32ClockSel Select OPA calibration clock
212   *                 - \ref OPA_CALIBRATION_CLK_1K
213   * @param[in] u32RefVol Select OPA reference voltage
214   *                 - \ref OPA_CALIBRATION_RV_1_2_AVDD
215   *                 - \ref OPA_CALIBRATION_RV_H_L_VCM
216   * @retval      0 PMOS and NMOS calibration successfully.
217   * @retval     -1 only PMOS calibration failed.
218   * @retval     -2 only NMOS calibration failed.
219   * @retval     -3 PMOS and NMOS calibration failed.
220   */
OPA_Calibration(OPA_T * opa,uint32_t u32OpaNum,uint32_t u32ClockSel,uint32_t u32RefVol)221 __STATIC_INLINE int32_t OPA_Calibration(OPA_T *opa,
222                                         uint32_t u32OpaNum,
223                                         uint32_t u32ClockSel,
224                                         uint32_t u32RefVol)
225 {
226     uint32_t u32CALResult;
227     int32_t i32Ret = 0L;
228 
229     (opa)->CALCTL = (((opa)->CALCTL) & ~(OPA_CALCTL_CALCLK0_Msk << (u32OpaNum << 1)));
230     (opa)->CALCTL = (((opa)->CALCTL) & ~(OPA_CALCTL_CALRVS0_Msk << (u32OpaNum))) | (((u32RefVol) << OPA_CALCTL_CALRVS0_Pos) << (u32OpaNum));
231     (opa)->CALCTL |= (OPA_CALCTL_CALTRG0_Msk << (u32OpaNum));
232     while((opa)->CALCTL & (OPA_CALCTL_CALTRG0_Msk << (u32OpaNum))) {}
233 
234     u32CALResult = ((opa)->CALST >> ((u32OpaNum)*4U)) & (OPA_CALST_CALNS0_Msk|OPA_CALST_CALPS0_Msk);
235     if (u32CALResult == 0U)
236     {
237         i32Ret = 0L;
238     }
239     else if (u32CALResult == OPA_CALST_CALNS0_Msk)
240     {
241         i32Ret = -2L;
242     }
243     else if (u32CALResult == OPA_CALST_CALPS0_Msk)
244     {
245         i32Ret = -1L;
246     }
247     else if (u32CALResult == (OPA_CALST_CALNS0_Msk|OPA_CALST_CALPS0_Msk))
248     {
249         i32Ret = -3L;
250     }
251 
252     return i32Ret;
253 }
254 
255 /**
256   * @brief This macro is used to generate asynchronous reset signals to OPA controller
257   * @param    None
258   * @return   None
259   * \hideinitializer
260   */
261 #define OPA_Reset() \
262 do { \
263     LPSCC->IPRST0 |= (LPSCC_IPRST0_OPARST_Msk); \
264     LPSCC->IPRST0 &= ~(LPSCC_IPRST0_OPARST_Msk); \
265 } while(0)
266 
267 /*@}*/ /* end of group OPA_EXPORTED_FUNCTIONS */
268 
269 /*@}*/ /* end of group OPA_Driver */
270 
271 /*@}*/ /* end of group Standard_Driver */
272 
273 #ifdef __cplusplus
274 }
275 #endif
276 
277 #endif /* __OPA_H__ */
278 
279 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
280