1 /**************************************************************************//** 2 * @file eqei.h 3 * @version V3.00 4 * @brief Enhanced Quadrature Encoder Interface (EQEI) driver header file 5 * 6 * SPDX-License-Identifier: Apache-2.0 7 * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved. 8 *****************************************************************************/ 9 #ifndef __EQEI_H__ 10 #define __EQEI_H__ 11 12 #ifdef __cplusplus 13 extern "C" 14 { 15 #endif 16 17 18 /** @addtogroup Standard_Driver Standard Driver 19 @{ 20 */ 21 22 /** @addtogroup EQEI_Driver EQEI Driver 23 @{ 24 */ 25 26 /** @addtogroup EQEI_EXPORTED_CONSTANTS EQEI Exported Constants 27 @{ 28 */ 29 30 /*---------------------------------------------------------------------------------------------------------*/ 31 /* EQEI counting mode selection constants definitions */ 32 /*---------------------------------------------------------------------------------------------------------*/ 33 #define EQEI_CTL_X4_FREE_COUNTING_MODE (0x0<<EQEI_CTL_MODE_Pos) /*!<EQEI operate in X4 free-counting mode \hideinitializer */ 34 #define EQEI_CTL_X2_FREE_COUNTING_MODE (0x1<<EQEI_CTL_MODE_Pos) /*!<EQEI operate in X2 free-counting mode \hideinitializer */ 35 #define EQEI_CTL_X4_COMPARE_COUNTING_MODE (0x2<<EQEI_CTL_MODE_Pos) /*!<EQEI operate in X4 compare-counting mode \hideinitializer */ 36 #define EQEI_CTL_X2_COMPARE_COUNTING_MODE (0x3<<EQEI_CTL_MODE_Pos) /*!<EQEI operate in X2 compare-counting mode \hideinitializer */ 37 #define EQEI_CTL_PHASE_COUNTING_MODE_TYPE1 (0x4<<EQEI_CTL_MODE_Pos) /*!<EQEI operate in phase counting mode type 1 \hideinitializer */ 38 #define EQEI_CTL_PHASE_COUNTING_MODE_TYPE2 (0x5<<EQEI_CTL_MODE_Pos) /*!<EQEI operate in phase counting mode type 1 \hideinitializer */ 39 #define EQEI_CTL_DIRECTIONAL_COUNTING_MODE (0x6<<EQEI_CTL_MODE_Pos) /*!<EQEI operate in directional counting mode \hideinitializer */ 40 41 /*---------------------------------------------------------------------------------------------------------*/ 42 /* EQEI noise filter clock pre-divide selection constants definitions */ 43 /*---------------------------------------------------------------------------------------------------------*/ 44 #define EQEI_CTL_NFCLKSEL_DIV1 (0x0<<EQEI_CTL_NFCLKSEL_Pos) /*!< The sampling frequency of the noise filter is EQEI_CLK \hideinitializer */ 45 #define EQEI_CTL_NFCLKSEL_DIV2 (0x1<<EQEI_CTL_NFCLKSEL_Pos) /*!< The sampling frequency of the noise filter is EQEI_CLK/2 \hideinitializer */ 46 #define EQEI_CTL_NFCLKSEL_DIV4 (0x2<<EQEI_CTL_NFCLKSEL_Pos) /*!< The sampling frequency of the noise filter is EQEI_CLK/4 \hideinitializer */ 47 #define EQEI_CTL_NFCLKSEL_DIV16 (0x3<<EQEI_CTL_NFCLKSEL_Pos) /*!< The sampling frequency of the noise filter is EQEI_CLK/16 \hideinitializer */ 48 #define EQEI_CTL_NFCLKSEL_DIV32 (0x4<<EQEI_CTL_NFCLKSEL_Pos) /*!< The sampling frequency of the noise filter is EQEI_CLK/32 \hideinitializer */ 49 #define EQEI_CTL_NFCLKSEL_DIV64 (0x5<<EQEI_CTL_NFCLKSEL_Pos) /*!< The sampling frequency of the noise filter is EQEI_CLK/64 \hideinitializer */ 50 51 /*---------------------------------------------------------------------------------------------------------*/ 52 /* EQEI Clock Rate Setting without Quadrature Mode definitions */ 53 /*---------------------------------------------------------------------------------------------------------*/ 54 #define EQEI_CTL2_X1_COUNT_FALLING (0x0<<EQEI_CTL2_CRS_Pos) /*!<EQEI counter only counts the falling edge \hideinitializer */ 55 #define EQEI_CTL2_X1_COUNT_RISING (0x1<<EQEI_CTL2_CRS_Pos) /*!<EQEI counter only counts the rising edge \hideinitializer */ 56 #define EQEI_CTL2_X2_COUNT_FALLING_AND_RISING (0x2<<EQEI_CTL2_CRS_Pos) /*!<EQEI counter counts the rising and falling edge \hideinitializer */ 57 58 /*---------------------------------------------------------------------------------------------------------*/ 59 /* EQEI Direction Signal Source Select definitions */ 60 /*---------------------------------------------------------------------------------------------------------*/ 61 #define EQEI_CTL2_DIRCTION_FROM_EQEI_CALC (0x0<<EQEI_CTL2_DIRSRC_Pos) /*!<Direction signal is determined from EQEI system calculation \hideinitializer */ 62 #define EQEI_CTL2_DIRCTION_TIED_HIGH (0x2<<EQEI_CTL2_DIRSRC_Pos) /*!<Direction signal is tied 1 only for direction up count mode \hideinitializer */ 63 #define EQEI_CTL2_DIRCTION_TIED_LOW (0x3<<EQEI_CTL2_DIRSRC_Pos) /*!<Direction signal is tied 0 only for direction down count mode \hideinitializer */ 64 65 /*@}*/ /* end of group EQEI_EXPORTED_CONSTANTS */ 66 67 68 /** @addtogroup EQEI_EXPORTED_FUNCTIONS EQEI Exported Functions 69 @{ 70 */ 71 72 /** 73 * @brief Disable EQEI compare function 74 * @param[in] eqei The pointer of the specified EQEI module. 75 * @return None 76 * @details This macro disable EQEI counter compare function. 77 * \hideinitializer 78 */ 79 #define EQEI_DISABLE_CNT_CMP(eqei) ((eqei)->CTL &= (~EQEI_CTL_CMPEN_Msk)) 80 81 /** 82 * @brief Enable EQEI compare function 83 * @param[in] eqei The pointer of the specified EQEI module. 84 * @return None 85 * @details This macro enable EQEI counter compare function. 86 * \hideinitializer 87 */ 88 #define EQEI_ENABLE_CNT_CMP(eqei) ((eqei)->CTL |= EQEI_CTL_CMPEN_Msk) 89 90 /** 91 * @brief Disable EQEI index latch function 92 * @param[in] eqei The pointer of the specified EQEI module. 93 * @return None 94 * @details This macro disable EQEI index trigger counter latch function. 95 * \hideinitializer 96 */ 97 #define EQEI_DISABLE_INDEX_LATCH(eqei) ((eqei)->CTL &= (~EQEI_CTL_IDXLATEN_Msk)) 98 99 /** 100 * @brief Enable EQEI index latch function 101 * @param[in] eqei The pointer of the specified EQEI module. 102 * @return None 103 * @details This macro enable EQEI index trigger counter latch function. 104 * \hideinitializer 105 */ 106 #define EQEI_ENABLE_INDEX_LATCH(eqei) ((eqei)->CTL |= EQEI_CTL_IDXLATEN_Msk) 107 108 /** 109 * @brief Disable EQEI index reload function 110 * @param[in] eqei The pointer of the specified EQEI module. 111 * @return None 112 * @details This macro disable EQEI index trigger counter reload function. 113 * \hideinitializer 114 */ 115 #define EQEI_DISABLE_INDEX_RELOAD(eqei) ((eqei)->CTL &= (~EQEI_CTL_IDXRLDEN_Msk)) 116 117 /** 118 * @brief Enable EQEI index reload function 119 * @param[in] eqei The pointer of the specified EQEI module. 120 * @return None 121 * @details This macro enable EQEI index trigger counter reload function. 122 * \hideinitializer 123 */ 124 #define EQEI_ENABLE_INDEX_RELOAD(eqei) ((eqei)->CTL |= EQEI_CTL_IDXRLDEN_Msk) 125 126 /** 127 * @brief Disable EQEI input 128 * @param[in] eqei The pointer of the specified EQEI module. 129 * @param[in] u32InputType Input signal type. 130 * - \ref EQEI_CTL_CHAEN_Msk : QEA input 131 * - \ref EQEI_CTL_CHAEN_Msk : QEB input 132 * - \ref EQEI_CTL_IDXEN_Msk : IDX input 133 * @return None 134 * @details This macro disable specified EQEI signal input. 135 * \hideinitializer 136 */ 137 #define EQEI_DISABLE_INPUT(eqei, u32InputType) ((eqei)->CTL &= ~(u32InputType)) 138 139 /** 140 * @brief Enable EQEI input 141 * @param[in] eqei The pointer of the specified EQEI module. 142 * @param[in] u32InputType Input signal type . 143 * - \ref EQEI_CTL_CHAEN_Msk : QEA input 144 * - \ref EQEI_CTL_CHBEN_Msk : QEB input 145 * - \ref EQEI_CTL_IDXEN_Msk : IDX input 146 * @return None 147 * @details This macro enable specified EQEI signal input. 148 * \hideinitializer 149 */ 150 #define EQEI_ENABLE_INPUT(eqei, u32InputType) ((eqei)->CTL |= (u32InputType)) 151 152 /** 153 * @brief Disable inverted input polarity 154 * @param[in] eqei The pointer of the specified EQEI module. 155 * @param[in] u32InputType Input signal type . 156 * - \ref EQEI_CTL_CHAINV_Msk : QEA Input 157 * - \ref EQEI_CTL_CHBINV_Msk : QEB Input 158 * - \ref EQEI_CTL_IDXINV_Msk : IDX Input 159 * @return None 160 * @details This macro disable specified EQEI signal inverted input polarity. 161 * \hideinitializer 162 */ 163 #define EQEI_DISABLE_INPUT_INV(eqei, u32InputType) ((eqei)->CTL &= ~(u32InputType)) 164 165 /** 166 * @brief Enable inverted input polarity 167 * @param[in] eqei The pointer of the specified EQEI module. 168 * @param[in] u32InputType Input signal type. 169 * - \ref EQEI_CTL_CHAINV_Msk : QEA Input 170 * - \ref EQEI_CTL_CHBINV_Msk : QEB Input 171 * - \ref EQEI_CTL_IDXINV_Msk : IDX Input 172 * @return None 173 * @details This macro inverse specified EQEI signal input polarity. 174 * \hideinitializer 175 */ 176 #define EQEI_ENABLE_INPUT_INV(eqei, u32InputType) ((qei)->CTL |= (u32InputType)) 177 178 /** 179 * @brief Disable EQEI interrupt 180 * @param[in] eqei The pointer of the specified EQEI module. 181 * @param[in] u32IntSel Interrupt type selection. 182 * - \ref EQEI_CTL_DIRIEN_Msk : Direction change interrupt 183 * - \ref EQEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt 184 * - \ref EQEI_CTL_CMPIEN_Msk : Compare-match interrupt 185 * - \ref EQEI_CTL_IDXIEN_Msk : Index detected interrupt 186 * @return None 187 * @details This macro disable specified EQEI interrupt. 188 * \hideinitializer 189 */ 190 #define EQEI_DISABLE_INT(eqei, u32IntSel) ((eqei)->CTL &= ~(u32IntSel)) 191 192 /** 193 * @brief Enable EQEI interrupt 194 * @param[in] eqei The pointer of the specified EQEI module. 195 * @param[in] u32IntSel Interrupt type selection. 196 * - \ref EQEI_CTL_DIRIEN_Msk : Direction change interrupt 197 * - \ref EQEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt 198 * - \ref EQEI_CTL_CMPIEN_Msk : Compare-match interrupt 199 * - \ref EQEI_CTL_IDXIEN_Msk : Index detected interrupt 200 * @return None 201 * @details This macro enable specified EQEI interrupt. 202 * \hideinitializer 203 */ 204 #define EQEI_ENABLE_INT(eqei, u32IntSel) ((eqei)->CTL |= (u32IntSel)) 205 206 /** 207 * @brief Disable EQEI noise filter 208 * @param[in] eqei The pointer of the specified EQEI module. 209 * @return None 210 * @details This macro disable EQEI noise filter function. 211 * \hideinitializer 212 */ 213 #define EQEI_DISABLE_NOISE_FILTER(eqei) ((eqei)->CTL |= EQEI_CTL_NFDIS_Msk) 214 215 /** 216 * @brief Enable EQEI noise filter 217 * @param[in] eqei The pointer of the specified EQEI module. 218 * @param[in] u32ClkSel The sampling frequency of the noise filter clock. 219 * - \ref EQEI_CTL_NFCLKSEL_DIV1 220 * - \ref EQEI_CTL_NFCLKSEL_DIV2 221 * - \ref EQEI_CTL_NFCLKSEL_DIV4 222 * - \ref EQEI_CTL_NFCLKSEL_DIV16 223 * - \ref EQEI_CTL_NFCLKSEL_DIV32 224 * - \ref EQEI_CTL_NFCLKSEL_DIV64 225 * @return None 226 * @details This macro enable EQEI noise filter function and select noise filter clock. 227 * \hideinitializer 228 */ 229 #define EQEI_ENABLE_NOISE_FILTER(eqei, u32ClkSel) ((eqei)->CTL = ((eqei)->CTL & (~(EQEI_CTL_NFDIS_Msk|EQEI_CTL_NFCLKSEL_Msk))) | (u32ClkSel)) 230 231 /** 232 * @brief Get EQEI counter value 233 * @param[in] eqei The pointer of the specified EQEI module. 234 * @return EQEI pulse counter register value. 235 * @details This macro get EQEI pulse counter value. 236 * \hideinitializer 237 */ 238 #define EQEI_GET_CNT_VALUE(eqei) ((eqei)->CNT) 239 240 /** 241 * @brief Get EQEI counting direction 242 * @param[in] eqei The pointer of the specified EQEI module. 243 * @retval 0 EQEI counter is in down-counting. 244 * @retval 1 EQEI counter is in up-counting. 245 * @details This macro get EQEI counting direction. 246 * \hideinitializer 247 */ 248 #define EQEI_GET_DIR(eqei) (((eqei)->STATUS & (EQEI_STATUS_DIRF_Msk))?1:0) 249 250 /** 251 * @brief Get EQEI counter hold value 252 * @param[in] eqei The pointer of the specified EQEI module. 253 * @return EQEI pulse counter hold register value. 254 * @details This macro get EQEI pulse counter hold value, which is updated with counter value in hold counter value control. 255 * \hideinitializer 256 */ 257 #define EQEI_GET_HOLD_VALUE(eqei) ((eqei)->CNTHOLD) 258 259 /** 260 * @brief Get EQEI counter index latch value 261 * @param[in] eqei The pointer of the specified EQEI module. 262 * @return EQEI pulse counter index latch value 263 * @details This macro get EQEI pulse counter index latch value, which is updated with counter value when the index is detected. 264 * \hideinitializer 265 */ 266 #define EQEI_GET_INDEX_LATCH_VALUE(eqei) ((eqei)->CNTLATCH) 267 268 /** 269 * @brief Set EQEI counter index latch value 270 * @param[in] eqei The pointer of the specified EQEI module. 271 * @param[in] u32Val The latch value. 272 * @return EQEI pulse counter index latch value 273 * @details This macro set EQEI pulse counter index latch value, which is updated with counter value when the index is detected. 274 * \hideinitializer 275 */ 276 #define EQEI_SET_INDEX_LATCH_VALUE(eqei,u32Val) ((eqei)->CNTLATCH = (u32Val)) 277 278 /** 279 * @brief Get EQEI interrupt flag status 280 * @param[in] eqei The pointer of the specified EQEI module. 281 * @param[in] u32IntSel Interrupt type selection. 282 * - \ref EQEI_STATUS_DIRF_Msk : Counting direction flag 283 * - \ref EQEI_STATUS_DIRCHGF_Msk : Direction change flag 284 * - \ref EQEI_STATUS_OVUNF_Msk : Counter overflow or underflow flag 285 * - \ref EQEI_STATUS_CMPF_Msk : Compare-match flag 286 * - \ref EQEI_STATUS_IDXF_Msk : Index detected flag 287 * @retval 0 EQEI specified interrupt flag is not set. 288 * @retval 1 EQEI specified interrupt flag is set. 289 * @details This macro get EQEI specified interrupt flag status. 290 * \hideinitializer 291 */ 292 #define EQEI_GET_INT_FLAG(eqei, u32IntSel) (((eqei)->STATUS & (u32IntSel))?1:0) 293 294 295 /** 296 * @brief Clear EQEI interrupt flag 297 * @param[in] eqei The pointer of the specified EQEI module. 298 * @param[in] u32IntSel Interrupt type selection. 299 * - \ref EQEI_STATUS_DIRCHGF_Msk : Direction change flag 300 * - \ref EQEI_STATUS_OVUNF_Msk : Counter overflow or underflow flag 301 * - \ref EQEI_STATUS_CMPF_Msk : Compare-match flag 302 * - \ref EQEI_STATUS_IDXF_Msk : Index detected flag 303 * @return None 304 * @details This macro clear EQEI specified interrupt flag. 305 * \hideinitializer 306 */ 307 #define EQEI_CLR_INT_FLAG(eqei, u32IntSel) ((eqei)->STATUS = (u32IntSel)) 308 309 /** 310 * @brief Set EQEI counter compare value 311 * @param[in] eqei The pointer of the specified EQEI module. 312 * @param[in] u32Value The counter compare value. 313 * @return None 314 * @details This macro set EQEI pulse counter compare value. 315 * \hideinitializer 316 */ 317 #define EQEI_SET_CNT_CMP(eqei, u32Value) ((eqei)->CNTCMP = (u32Value)) 318 319 /** 320 * @brief Set EQEI counter value 321 * @param[in] eqei The pointer of the specified EQEI module. 322 * @param[in] u32Value The counter compare value. 323 * @return None 324 * @details This macro set EQEI pulse counter value. 325 * \hideinitializer 326 */ 327 #define EQEI_SET_CNT_VALUE(eqei, u32Value) ((eqei)->CNT = (u32Value)) 328 329 /** 330 * @brief Enable EQEI counter hold mode 331 * @param[in] eqei The pointer of the specified EQEI module. 332 * @param[in] u32Type The triggered type. 333 * - \ref EQEI_CTL_HOLDCNT_Msk : Hold EQEI_CNT control 334 * - \ref EQEI_CTL_HOLDTMR0_Msk : Hold EQEI_CNT by Timer0 335 * - \ref EQEI_CTL_HOLDTMR1_Msk : Hold EQEI_CNT by Timer1 336 * - \ref EQEI_CTL_HOLDTMR2_Msk : Hold EQEI_CNT by Timer2 337 * - \ref EQEI_CTL_HOLDTMR3_Msk : Hold EQEI_CNT by Timer3 338 * @return None 339 * @details This macro enable EQEI counter hold mode. 340 * \hideinitializer 341 */ 342 #define EQEI_ENABLE_HOLD_TRG_SRC(eqei, u32Type) ((eqei)->CTL |= (u32Type)) 343 344 /** 345 * @brief Disable EQEI counter hold mode 346 * @param[in] eqei The pointer of the specified EQEI module. 347 * @param[in] u32Type The triggered type. 348 * - \ref EQEI_CTL_HOLDCNT_Msk : Hold EQEI_CNT control 349 * - \ref EQEI_CTL_HOLDTMR0_Msk : Hold EQEI_CNT by Timer0 350 * - \ref EQEI_CTL_HOLDTMR1_Msk : Hold EQEI_CNT by Timer1 351 * - \ref EQEI_CTL_HOLDTMR2_Msk : Hold EQEI_CNT by Timer2 352 * - \ref EQEI_CTL_HOLDTMR3_Msk : Hold EQEI_CNT by Timer3 353 * @return None 354 * @details This macro disable EQEI counter hold mode. 355 * \hideinitializer 356 */ 357 #define EQEI_DISABLE_HOLD_TRG_SRC(eqei, u32Type) ((eqei)->CTL &= ~(u32Type)) 358 359 /** 360 * @brief Set EQEI maximum count value 361 * @param[in] eqei The pointer of the specified EQEI module. 362 * @param[in] u32Value The counter maximum value. 363 * @return EQEI maximum count value 364 * @details This macro set EQEI maximum count value. 365 * \hideinitializer 366 */ 367 #define EQEI_SET_CNT_MAX(eqei, u32Value) ((eqei)->CNTMAX = (u32Value)) 368 369 /** 370 * @brief Set EQEI counting mode 371 * @param[in] eqei The pointer of the specified EQEI module. 372 * @param[in] u32Mode EQEI counting mode. 373 * - \ref EQEI_CTL_X4_FREE_COUNTING_MODE 374 * - \ref EQEI_CTL_X2_FREE_COUNTING_MODE 375 * - \ref EQEI_CTL_X4_COMPARE_COUNTING_MODE 376 * - \ref EQEI_CTL_X2_COMPARE_COUNTING_MODE 377 * - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE1 378 * - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE2 379 * - \ref EQEI_CTL_DIRECTIONAL_COUNTING_MODE 380 * @return None 381 * @details This macro set EQEI counting mode. 382 * \hideinitializer 383 */ 384 #define EQEI_SET_CNT_MODE(eqei, u32Mode) ((eqei)->CTL = ((eqei)->CTL & (~EQEI_CTL_MODE_Msk)) | (u32Mode)) 385 386 /** 387 * @brief Set EQEI clock rate setting without quadrature mode 388 * @param[in] eqei The pointer of the specified EQEI module. 389 * @param[in] u32Mode EQEI clock rate setting without quadrature mode. 390 * - \ref EQEI_CTL2_X1_COUNT_FALLING 391 * - \ref EQEI_CTL2_X1_COUNT_RISING 392 * - \ref EQEI_CTL2_X2_COUNT_FALLING_AND_RISING 393 * @return None 394 * @details This macro set EQEI clock rate setting without quadrature mode. 395 * \hideinitializer 396 */ 397 #define EQEI_SET_CRS_MODE(eqei, u32Mode) ((eqei)->CTL2 = ((eqei)->CTL2 & (~EQEI_CTL2_CRS_Msk)) | (u32Mode)) 398 399 /** 400 * @brief Set EQEI direction signal source select 401 * @param[in] eqei The pointer of the specified EQEI module. 402 * @param[in] u32Mode EQEI direction signal source select. 403 * - \ref EQEI_CTL2_DIRCTION_FROM_EQEI_CALC 404 * - \ref EQEI_CTL2_DIRCTION_TIED_HIGH 405 * - \ref EQEI_CTL2_DIRCTION_TIED_LOW 406 * @return None 407 * @details This macro set EQEI direction signal source select. 408 * \hideinitializer 409 */ 410 #define EQEI_SET_DIRSRC_MODE(eqei, u32Mode) ((eqei)->CTL2 = ((eqei)->CTL2 & (~EQEI_CTL2_DIRSRC_Msk)) | (u32Mode)) 411 412 413 414 void EQEI_Close(EQEI_T* eqei); 415 void EQEI_DisableInt(EQEI_T* eqei, uint32_t u32IntSel); 416 void EQEI_EnableInt(EQEI_T* eqei, uint32_t u32IntSel); 417 void EQEI_Open(EQEI_T* eqei, uint32_t u32Mode, uint32_t u32Value); 418 void EQEI_Start(EQEI_T* eqei); 419 void EQEI_Stop(EQEI_T* eqei); 420 421 422 /*@}*/ /* end of group EQEI_EXPORTED_FUNCTIONS */ 423 424 /*@}*/ /* end of group EQEI_Driver */ 425 426 /*@}*/ /* end of group Standard_Driver */ 427 428 #ifdef __cplusplus 429 } 430 #endif 431 432 #endif /* __EQEI_H__ */ 433 434 /*** (C) COPYRIGHT 2021 Nuvoton Technology Corp. ***/ 435