hpm_qeiv2_drv.h 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598
  1. /*
  2. * Copyright (c) 2023-2024 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_QEIV2_DRV_H
  8. #define HPM_QEIV2_DRV_H
  9. #include "hpm_common.h"
  10. #include "hpm_soc_ip_feature.h"
  11. #include "hpm_qeiv2_regs.h"
  12. /**
  13. * @brief QEIV2 driver APIs
  14. * @defgroup qeiv2_interface QEIV2 driver APIs
  15. * @ingroup io_interfaces
  16. * @{
  17. */
  18. #define QEIV2_EVENT_WDOG_FLAG_MASK (1U << 31U) /**< watchdog flag */
  19. #define QEIV2_EVENT_HOME_FLAG_MASK (1U << 30U) /**< home flag */
  20. #define QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK (1U << 29U) /**< postion compare match flag */
  21. #define QEIV2_EVENT_Z_PHASE_FLAG_MASK (1U << 28U) /**< z input flag */
  22. #define QEIV2_EVENT_Z_MISS_FLAG_MASK (1U << 27U) /**< z miss flag */
  23. #define QEIV2_EVENT_WIDTH_TIME_FLAG_MASK (1U << 26U) /**< width time flag */
  24. #define QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK (1U << 25U) /**< postion2 compare match flag */
  25. #define QEIV2_EVENT_DIR_CHG_FLAG_MASK (1U << 24U) /**< direction change flag */
  26. #define QEIV2_EVENT_CYCLE0_FLAG_MASK (1U << 23U) /**< cycle0 flag */
  27. #define QEIV2_EVENT_CYCLE1_FLAG_MASK (1U << 22U) /**< cycle1 flag */
  28. #define QEIV2_EVENT_PULSE0_FLAG_MASK (1U << 21U) /**< pulse0 flag */
  29. #define QEIV2_EVENT_PULSE1_FLAG_MASK (1U << 20U) /**< pulse1 flag */
  30. #define QEIV2_EVENT_HOME2_FLAG_MASK (1U << 19U) /**< home2 flag */
  31. #define QEIV2_EVENT_FAULT_FLAG_MASK (1U << 18U) /**< fault flag */
  32. /**
  33. * @brief qeiv2 work mode
  34. *
  35. */
  36. typedef enum qeiv2_work_mode {
  37. qeiv2_work_mode_abz = 0, /**< Orthogonal decoder mode */
  38. qeiv2_work_mode_pd = 1, /**< Directional (PD) mode */
  39. qeiv2_work_mode_ud = 2, /**< Up and Down (UD) mode */
  40. qeiv2_work_mode_uvw = 3, /**< UVW mode */
  41. qeiv2_work_mode_single = 4, /**< Single-phase mode */
  42. qeiv2_work_mode_sin = 5, /**< Single sinewave mode */
  43. qeiv2_work_mode_sincos = 6, /**< Orthogonal sinewave mode */
  44. } qeiv2_work_mode_t;
  45. /**
  46. * @brief spd and tmr read selection
  47. *
  48. */
  49. typedef enum qeiv2_spd_tmr_content {
  50. qeiv2_spd_tmr_as_spd_tm = 0, /**< spd and timer register as spd and time */
  51. qeiv2_spd_tmr_as_pos_angle = 1, /**< spd and timer register as position and angle */
  52. } qeiv2_spd_tmr_content_t;
  53. /**
  54. * @brief compare match rotate direction
  55. *
  56. */
  57. typedef enum qeiv2_rotate_dir {
  58. qeiv2_rotate_dir_forward = 0,
  59. qeiv2_rotate_dir_reverse = 1,
  60. } qeiv2_rotate_dir_t; /**< compare match rotate direction */
  61. /**
  62. * @brief compare match position direction
  63. *
  64. */
  65. typedef enum qeiv2_position_dir {
  66. qeiv2_pos_dir_decrease = 0,
  67. qeiv2_pos_dir_increase = 1,
  68. } qeiv2_position_dir_t; /**< compare match position direction */
  69. /**
  70. * @brief counting mode of Z-phase counter
  71. *
  72. */
  73. typedef enum qeiv2_z_count_work_mode {
  74. qeiv2_z_count_inc_on_z_input_assert = 0, /**< zcnt will increment or decrement when Z input assert */
  75. qeiv2_z_count_inc_on_phase_count_max = 1, /**< zcnt will increment when phcnt upcount to phmax, decrement when phcnt downcount to 0 */
  76. } qeiv2_z_count_work_mode_t;
  77. /**
  78. * @brief counter type
  79. *
  80. */
  81. typedef enum qeiv2_counter_type {
  82. qeiv2_counter_type_z = 0, /**< Z counter */
  83. qeiv2_counter_type_phase = 1, /**< Phase counter */
  84. qeiv2_counter_type_speed = 2, /**< Speed counter */
  85. qeiv2_counter_type_timer = 3, /**< Timer counter */
  86. } qeiv2_counter_type_t;
  87. /**
  88. * @brief filter mode
  89. *
  90. */
  91. typedef enum qeiv2_filter_mode {
  92. qeiv2_filter_mode_bypass = 0, /**< bypass */
  93. qeiv2_filter_mode_burr = 4, /**< rapid change mode */
  94. qeiv2_filter_mode_delay, /**< delay filter mode */
  95. qeiv2_filter_mode_peak, /**< stable low mode */
  96. qeiv2_filter_mode_valley, /**< stable high mode */
  97. } qeiv2_filter_mode_t;
  98. /**
  99. * @brief filter type
  100. *
  101. */
  102. typedef enum qeiv2_filter_phase {
  103. qeiv2_filter_phase_a = 0, /**< filter phase a */
  104. qeiv2_filter_phase_b, /**< filter phase b */
  105. qeiv2_filter_phase_z, /**< filter phase z */
  106. qeiv2_filter_phase_h, /**< filter phase h */
  107. qeiv2_filter_phase_h2, /**< filter phase h2 */
  108. qeiv2_filter_phase_f, /**< filter phase f */
  109. } qeiv2_filter_phase_t; /**< qeiv2_filter_phase_t */
  110. /**
  111. * @brief uvw position option
  112. *
  113. */
  114. typedef enum qeiv2_uvw_pos_opt {
  115. qeiv2_uvw_pos_opt_current = 0, /**< output exact point position, MMC use this */
  116. qeiv2_uvw_pos_opt_next, /**< output next area position, QEO use this */
  117. } qeiv2_uvw_pos_opt_t;
  118. typedef enum qeiv2_uvw_pos_sel {
  119. qeiv2_uvw_pos_sel_low = 0,
  120. qeiv2_uvw_pos_sel_high,
  121. qeiv2_uvw_pos_sel_edge
  122. } qeiv2_uvw_pos_sel_t; /**< qeiv2_uvw_pos_sel_t */
  123. /**
  124. * @brief qeiv2 uvw position selection
  125. *
  126. */
  127. #define QEIV2_UVW_POS_OPT_CUR_SEL_LOW 0u
  128. #define QEIV2_UVW_POS_OPT_CUR_SEL_HIGH 1u
  129. #define QEIV2_UVW_POS_OPT_CUR_SEL_EDGE 2u
  130. #define QEIV2_UVW_POS_OPT_NEX_SEL_LOW 0u
  131. #define QEIV2_UVW_POS_OPT_NEX_SEL_HIGH 3u
  132. typedef enum qeiv2_uvw_pos_idx {
  133. qeiv2_uvw_pos0 = 0,
  134. qeiv2_uvw_pos1,
  135. qeiv2_uvw_pos2,
  136. qeiv2_uvw_pos3,
  137. qeiv2_uvw_pos4,
  138. qeiv2_uvw_pos5,
  139. } qeiv2_uvw_pos_idx_t; /**< qeiv2_uvw_pos_idx_t */
  140. /**
  141. * @brief phase counter compare match config structure
  142. *
  143. */
  144. typedef struct {
  145. uint32_t phcnt_cmp_value;
  146. bool ignore_rotate_dir;
  147. qeiv2_rotate_dir_t rotate_dir;
  148. bool ignore_zcmp;
  149. uint32_t zcmp_value;
  150. } qeiv2_phcnt_cmp_match_config_t;
  151. /**
  152. * @brief position compare match config structure
  153. *
  154. */
  155. typedef struct {
  156. uint32_t pos_cmp_value;
  157. bool ignore_pos_dir;
  158. qeiv2_position_dir_t pos_dir;
  159. } qeiv2_pos_cmp_match_config_t;
  160. /**
  161. * @brief uvw config structure
  162. */
  163. typedef struct {
  164. qeiv2_uvw_pos_opt_t pos_opt;
  165. qeiv2_uvw_pos_sel_t u_pos_sel[6];
  166. qeiv2_uvw_pos_sel_t v_pos_sel[6];
  167. qeiv2_uvw_pos_sel_t w_pos_sel[6];
  168. uint32_t pos_cfg[6];
  169. } qeiv2_uvw_config_t;
  170. /**
  171. * @brief adc config structure
  172. */
  173. typedef struct {
  174. uint8_t adc_select;
  175. uint8_t adc_channel;
  176. int16_t param0;
  177. int16_t param1;
  178. uint32_t offset;
  179. } qeiv2_adc_config_t;
  180. #ifdef __cplusplus
  181. extern "C" {
  182. #endif
  183. /**
  184. * @brief load phcnt, zcnt, spdcnt and tmrcnt into their read registers
  185. *
  186. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  187. */
  188. static inline void qeiv2_load_counter_to_read_registers(QEIV2_Type *qeiv2_x)
  189. {
  190. qeiv2_x->CR |= QEIV2_CR_READ_MASK;
  191. }
  192. /**
  193. * @brief config z phase counter increment and decrement mode
  194. *
  195. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  196. * @param[in] mode
  197. * @arg 1 zcnt will increment when phcnt upcount to phmax, decrement when phcnt downcount to 0
  198. * @arg 0 zcnt will increment or decrement when Z input assert
  199. */
  200. static inline void qeiv2_config_z_phase_counter_mode(QEIV2_Type *qeiv2_x, qeiv2_z_count_work_mode_t mode)
  201. {
  202. qeiv2_x->CR = (qeiv2_x->CR & ~QEIV2_CR_ZCNTCFG_MASK) | QEIV2_CR_ZCNTCFG_SET(mode);
  203. }
  204. /**
  205. * @brief config phase max value and phase param
  206. *
  207. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  208. * @param[in] phmax maximum phcnt number, phcnt will rollover to 0 when it upcount to phmax
  209. */
  210. static inline void qeiv2_config_phmax_phparam(QEIV2_Type *qeiv2_x, uint32_t phmax)
  211. {
  212. uint32_t tmp;
  213. if (phmax > 0u) {
  214. phmax--;
  215. }
  216. qeiv2_x->PHCFG = QEIV2_PHCFG_PHMAX_SET(phmax);
  217. if (phmax == 0u) {
  218. qeiv2_x->PHASE_PARAM = 0xFFFFFFFFu;
  219. } else {
  220. tmp = (0x80000000u / (phmax + 1u));
  221. tmp <<= 1u;
  222. qeiv2_x->PHASE_PARAM = QEIV2_PHASE_PARAM_PHASE_PARAM_SET(tmp);
  223. }
  224. }
  225. /**
  226. * @brief config phase calibration value trigged by z phase
  227. *
  228. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  229. * @param[in] enable phcnt will set to phidx when Z input assert
  230. * @param[in] phidx phcnt reset value
  231. * @param[in] mode qeiv2_work_mode_t
  232. */
  233. static inline void qeiv2_config_z_phase_calibration(QEIV2_Type *qeiv2_x, uint32_t phidx, bool enable, qeiv2_work_mode_t mode)
  234. {
  235. uint32_t tmp = qeiv2_x->CR;
  236. qeiv2_x->PHIDX = QEIV2_PHIDX_PHIDX_SET(phidx);
  237. if (enable) {
  238. tmp |= QEIV2_CR_PHCALIZ_MASK;
  239. } else {
  240. tmp &= ~QEIV2_CR_PHCALIZ_MASK;
  241. }
  242. if (enable && ((mode == qeiv2_work_mode_sin) || (mode == qeiv2_work_mode_sincos))) {
  243. tmp |= QEIV2_CR_Z_ONLY_EN_MASK;
  244. } else {
  245. tmp &= ~QEIV2_CR_Z_ONLY_EN_MASK;
  246. }
  247. qeiv2_x->CR = tmp;
  248. }
  249. /**
  250. * @brief pause counter when pause assert
  251. *
  252. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  253. * @param[in] counter_mask
  254. * @arg QEIV2_CR_PAUSEPOS_MASK
  255. * @arg QEIV2_CR_PAUSESPD_MASK
  256. * @arg QEIV2_CR_PAUSEPH_MASK
  257. * @arg QEIV2_CR_PAUSEZ_MASK
  258. * @param[in] enable enable or disable pause
  259. */
  260. static inline void qeiv2_pause_counter(QEIV2_Type *qeiv2_x, uint32_t counter_mask, bool enable)
  261. {
  262. if (enable) {
  263. qeiv2_x->CR |= counter_mask;
  264. } else {
  265. qeiv2_x->CR &= ~counter_mask;
  266. }
  267. }
  268. /**
  269. * @brief pause pos counter when fault assert
  270. *
  271. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  272. * @param[in] enable enable or disable pause
  273. */
  274. static inline void qeiv2_pause_pos_counter_on_fault(QEIV2_Type *qeiv2_x, bool enable)
  275. {
  276. if (enable) {
  277. qeiv2_x->CR |= QEIV2_CR_FAULTPOS_MASK;
  278. } else {
  279. qeiv2_x->CR &= ~QEIV2_CR_FAULTPOS_MASK;
  280. }
  281. }
  282. /**
  283. * @brief enable load phcnt, zcnt, spdcnt and tmrcnt into their snap registers
  284. *
  285. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  286. */
  287. static inline void qeiv2_enable_snap(QEIV2_Type *qeiv2_x)
  288. {
  289. qeiv2_x->CR |= QEIV2_CR_SNAPEN_MASK;
  290. }
  291. /**
  292. * @brief disable snap
  293. *
  294. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  295. */
  296. static inline void qeiv2_disable_snap(QEIV2_Type *qeiv2_x)
  297. {
  298. qeiv2_x->CR &= ~QEIV2_CR_SNAPEN_MASK;
  299. }
  300. /**
  301. * @brief reset zcnt, spdcnt and tmrcnt to 0, reset phcnt to phidx.
  302. *
  303. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  304. */
  305. static inline void qeiv2_reset_counter(QEIV2_Type *qeiv2_x)
  306. {
  307. qeiv2_x->CR |= QEIV2_CR_RSTCNT_MASK;
  308. }
  309. /**
  310. * @brief release counter.
  311. *
  312. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  313. */
  314. static inline void qeiv2_release_counter(QEIV2_Type *qeiv2_x)
  315. {
  316. qeiv2_x->CR &= ~QEIV2_CR_RSTCNT_MASK;
  317. }
  318. /**
  319. * @brief select spd and tmr register content
  320. *
  321. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  322. * @param[in] content @ref qeiv2_spd_tmr_content_t
  323. */
  324. static inline void qeiv2_select_spd_tmr_register_content(QEIV2_Type *qeiv2_x, qeiv2_spd_tmr_content_t content)
  325. {
  326. qeiv2_x->CR = (qeiv2_x->CR & ~QEIV2_CR_RD_SEL_MASK) | QEIV2_CR_RD_SEL_SET(content);
  327. }
  328. /**
  329. * @brief check spd and tmr register content as pos and angle
  330. *
  331. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  332. * @return true if spd and timer register as pos and angle register
  333. */
  334. static inline bool qeiv2_check_spd_tmr_as_pos_angle(QEIV2_Type *qeiv2_x)
  335. {
  336. return ((qeiv2_x->CR & QEIV2_CR_RD_SEL_MASK) != 0) ? true : false;
  337. }
  338. /**
  339. * @brief set qeiv2 work mode
  340. *
  341. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  342. * @param[in] mode @ref qeiv2_work_mode_t
  343. */
  344. static inline void qeiv2_set_work_mode(QEIV2_Type *qeiv2_x, qeiv2_work_mode_t mode)
  345. {
  346. qeiv2_x->CR = (qeiv2_x->CR & ~QEIV2_CR_ENCTYP_MASK) | QEIV2_CR_ENCTYP_SET(mode);
  347. }
  348. /**
  349. * @brief config watchdog
  350. *
  351. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  352. * @param[in] timeout watchdog timeout time
  353. * @param[in] clr_phcnt the phase_cnt time passed, then clear wdog counter
  354. * @param[in] enable
  355. * @arg 1 - enable watchdog
  356. * @arg 0 - disable watchdog
  357. */
  358. static inline void qeiv2_config_wdog(QEIV2_Type *qeiv2_x, uint32_t timeout, uint8_t clr_phcnt, bool enable)
  359. {
  360. uint32_t tmp;
  361. tmp = QEIV2_WDGCFG_WDGTO_SET(timeout) | QEIV2_WDGCFG_WDOG_CFG_SET(clr_phcnt);
  362. if (enable) {
  363. tmp |= QEIV2_WDGCFG_WDGEN_MASK;
  364. } else {
  365. tmp &= ~QEIV2_WDGCFG_WDGEN_MASK;
  366. }
  367. qeiv2_x->WDGCFG = tmp;
  368. }
  369. /**
  370. * @brief enable trig out trigger event
  371. *
  372. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  373. * @param[in] event_mask
  374. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  375. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  376. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  377. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  378. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  379. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  380. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  381. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  382. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  383. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  384. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  385. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  386. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  387. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  388. */
  389. static inline void qeiv2_enable_trig_out_trigger_event(QEIV2_Type *qeiv2_x, uint32_t event_mask)
  390. {
  391. qeiv2_x->TRGOEN |= event_mask;
  392. }
  393. /**
  394. * @brief disable trig out trigger event
  395. *
  396. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  397. * @param[in] event_mask
  398. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  399. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  400. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  401. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  402. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  403. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  404. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  405. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  406. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  407. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  408. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  409. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  410. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  411. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  412. */
  413. static inline void qeiv2_disable_trig_out_trigger_event(QEIV2_Type *qeiv2_x, uint32_t event_mask)
  414. {
  415. qeiv2_x->TRGOEN &= ~event_mask;
  416. }
  417. /**
  418. * @brief enable load read trigger event
  419. *
  420. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  421. * @param[in] event_mask
  422. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  423. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  424. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  425. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  426. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  427. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  428. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  429. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  430. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  431. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  432. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  433. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  434. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  435. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  436. */
  437. static inline void qeiv2_enable_load_read_trigger_event(QEIV2_Type *qeiv2_x, uint32_t event_mask)
  438. {
  439. qeiv2_x->READEN |= event_mask;
  440. }
  441. /**
  442. * @brief disable load read trigger event
  443. *
  444. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  445. * @param[in] event_mask
  446. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  447. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  448. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  449. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  450. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  451. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  452. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  453. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  454. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  455. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  456. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  457. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  458. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  459. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  460. */
  461. static inline void qeiv2_disable_load_read_trigger_event(QEIV2_Type *qeiv2_x, uint32_t event_mask)
  462. {
  463. qeiv2_x->READEN &= ~event_mask;
  464. }
  465. /**
  466. * @brief enable dma request
  467. *
  468. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  469. * @param[in] mask
  470. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  471. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  472. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  473. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  474. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  475. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  476. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  477. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  478. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  479. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  480. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  481. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  482. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  483. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  484. */
  485. static inline void qeiv2_enable_dma_request(QEIV2_Type *qeiv2_x, uint32_t mask)
  486. {
  487. qeiv2_x->DMAEN |= mask;
  488. }
  489. /**
  490. * @brief disable qeiv2 dma
  491. *
  492. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  493. * @param[in] mask
  494. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  495. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  496. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  497. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  498. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  499. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  500. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  501. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  502. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  503. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  504. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  505. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  506. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  507. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  508. */
  509. static inline void qeiv2_disable_dma_request(QEIV2_Type *qeiv2_x, uint32_t mask)
  510. {
  511. qeiv2_x->DMAEN &= ~mask;
  512. }
  513. /**
  514. * @brief clear qeiv2 status register
  515. *
  516. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  517. * @param[in] mask
  518. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  519. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  520. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  521. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  522. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  523. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  524. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  525. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  526. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  527. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  528. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  529. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  530. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  531. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  532. */
  533. static inline void qeiv2_clear_status(QEIV2_Type *qeiv2_x, uint32_t mask)
  534. {
  535. qeiv2_x->SR = mask;
  536. }
  537. /**
  538. * @brief get qeiv2 status
  539. *
  540. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  541. * @retval qeiv2 status:
  542. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  543. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  544. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  545. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  546. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  547. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  548. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  549. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  550. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  551. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  552. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  553. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  554. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  555. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  556. */
  557. static inline uint32_t qeiv2_get_status(QEIV2_Type *qeiv2_x)
  558. {
  559. return qeiv2_x->SR;
  560. }
  561. /**
  562. * @brief get qeiv2 bit status
  563. *
  564. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  565. * @param[in] mask
  566. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  567. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  568. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  569. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  570. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  571. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  572. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  573. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  574. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  575. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  576. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  577. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  578. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  579. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  580. * @retval true or false
  581. */
  582. static inline bool qeiv2_get_bit_status(QEIV2_Type *qeiv2_x, uint32_t mask)
  583. {
  584. return ((qeiv2_x->SR & mask) == mask) ? true : false;
  585. }
  586. /**
  587. * @brief enable qeiv2 irq
  588. *
  589. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  590. * @param[in] mask
  591. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  592. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  593. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  594. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  595. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  596. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  597. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  598. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  599. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  600. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  601. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  602. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  603. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  604. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  605. */
  606. static inline void qeiv2_enable_irq(QEIV2_Type *qeiv2_x, uint32_t mask)
  607. {
  608. qeiv2_x->IRQEN |= mask;
  609. }
  610. /**
  611. * @brief disable qeiv2 irq
  612. *
  613. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  614. * @param[in] mask
  615. * @arg @ref QEIV2_EVENT_WDOG_FLAG_MASK
  616. * @arg @ref QEIV2_EVENT_HOME_FLAG_MASK
  617. * @arg @ref QEIV2_EVENT_POSITION_COMPARE_FLAG_MASK
  618. * @arg @ref QEIV2_EVENT_Z_PHASE_FLAG_MASK
  619. * @arg @ref QEIV2_EVENT_Z_MISS_FLAG_MASK
  620. * @arg @ref QEIV2_EVENT_WIDTH_TIME_FLAG_MASK
  621. * @arg @ref QEIV2_EVENT_POSITION2_COMPARE_FLAG_MASK
  622. * @arg @ref QEIV2_EVENT_DIR_CHG_FLAG_MASK
  623. * @arg @ref QEIV2_EVENT_CYCLE0_FLAG_MASK
  624. * @arg @ref QEIV2_EVENT_CYCLE1_FLAG_MASK
  625. * @arg @ref QEIV2_EVENT_PULSE0_FLAG_MASK
  626. * @arg @ref QEIV2_EVENT_PULSE1_FLAG_MASK
  627. * @arg @ref QEIV2_EVENT_HOME2_FLAG_MASK
  628. * @arg @ref QEIV2_EVENT_FAULT_FLAG_MASK
  629. */
  630. static inline void qeiv2_disable_irq(QEIV2_Type *qeiv2_x, uint32_t mask)
  631. {
  632. qeiv2_x->IRQEN &= ~mask;
  633. }
  634. /**
  635. * @brief get current counter value
  636. *
  637. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  638. * @param[in] type @ref qeiv2_counter_type_t
  639. * @retval counter value
  640. */
  641. static inline uint32_t qeiv2_get_current_count(QEIV2_Type *qeiv2_x, qeiv2_counter_type_t type)
  642. {
  643. return *(&qeiv2_x->COUNT[QEIV2_COUNT_CURRENT].Z + type);
  644. }
  645. /**
  646. * @brief get current phcnt value
  647. *
  648. * @param qeiv2_x QEI base address, HPM_QEIx(x=0...n)
  649. * @return phcnt value
  650. */
  651. static inline uint32_t qeiv2_get_current_phase_phcnt(QEIV2_Type *qeiv2_x)
  652. {
  653. return QEIV2_COUNT_PH_PHCNT_GET(qeiv2_get_current_count(qeiv2_x, qeiv2_counter_type_phase));
  654. }
  655. /**
  656. * @brief get current a phase level
  657. *
  658. * @param qeiv2_x QEI base address, HPM_QEIx(x=0...n)
  659. * @return a phase level
  660. */
  661. static inline bool qeiv2_get_current_phase_a_level(QEIV2_Type *qeiv2_x)
  662. {
  663. return QEIV2_COUNT_PH_ASTAT_GET(qeiv2_get_current_count(qeiv2_x, qeiv2_counter_type_phase));
  664. }
  665. /**
  666. * @brief get current b phase level
  667. *
  668. * @param qeiv2_x QEI base address, HPM_QEIx(x=0...n)
  669. * @return b phase level
  670. */
  671. static inline bool qeiv2_get_current_phase_b_level(QEIV2_Type *qeiv2_x)
  672. {
  673. return QEIV2_COUNT_PH_BSTAT_GET(qeiv2_get_current_count(qeiv2_x, qeiv2_counter_type_phase));
  674. }
  675. /**
  676. * @brief get current phase dir
  677. *
  678. * @param qeiv2_x QEI base address, HPM_QEIx(x=0...n)
  679. * @return dir
  680. */
  681. static inline bool qeiv2_get_current_phase_dir(QEIV2_Type *qeiv2_x)
  682. {
  683. return QEIV2_COUNT_PH_DIR_GET(qeiv2_get_current_count(qeiv2_x, qeiv2_counter_type_phase));
  684. }
  685. /**
  686. * @brief get read event count value
  687. *
  688. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  689. * @param[in] type @ref qeiv2_counter_type_t
  690. * @retval counter value
  691. */
  692. static inline uint32_t qeiv2_get_count_on_read_event(QEIV2_Type *qeiv2_x, qeiv2_counter_type_t type)
  693. {
  694. return *(&(qeiv2_x->COUNT[QEIV2_COUNT_READ].Z) + type);
  695. }
  696. /**
  697. * @brief read the value of each phase snapshot 0 counter
  698. *
  699. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  700. * @param[in] type @ref qeiv2_counter_type_t
  701. * @retval counter value
  702. */
  703. static inline uint32_t qeiv2_get_count_on_snap0_event(QEIV2_Type *qeiv2_x, qeiv2_counter_type_t type)
  704. {
  705. return *(&qeiv2_x->COUNT[QEIV2_COUNT_SNAP0].Z + type);
  706. }
  707. /**
  708. * @brief read the value of each phase snapshot 1 counter
  709. *
  710. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  711. * @param[in] type @ref qeiv2_counter_type_t
  712. * @retval counter value
  713. */
  714. static inline uint32_t qeiv2_get_count_on_snap1_event(QEIV2_Type *qeiv2_x, qeiv2_counter_type_t type)
  715. {
  716. return *(&qeiv2_x->COUNT[QEIV2_COUNT_SNAP1].Z + type);
  717. }
  718. /**
  719. * @brief set zcnt compare value
  720. *
  721. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  722. * @param[in] cmp zcnt compare value
  723. */
  724. static inline void qeiv2_set_z_cmp_value(QEIV2_Type *qeiv2_x, uint32_t cmp)
  725. {
  726. qeiv2_x->ZCMP = QEIV2_ZCMP_ZCMP_SET(cmp);
  727. }
  728. /**
  729. * @brief set phcnt compare value
  730. *
  731. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  732. * @param[in] cmp phcnt compare value
  733. */
  734. static inline void qeiv2_set_phcnt_cmp_value(QEIV2_Type *qeiv2_x, uint32_t cmp)
  735. {
  736. qeiv2_x->PHCMP = QEIV2_PHCMP_PHCMP_SET(cmp);
  737. }
  738. /**
  739. * @brief set spdcnt or position compare value. It's selected by CR register rd_sel bit.
  740. *
  741. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  742. * @param[in] cmp spdcnt or position compare value
  743. * when set @ref qeiv2_spd_tmr_as_spd_tm, this is spdcmp value. (ABZ encoder)
  744. * when set @ref qeiv2_spd_tmr_as_pos_angle, this is poscmp value. (sin or sincos encoder)
  745. */
  746. static inline void qeiv2_set_spd_pos_cmp_value(QEIV2_Type *qeiv2_x, uint32_t cmp)
  747. {
  748. qeiv2_x->SPDCMP = QEIV2_SPDCMP_SPDCMP_SET(cmp);
  749. }
  750. /**
  751. * @brief set compare match options
  752. *
  753. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  754. * @param[in] ignore_zcmp ignore zcmp
  755. * @param[in] ignore_phcmp ignore phcmp
  756. * @param[in] ignore_spdposcmp ignore spdposcmp
  757. * when set @ref qeiv2_spd_tmr_as_spd_tm, this is spdcmp value. (ABZ encoder)
  758. * when set @ref qeiv2_spd_tmr_as_pos_angle, this is poscmp value. (sin or sincos encoder)
  759. * @param[in] ignore_rotate_dir ignore encoder rotation direction. (ABZ encoder)
  760. * @param[in] rotate_dir when don't ignore rotation direction, match rotation direction. @ref qeiv2_rotate_dir_t. (ABZ encoder)
  761. * @param[in] ignore_pos_dir ignore position increase or decrease direction. (sin or sincos encoder)
  762. * @param[in] pos_dir when don't ignore position direction, match position direction. @ref qeiv2_position_dir_t. (sin or sincos encoder)
  763. */
  764. static inline void qeiv2_set_cmp_match_option(QEIV2_Type *qeiv2_x, bool ignore_zcmp, bool ignore_phcmp, bool ignore_spdposcmp,
  765. bool ignore_rotate_dir, qeiv2_rotate_dir_t rotate_dir, bool ignore_pos_dir, qeiv2_position_dir_t pos_dir)
  766. {
  767. qeiv2_x->MATCH_CFG = (qeiv2_x->MATCH_CFG & (~(QEIV2_MATCH_CFG_ZCMPDIS_MASK | QEIV2_MATCH_CFG_PHASE_MATCH_DIS_MASK | QEIV2_MATCH_CFG_SPDCMPDIS_MASK
  768. | QEIV2_MATCH_CFG_DIRCMPDIS_MASK | QEIV2_MATCH_CFG_DIRCMP_MASK
  769. | QEIV2_MATCH_CFG_POS_MATCH_OPT_MASK | QEIV2_MATCH_CFG_POS_MATCH_DIR_MASK)))
  770. | QEIV2_MATCH_CFG_ZCMPDIS_SET(ignore_zcmp) | QEIV2_MATCH_CFG_PHASE_MATCH_DIS_SET(ignore_phcmp)
  771. | QEIV2_MATCH_CFG_SPDCMPDIS_SET(ignore_spdposcmp)
  772. | QEIV2_MATCH_CFG_DIRCMPDIS_SET(ignore_rotate_dir) | QEIV2_MATCH_CFG_DIRCMP_SET(rotate_dir)
  773. | QEIV2_MATCH_CFG_POS_MATCH_OPT_SET(!ignore_pos_dir) | QEIV2_MATCH_CFG_POS_MATCH_DIR_SET(pos_dir);
  774. }
  775. /**
  776. * @brief set zcnt compare2 value
  777. *
  778. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  779. * @param[in] cmp zcnt compare2 value
  780. */
  781. static inline void qeiv2_set_z_cmp2_value(QEIV2_Type *qeiv2_x, uint32_t cmp)
  782. {
  783. qeiv2_x->ZCMP2 = QEIV2_ZCMP2_ZCMP2_SET(cmp);
  784. }
  785. /**
  786. * @brief set phcnt compare2 value
  787. *
  788. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  789. * @param[in] cmp phcnt compare2 value
  790. */
  791. static inline void qeiv2_set_phcnt_cmp2_value(QEIV2_Type *qeiv2_x, uint32_t cmp)
  792. {
  793. qeiv2_x->PHCMP2 = QEIV2_PHCMP2_PHCMP2_SET(cmp);
  794. }
  795. /**
  796. * @brief set spdcnt or position compare2 value. It's selected by CR register rd_sel bit.
  797. *
  798. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  799. * @param[in] cmp spdcnt or position compare2 value
  800. */
  801. static inline void qeiv2_set_spd_pos_cmp2_value(QEIV2_Type *qeiv2_x, uint32_t cmp)
  802. {
  803. qeiv2_x->SPDCMP2 = QEIV2_SPDCMP2_SPDCMP2_SET(cmp);
  804. }
  805. /**
  806. * @brief set compare2 match options
  807. *
  808. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  809. * @param[in] ignore_zcmp ignore zcmp
  810. * @param[in] ignore_phcmp ignore phcmp
  811. * @param[in] ignore_spdposcmp ignore spdposcmp.
  812. * when set @ref qeiv2_spd_tmr_as_spd_tm, this is spdcmp value. (ABZ encoder)
  813. * when set @ref qeiv2_spd_tmr_as_pos_angle, this is poscmp value. (sin or sincos encoder)
  814. * @param[in] ignore_rotate_dir ignore encoder rotation direction. (ABZ encoder)
  815. * @param[in] rotate_dir when don't ignore rotation direction, match rotation direction. @ref qeiv2_rotate_dir_t. (ABZ encoder)
  816. * @param[in] ignore_pos_dir ignore position increase or decrease direction. (sin or sincos encoder)
  817. * @param[in] pos_dir when don't ignore position direction, match position direction. @ref qeiv2_position_dir_t. (sin or sincos encoder)
  818. */
  819. static inline void qeiv2_set_cmp2_match_option(QEIV2_Type *qeiv2_x, bool ignore_zcmp, bool ignore_phcmp, bool ignore_spdposcmp,
  820. bool ignore_rotate_dir, qeiv2_rotate_dir_t rotate_dir, bool ignore_pos_dir, qeiv2_position_dir_t pos_dir)
  821. {
  822. qeiv2_x->MATCH_CFG = (qeiv2_x->MATCH_CFG & ~(QEIV2_MATCH_CFG_ZCMP2DIS_MASK | QEIV2_MATCH_CFG_PHASE_MATCH_DIS2_MASK | QEIV2_MATCH_CFG_SPDCMP2DIS_MASK
  823. | QEIV2_MATCH_CFG_DIRCMP2DIS_MASK | QEIV2_MATCH_CFG_DIRCMP2_MASK
  824. | QEIV2_MATCH_CFG_POS_MATCH2_OPT_MASK | QEIV2_MATCH_CFG_POS_MATCH2_DIR_MASK))
  825. | QEIV2_MATCH_CFG_ZCMP2DIS_SET(ignore_zcmp) | QEIV2_MATCH_CFG_PHASE_MATCH_DIS2_SET(ignore_phcmp)
  826. | QEIV2_MATCH_CFG_SPDCMP2DIS_SET(ignore_spdposcmp)
  827. | QEIV2_MATCH_CFG_DIRCMP2DIS_SET(ignore_rotate_dir) | QEIV2_MATCH_CFG_DIRCMP2_SET(rotate_dir)
  828. | QEIV2_MATCH_CFG_POS_MATCH2_OPT_SET(!ignore_pos_dir) | QEIV2_MATCH_CFG_POS_MATCH2_DIR_SET(pos_dir);
  829. }
  830. /**
  831. * @brief config signal enablement and edge
  832. *
  833. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  834. * @param[in] siga_en enable signal A/U
  835. * @param[in] sigb_en enable signal B/V
  836. * @param[in] sigz_en enable signal Z/W
  837. * @param[in] posedge_en enable rise edge
  838. * @param[in] negedge_en enable fall edge
  839. */
  840. static inline void qeiv2_config_abz_uvw_signal_edge(QEIV2_Type *qeiv2_x, bool siga_en, bool sigb_en, bool sigz_en, bool posedge_en, bool negedge_en)
  841. {
  842. qeiv2_x->QEI_CFG = (qeiv2_x->QEI_CFG & ~(QEIV2_QEI_CFG_SIGA_EN_MASK | QEIV2_QEI_CFG_SIGB_EN_MASK | QEIV2_QEI_CFG_SIGZ_EN_MASK
  843. | QEIV2_QEI_CFG_POSIDGE_EN_MASK | QEIV2_QEI_CFG_NEGEDGE_EN_MASK))
  844. | (QEIV2_QEI_CFG_SIGA_EN_SET(siga_en) | QEIV2_QEI_CFG_SIGB_EN_SET(sigb_en) | QEIV2_QEI_CFG_SIGZ_EN_SET(sigz_en)
  845. | QEIV2_QEI_CFG_POSIDGE_EN_SET(posedge_en) | QEIV2_QEI_CFG_NEGEDGE_EN_SET(negedge_en));
  846. }
  847. /**
  848. * @brief set pulse0 value
  849. *
  850. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  851. * @param[in] pulse_num for speed detection, will count the cycle number for configed pulse_num
  852. */
  853. static inline void qeiv2_set_pulse0_num(QEIV2_Type *qeiv2_x, uint32_t pulse_num)
  854. {
  855. qeiv2_x->PULSE0_NUM = QEIV2_PULSE0_NUM_PULSE0_NUM_SET(pulse_num);
  856. }
  857. /**
  858. * @brief get cycle0 snap0 value
  859. *
  860. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  861. * @retval cycle0 snap0 value
  862. */
  863. static inline uint32_t qeiv2_get_pulse0_cycle_snap0(QEIV2_Type *qeiv2_x)
  864. {
  865. return qeiv2_x->CYCLE0_SNAP0;
  866. }
  867. /**
  868. * @brief get cycle0 snap1 value
  869. *
  870. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  871. * @retval cycle0 snap1 value
  872. */
  873. static inline uint32_t qeiv2_get_pulse0_cycle_snap1(QEIV2_Type *qeiv2_x)
  874. {
  875. return qeiv2_x->CYCLE0_SNAP1;
  876. }
  877. /**
  878. * @brief set pulse1 value
  879. *
  880. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  881. * @param[in] pulse_num for speed detection, will count the cycle number for configed pulse_num
  882. */
  883. static inline void qeiv2_set_pulse1_num(QEIV2_Type *qeiv2_x, uint32_t pulse_num)
  884. {
  885. qeiv2_x->PULSE1_NUM = QEIV2_PULSE1_NUM_PULSE1_NUM_SET(pulse_num);
  886. }
  887. /**
  888. * @brief get cycle1 snap0 value
  889. *
  890. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  891. * @retval cycle1 snap0 value
  892. */
  893. static inline uint32_t qeiv2_get_pulse1_cycle_snap0(QEIV2_Type *qeiv2_x)
  894. {
  895. return qeiv2_x->CYCLE1_SNAP0;
  896. }
  897. /**
  898. * @brief get cycle1 snap1 value
  899. *
  900. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  901. * @retval cycle1 snap1 value
  902. */
  903. static inline uint32_t qeiv2_get_pulse1_cycle_snap1(QEIV2_Type *qeiv2_x)
  904. {
  905. return qeiv2_x->CYCLE1_SNAP1;
  906. }
  907. /**
  908. * @brief set cycle0 value
  909. *
  910. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  911. * @param[in] cycle_num for speed detection, will count the pulse number for configed cycle_num
  912. */
  913. static inline void qeiv2_set_cycle0_num(QEIV2_Type *qeiv2_x, uint32_t cycle_num)
  914. {
  915. qeiv2_x->CYCLE0_NUM = QEIV2_CYCLE0_NUM_CYCLE0_NUM_SET(cycle_num);
  916. }
  917. /**
  918. * @brief get pulse0 snap0 value
  919. *
  920. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  921. * @retval pulse0 snap0 value
  922. */
  923. static inline uint32_t qeiv2_get_cycle0_pulse_snap0(QEIV2_Type *qeiv2_x)
  924. {
  925. return qeiv2_x->PULSE0_SNAP0;
  926. }
  927. /**
  928. * @brief get pulse0 snap1 value
  929. *
  930. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  931. * @retval pulse0 snap1 value
  932. */
  933. static inline uint32_t qeiv2_get_cycle0_pulse_snap1(QEIV2_Type *qeiv2_x)
  934. {
  935. return qeiv2_x->PULSE0_SNAP1;
  936. }
  937. /**
  938. * @brief get pulse0cycle snap0 value
  939. *
  940. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  941. * @retval pulse0cycle snap0 value
  942. */
  943. static inline uint32_t qeiv2_get_cycle0_pulse0cycle_snap0(QEIV2_Type *qeiv2_x)
  944. {
  945. return qeiv2_x->PULSE0CYCLE_SNAP0;
  946. }
  947. /**
  948. * @brief get pulse0cycle snap1 value
  949. *
  950. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  951. * @retval pulse0cycle snap1 value
  952. */
  953. static inline uint32_t qeiv2_get_cycle0_pulse0cycle_snap1(QEIV2_Type *qeiv2_x)
  954. {
  955. return qeiv2_x->PULSE0CYCLE_SNAP1;
  956. }
  957. /**
  958. * @brief set cycle1 value
  959. *
  960. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  961. * @param[in] cycle_num for speed detection, will count the pulse number for configed cycle_num
  962. */
  963. static inline void qeiv2_set_cycle1_num(QEIV2_Type *qeiv2_x, uint32_t cycle_num)
  964. {
  965. qeiv2_x->CYCLE1_NUM = QEIV2_CYCLE1_NUM_CYCLE1_NUM_SET(cycle_num);
  966. }
  967. #if defined(HPM_IP_FEATURE_QEIV2_ONESHOT_MODE) && HPM_IP_FEATURE_QEIV2_ONESHOT_MODE
  968. /**
  969. * @brief disable cycle0 oneshot mode
  970. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  971. */
  972. static inline void qeiv2_disable_cycle0_oneshot_mode(QEIV2_Type *qeiv2_x)
  973. {
  974. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_CYCLE0_ONESHOT_MASK;
  975. }
  976. /**
  977. * @brief enable cycle0 oneshot mode
  978. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  979. */
  980. static inline void qeiv2_enable_cycle0_oneshot_mode(QEIV2_Type *qeiv2_x)
  981. {
  982. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_CYCLE0_ONESHOT_MASK;
  983. }
  984. /**
  985. * @brief disable cycle1 oneshot mode
  986. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  987. */
  988. static inline void qeiv2_disable_cycle1_oneshot_mode(QEIV2_Type *qeiv2_x)
  989. {
  990. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_CYCLE1_ONESHOT_MASK;
  991. }
  992. /**
  993. * @brief enable cycle1 oneshot mode
  994. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  995. */
  996. static inline void qeiv2_enable_cycle1_oneshot_mode(QEIV2_Type *qeiv2_x)
  997. {
  998. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_CYCLE1_ONESHOT_MASK;
  999. }
  1000. /**
  1001. * @brief disable pulse0 oneshot mode
  1002. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1003. */
  1004. static inline void qeiv2_disable_pulse0_oneshot_mode(QEIV2_Type *qeiv2_x)
  1005. {
  1006. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_PULSE0_ONESHOT_MASK;
  1007. }
  1008. /**
  1009. * @brief enable pulse0 oneshot mode
  1010. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1011. */
  1012. static inline void qeiv2_enable_pulse0_oneshot_mode(QEIV2_Type *qeiv2_x)
  1013. {
  1014. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_PULSE0_ONESHOT_MASK;
  1015. }
  1016. /**
  1017. * @brief disable pulse1 oneshot mode
  1018. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1019. */
  1020. static inline void qeiv2_disable_pulse1_oneshot_mode(QEIV2_Type *qeiv2_x)
  1021. {
  1022. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_PULSE1_ONESHOT_MASK;
  1023. }
  1024. /**
  1025. * @brief enable pulse1 oneshot mode
  1026. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1027. */
  1028. static inline void qeiv2_enable_pulse1_oneshot_mode(QEIV2_Type *qeiv2_x)
  1029. {
  1030. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_PULSE1_ONESHOT_MASK;
  1031. }
  1032. #endif
  1033. #if defined(HPM_IP_FEATURE_QEIV2_SW_RESTART_TRG) && HPM_IP_FEATURE_QEIV2_SW_RESTART_TRG
  1034. /**
  1035. * @brief disable trigger cycle0
  1036. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1037. */
  1038. static inline void qeiv2_disable_trig_cycle0(QEIV2_Type *qeiv2_x)
  1039. {
  1040. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_TRIG_CYCLE0_EN_MASK;
  1041. }
  1042. /**
  1043. * @brief enable trigger cycle0
  1044. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1045. */
  1046. static inline void qeiv2_enable_trig_cycle0(QEIV2_Type *qeiv2_x)
  1047. {
  1048. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_TRIG_CYCLE0_EN_MASK;
  1049. }
  1050. /**
  1051. * @brief disable trigger cycle1
  1052. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1053. */
  1054. static inline void qeiv2_disable_trig_cycle1(QEIV2_Type *qeiv2_x)
  1055. {
  1056. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_TRIG_CYCLE1_EN_MASK;
  1057. }
  1058. /**
  1059. * @brief enable trigger cycle1
  1060. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1061. */
  1062. static inline void qeiv2_enable_trig_cycle1(QEIV2_Type *qeiv2_x)
  1063. {
  1064. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_TRIG_CYCLE1_EN_MASK;
  1065. }
  1066. /**
  1067. * @brief disable trigger pulse0
  1068. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1069. */
  1070. static inline void qeiv2_disable_trig_pulse0(QEIV2_Type *qeiv2_x)
  1071. {
  1072. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_TRIG_PULSE0_EN_MASK;
  1073. }
  1074. /**
  1075. * @brief enable trigger pulse0
  1076. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1077. */
  1078. static inline void qeiv2_enable_trig_pulse0(QEIV2_Type *qeiv2_x)
  1079. {
  1080. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_TRIG_PULSE0_EN_MASK;
  1081. }
  1082. /**
  1083. * @brief disable trigger pulse1
  1084. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1085. */
  1086. static inline void qeiv2_disable_trig_pulse1(QEIV2_Type *qeiv2_x)
  1087. {
  1088. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_TRIG_PULSE1_EN_MASK;
  1089. }
  1090. /**
  1091. * @brief enable trigger pulse1
  1092. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1093. */
  1094. static inline void qeiv2_enable_trig_pulse1(QEIV2_Type *qeiv2_x)
  1095. {
  1096. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_TRIG_PULSE1_EN_MASK;
  1097. }
  1098. /**
  1099. * @brief software restart cycle0
  1100. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1101. */
  1102. static inline void qeiv2_sw_restart_cycle0(QEIV2_Type *qeiv2_x)
  1103. {
  1104. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_SW_PULSE0_RESTART_MASK;
  1105. }
  1106. /**
  1107. * @brief software restart cycle1
  1108. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1109. */
  1110. static inline void qeiv2_sw_restart_cycle1(QEIV2_Type *qeiv2_x)
  1111. {
  1112. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_SW_PULSE1_RESTART_MASK;
  1113. }
  1114. /**
  1115. * @brief software restart pulse0
  1116. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1117. */
  1118. static inline void qeiv2_sw_restart_pulse0(QEIV2_Type *qeiv2_x)
  1119. {
  1120. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_SW_CYCLE0_RESTART_MASK;
  1121. }
  1122. /**
  1123. * @brief software restart pulse1
  1124. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1125. */
  1126. static inline void qeiv2_sw_restart_pulse1(QEIV2_Type *qeiv2_x)
  1127. {
  1128. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_SW_CYCLE1_RESTART_MASK;
  1129. }
  1130. #endif
  1131. /**
  1132. * @brief get pulse1 snap0 value
  1133. *
  1134. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1135. * @retval pulse1 snap0 value
  1136. */
  1137. static inline uint32_t qeiv2_get_cycle1_pulse_snap0(QEIV2_Type *qeiv2_x)
  1138. {
  1139. return qeiv2_x->PULSE1_SNAP0;
  1140. }
  1141. /**
  1142. * @brief get pulse1 snap1 value
  1143. *
  1144. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1145. * @retval pulse1 snap1 value
  1146. */
  1147. static inline uint32_t qeiv2_get_cycle1_pulse_snap1(QEIV2_Type *qeiv2_x)
  1148. {
  1149. return qeiv2_x->PULSE1_SNAP1;
  1150. }
  1151. /**
  1152. * @brief get pulse1cycle snap0 value
  1153. *
  1154. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1155. * @retval pulse1cycle snap0 value
  1156. */
  1157. static inline uint32_t qeiv2_get_cycle1_pulse1cycle_snap0(QEIV2_Type *qeiv2_x)
  1158. {
  1159. return qeiv2_x->PULSE1CYCLE_SNAP0;
  1160. }
  1161. /**
  1162. * @brief get pulse1cycle snap1 value
  1163. *
  1164. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1165. * @retval pulse01cycle snap1 value
  1166. */
  1167. static inline uint32_t qeiv2_get_cycle1_pulse1cycle_snap1(QEIV2_Type *qeiv2_x)
  1168. {
  1169. return qeiv2_x->PULSE1CYCLE_SNAP1;
  1170. }
  1171. /**
  1172. * @brief enable or disable clear counter if detect direction change
  1173. *
  1174. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1175. * @param[in] enable enable or disable clear counter if detect direction change
  1176. */
  1177. static inline void qeiv2_clear_counter_when_dir_chg(QEIV2_Type *qeiv2_x, bool enable)
  1178. {
  1179. if (enable) {
  1180. qeiv2_x->QEI_CFG |= QEIV2_QEI_CFG_SPEED_DIR_CHG_EN_MASK;
  1181. } else {
  1182. qeiv2_x->QEI_CFG &= ~QEIV2_QEI_CFG_SPEED_DIR_CHG_EN_MASK;
  1183. }
  1184. }
  1185. /**
  1186. * @brief adcx config
  1187. *
  1188. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1189. * @param[in] config qeiv2_adc_config_t
  1190. * @param[in] enable enable or disable adcx
  1191. */
  1192. static inline void qeiv2_config_adcx(QEIV2_Type *qeiv2_x, qeiv2_adc_config_t *config, bool enable)
  1193. {
  1194. uint32_t tmp;
  1195. tmp = QEIV2_ADCX_CFG0_X_ADCSEL_SET(config->adc_select) | QEIV2_ADCX_CFG0_X_CHAN_SET(config->adc_channel);
  1196. qeiv2_x->ADCX_CFG1 = QEIV2_ADCX_CFG1_X_PARAM1_SET(config->param1) | QEIV2_ADCX_CFG1_X_PARAM0_SET(config->param0);
  1197. qeiv2_x->ADCX_CFG2 = QEIV2_ADCX_CFG2_X_OFFSET_SET(config->offset);
  1198. if (enable) {
  1199. tmp |= QEIV2_ADCX_CFG0_X_ADC_ENABLE_MASK;
  1200. } else {
  1201. tmp &= ~QEIV2_ADCX_CFG0_X_ADC_ENABLE_MASK;
  1202. }
  1203. qeiv2_x->ADCX_CFG0 = tmp;
  1204. }
  1205. /**
  1206. * @brief adcy config
  1207. *
  1208. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1209. * @param[in] config qeiv2_adc_config_t
  1210. * @param[in] enable enable or disable adcy
  1211. */
  1212. static inline void qeiv2_config_adcy(QEIV2_Type *qeiv2_x, qeiv2_adc_config_t *config, bool enable)
  1213. {
  1214. uint32_t tmp;
  1215. tmp = QEIV2_ADCY_CFG0_Y_ADCSEL_SET(config->adc_select) | QEIV2_ADCY_CFG0_Y_CHAN_SET(config->adc_channel);
  1216. qeiv2_x->ADCY_CFG1 = QEIV2_ADCY_CFG1_Y_PARAM1_SET(config->param1) | QEIV2_ADCY_CFG1_Y_PARAM0_SET(config->param0);
  1217. qeiv2_x->ADCY_CFG2 = QEIV2_ADCY_CFG2_Y_OFFSET_SET(config->offset);
  1218. if (enable) {
  1219. tmp |= QEIV2_ADCY_CFG0_Y_ADC_ENABLE_MASK;
  1220. } else {
  1221. tmp &= ~QEIV2_ADCY_CFG0_Y_ADC_ENABLE_MASK;
  1222. }
  1223. qeiv2_x->ADCY_CFG0 = tmp;
  1224. }
  1225. /**
  1226. * @brief set adcx and adcy delay
  1227. *
  1228. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1229. * @param[in] delay x/y delay, default 1.25us@200MHz, max 80ms
  1230. */
  1231. static inline void qeiv2_set_adc_xy_delay(QEIV2_Type *qeiv2_x, uint32_t delay)
  1232. {
  1233. qeiv2_x->CAL_CFG = QEIV2_CAL_CFG_XY_DELAY_SET(delay);
  1234. }
  1235. /**
  1236. * @brief set position threshold
  1237. *
  1238. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1239. * @param[in] threshold Position change threshold. When two position changes exceed this value,
  1240. * it will be considered as an invalid position and no valid signal will be output.
  1241. */
  1242. static inline void qeiv2_set_position_threshold(QEIV2_Type *qeiv2_x, uint32_t threshold)
  1243. {
  1244. qeiv2_x->POS_THRESHOLD = QEIV2_POS_THRESHOLD_POS_THRESHOLD_SET(threshold);
  1245. }
  1246. /**
  1247. * @brief set uvw position option
  1248. *
  1249. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1250. * @param[in] opt qeiv2_uvw_pos_opt_t
  1251. */
  1252. static inline void qeiv2_set_uvw_position_opt(QEIV2_Type *qeiv2_x, qeiv2_uvw_pos_opt_t opt)
  1253. {
  1254. qeiv2_x->QEI_CFG = (qeiv2_x->QEI_CFG & ~QEIV2_QEI_CFG_UVW_POS_OPT0_MASK) | QEIV2_QEI_CFG_UVW_POS_OPT0_SET(opt);
  1255. }
  1256. /**
  1257. * @brief set config uvw position
  1258. *
  1259. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1260. * @param[in] idx uvw position config index
  1261. * @arg @ref qeiv2_uvw_pos_idx_t
  1262. * @param[in] u_pos_sel U position selection based by uvw position option
  1263. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_LOW
  1264. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_HIGH
  1265. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_EDGE
  1266. * @arg @ref QEIV2_UVW_POS_OPT_NEX_SEL_LOW
  1267. * @arg @ref QEIV2_UVW_POS_OPT_NEX_SEL_HIGH
  1268. * @param[in] v_pos_sel V position selection based by uvw position option
  1269. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_LOW
  1270. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_HIGH
  1271. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_EDGE
  1272. * @arg @ref QEIV2_UVW_POS_OPT_NEX_SEL_LOW
  1273. * @arg @ref QEIV2_UVW_POS_OPT_NEX_SEL_HIGH
  1274. * @param[in] w_pos_sel W position selection based by uvw position option
  1275. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_LOW
  1276. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_HIGH
  1277. * @arg @ref QEIV2_UVW_POS_OPT_CUR_SEL_EDGE
  1278. * @arg @ref QEIV2_UVW_POS_OPT_NEX_SEL_LOW
  1279. * @arg @ref QEIV2_UVW_POS_OPT_NEX_SEL_HIGH
  1280. * @param[in] enable enable this uvw config
  1281. */
  1282. static inline void qeiv2_set_uvw_position_sel(QEIV2_Type *qeiv2_x, qeiv2_uvw_pos_idx_t idx, uint8_t u_pos_sel, uint8_t v_pos_sel,
  1283. uint8_t w_pos_sel, bool enable)
  1284. {
  1285. uint32_t tmp;
  1286. tmp = QEIV2_UVW_POS_CFG_U_POS_SEL_SET(u_pos_sel)
  1287. | QEIV2_UVW_POS_CFG_V_POS_SEL_SET(v_pos_sel)
  1288. | QEIV2_UVW_POS_CFG_W_POS_SEL_SET(w_pos_sel);
  1289. if (enable) {
  1290. tmp |= QEIV2_UVW_POS_CFG_POS_EN_MASK;
  1291. } else {
  1292. tmp &= ~QEIV2_UVW_POS_CFG_POS_EN_MASK;
  1293. }
  1294. qeiv2_x->UVW_POS_CFG[idx] = tmp;
  1295. }
  1296. /**
  1297. * @brief set uvw position
  1298. *
  1299. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1300. * @param[in] idx uvw position config index
  1301. * @arg @ref qeiv2_uvw_pos_idx_t
  1302. * @param[in] pos angle corresponding to UVW signal position
  1303. */
  1304. static inline void qeiv2_set_uvw_position(QEIV2_Type *qeiv2_x, qeiv2_uvw_pos_idx_t idx, uint32_t pos)
  1305. {
  1306. qeiv2_x->UVW_POS[idx] = pos;
  1307. }
  1308. /**
  1309. * @brief set z phase counter value
  1310. *
  1311. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1312. * @param[in] cnt z phase counter value
  1313. */
  1314. static inline void qeiv2_set_z_phase(QEIV2_Type *qeiv2_x, uint32_t cnt)
  1315. {
  1316. qeiv2_x->COUNT[QEIV2_COUNT_CURRENT].Z = cnt;
  1317. }
  1318. /**
  1319. * @brief set phase counter value
  1320. *
  1321. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1322. * @param[in] cnt phase counter value
  1323. */
  1324. static inline void qeiv2_set_phase_cnt(QEIV2_Type *qeiv2_x, uint32_t cnt)
  1325. {
  1326. qeiv2_x->PHASE_CNT = cnt;
  1327. }
  1328. /**
  1329. * @brief get phase counter value
  1330. *
  1331. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1332. * @retval phase counter value
  1333. */
  1334. static inline uint32_t qeiv2_get_phase_cnt(QEIV2_Type *qeiv2_x)
  1335. {
  1336. return qeiv2_x->PHASE_CNT;
  1337. }
  1338. /**
  1339. * @brief update phase counter value
  1340. *
  1341. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1342. * @param[in] inc set to add value to phase_cnt
  1343. * @param[in] dec set to minus value to phase_cnt (set inc and dec same time willl act inc)
  1344. * @param[in] value value to be added or minus from phase_cnt. only valid when inc or dec is set in one 32bit write operation.
  1345. */
  1346. static inline void qeiv2_update_phase_cnt(QEIV2_Type *qeiv2_x, bool inc, bool dec, uint32_t value)
  1347. {
  1348. qeiv2_x->PHASE_UPDATE = QEIV2_PHASE_UPDATE_INC_SET(inc) | QEIV2_PHASE_UPDATE_DEC_SET(dec) | QEIV2_PHASE_UPDATE_VALUE_SET(value);
  1349. }
  1350. /**
  1351. * @brief set position value
  1352. *
  1353. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1354. * @param[in] pos position
  1355. */
  1356. static inline void qeiv2_set_position(QEIV2_Type *qeiv2_x, uint32_t pos)
  1357. {
  1358. qeiv2_x->POSITION = pos;
  1359. }
  1360. /**
  1361. * @brief get position value
  1362. *
  1363. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1364. * @retval position value
  1365. */
  1366. static inline uint32_t qeiv2_get_postion(QEIV2_Type *qeiv2_x)
  1367. {
  1368. return qeiv2_x->POSITION;
  1369. }
  1370. /**
  1371. * @brief update position value
  1372. *
  1373. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1374. * @param[in] inc set to add value to position
  1375. * @param[in] dec set to minus cnt value to position (set inc and dec same time willl act inc)
  1376. * @param[in] value value to be added or minus from position. only valid when inc or dec is set in one 32bit write operation.
  1377. */
  1378. static inline void qeiv2_update_position(QEIV2_Type *qeiv2_x, bool inc, bool dec, uint32_t value)
  1379. {
  1380. qeiv2_x->POSITION_UPDATE = QEIV2_POSITION_UPDATE_INC_SET(inc) | QEIV2_POSITION_UPDATE_DEC_SET(dec) | QEIV2_POSITION_UPDATE_VALUE_SET(value);
  1381. }
  1382. /**
  1383. * @brief get angle value
  1384. *
  1385. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1386. * @retval angle value
  1387. */
  1388. static inline uint32_t qeiv2_get_angle(QEIV2_Type *qeiv2_x)
  1389. {
  1390. return qeiv2_x->ANGLE;
  1391. }
  1392. /**
  1393. * @brief config position timeout for mmc module
  1394. *
  1395. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1396. * @param[in] tm postion timeout value
  1397. * @param[in] enable enable position timeout feature. If timeout, send valid again.
  1398. */
  1399. static inline void qeiv2_config_position_timeout(QEIV2_Type *qeiv2_x, uint32_t tm, bool enable)
  1400. {
  1401. uint32_t tmp;
  1402. tmp = QEIV2_POS_TIMEOUT_TIMEOUT_SET(tm);
  1403. if (enable) {
  1404. tmp |= QEIV2_POS_TIMEOUT_ENABLE_MASK;
  1405. } else {
  1406. tmp &= ~QEIV2_POS_TIMEOUT_ENABLE_MASK;
  1407. }
  1408. qeiv2_x->POS_TIMEOUT = tmp;
  1409. }
  1410. /**
  1411. * @brief config phcnt compare match condition
  1412. *
  1413. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1414. * @param[in] config @ref qeiv2_phcnt_cmp_match_config_t
  1415. * @return status_invalid_argument or status_success
  1416. */
  1417. hpm_stat_t qeiv2_config_phcnt_cmp_match_condition(QEIV2_Type *qeiv2_x, qeiv2_phcnt_cmp_match_config_t *config);
  1418. /**
  1419. * @brief config position compare match condition
  1420. *
  1421. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1422. * @param[in] config @ref qeiv2_pos_cmp_match_config_t
  1423. * @return status_invalid_argument or status_success
  1424. */
  1425. hpm_stat_t qeiv2_config_position_cmp_match_condition(QEIV2_Type *qeiv2_x, qeiv2_pos_cmp_match_config_t *config);
  1426. /**
  1427. * @brief config phcnt compare2 match condition
  1428. *
  1429. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1430. * @param[in] config @ref qeiv2_phcnt_cmp_match_config_t
  1431. * @return status_invalid_argument or status_success
  1432. */
  1433. hpm_stat_t qeiv2_config_phcnt_cmp2_match_condition(QEIV2_Type *qeiv2_x, qeiv2_phcnt_cmp_match_config_t *config);
  1434. /**
  1435. * @brief config position compare2 match condition
  1436. *
  1437. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1438. * @param[in] config @ref qeiv2_pos_cmp_match_config_t
  1439. * @return status_invalid_argument or status_success
  1440. */
  1441. hpm_stat_t qeiv2_config_position_cmp2_match_condition(QEIV2_Type *qeiv2_x, qeiv2_pos_cmp_match_config_t *config);
  1442. /**
  1443. * @brief get uvw position default config
  1444. *
  1445. * @param[out] config uvw position default config structure pointer
  1446. */
  1447. void qeiv2_get_uvw_position_defconfig(qeiv2_uvw_config_t *config);
  1448. /**
  1449. * @brief config uvw position
  1450. *
  1451. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1452. * @param[in] config uvw position config structure pointer
  1453. * @return status_invalid_argument or status_success
  1454. */
  1455. hpm_stat_t qeiv2_config_uvw_position(QEIV2_Type *qeiv2_x, qeiv2_uvw_config_t *config);
  1456. /**
  1457. * @brief config signal filter
  1458. *
  1459. * @param[in] qeiv2_x QEIV2 base address, HPM_QEIV2x(x=0...n)
  1460. * @param[in] phase filter phase
  1461. * @arg @ref qeiv2_filter_phase_t
  1462. * @param[in] outinv Filter will invert the output
  1463. * @param[in] mode qeiv2_filter_mode_t
  1464. * @param[in] sync set to enable sychronization input signal with TRGM clock
  1465. * @param[in] filtlen defines the filter counter length.
  1466. */
  1467. void qeiv2_config_filter(QEIV2_Type *qeiv2_x, qeiv2_filter_phase_t phase, bool outinv, qeiv2_filter_mode_t mode, bool sync, uint32_t filtlen);
  1468. #ifdef __cplusplus
  1469. }
  1470. #endif
  1471. /**
  1472. * @}
  1473. */
  1474. #endif /* HPM_QEIV2_DRV_H */