driver_qdec.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "driver_qdec.h"
  2. #include "driver_clk.h"
  3. volatile unsigned int pending_count = 0;
  4. volatile unsigned char symbol_state = 0;
  5. volatile int step_count = 0;
  6. volatile unsigned char state = 0;
  7. bool qdec_isr_flag_x = false;
  8. bool qdec_isr_flag_y = false;
  9. bool qdec_isr_flag_z = false;
  10. static void qdecx_init(void)
  11. {
  12. QDECXCON |= BIT(2) | BIT(1); //qdecx reserve and forward enable
  13. QDECX_FILTER(40); //qdecx filter
  14. QDECX_WKUP_ENABLE(); //qdecx wakeup sleep enable
  15. QDECX_ENABLB(); //qdecx enable
  16. }
  17. static void qdecy_init(void)
  18. {
  19. QDECYCON |= BIT(2) | BIT(1); //qdecy reserve and forward enable
  20. QDECY_FILTER(6); //qdecy filter
  21. QDECY_WKUP_ENABLE(); //qdecy wakeup sleep enable
  22. QDECY_ENABLB(); //qdecy enable
  23. }
  24. static void qdecz_init(void)
  25. {
  26. QDECZCON |= BIT(2) | BIT(1); //qdecz reserve and forward enable
  27. QDECZ_FILTER(54); //qdecz filter
  28. QDECZ_WKUP_ENABLE(); //qdecz wakeup sleep enable
  29. QDECZ_ENABLB(); //qdecz enable
  30. }
  31. AT(.com_periph.qdec.isr)
  32. void qdec_isr(void)
  33. {
  34. if(qdec_isr_flag_x == true)
  35. {
  36. if(QDECX_FORWARD_PENDING_GET)
  37. {
  38. QDECX_FORWARD_PENDING_CLEAR();
  39. QDECXDATA_VALUE_GET(step_count);
  40. QDECXDATA_SYMBOL_GET(symbol_state);
  41. step_count <<= 20;
  42. step_count >>= 20;
  43. pending_count++;
  44. }
  45. else if(QDECX_REVERSE_PENDING_GET)
  46. {
  47. QDECX_REVERSE_PENDING_CLEAR();
  48. QDECXDATA_VALUE_GET(step_count);
  49. QDECXDATA_SYMBOL_GET(symbol_state);
  50. step_count <<= 20;
  51. step_count >>= 20;
  52. pending_count++;
  53. }
  54. else if(QDECX_ERROR_PENDING_GET)
  55. {
  56. QDECX_ERROR_PENDING_CLEAR();
  57. QDECXDATA_VALUE_GET(step_count);
  58. }
  59. else if(QDECX_OV_PNDING_GET)
  60. {
  61. QDECX_OV_PNDING_CLEAR();
  62. }
  63. }
  64. if(qdec_isr_flag_y == true)
  65. {
  66. if(QDECY_FORWARD_PENDING_GET)
  67. {
  68. QDECY_FORWARD_PENDING_CLEAR();
  69. QDECYDATA_VALUE_GET(step_count);
  70. QDECYDATA_SYMBOL_GET(symbol_state);
  71. step_count <<= 20;
  72. step_count >>= 20;
  73. pending_count++;
  74. }
  75. else if(QDECY_REVERSE_PENDING_GET)
  76. {
  77. QDECY_REVERSE_PENDING_CLEAR();
  78. QDECYDATA_VALUE_GET(step_count);
  79. QDECYDATA_SYMBOL_GET(symbol_state);
  80. step_count <<= 20;
  81. step_count >>= 20;
  82. pending_count++;
  83. }
  84. else if(QDECY_ERROR_PENDING_GET)
  85. {
  86. QDECY_ERROR_PENDING_CLEAR();
  87. QDECYDATA_VALUE_GET(step_count);
  88. }
  89. else if(QDECY_OV_PNDING_GET)
  90. {
  91. QDECY_OV_PNDING_CLEAR();
  92. }
  93. }
  94. if(qdec_isr_flag_z == true)
  95. {
  96. if(QDECZ_FORWARD_PENDING_GET)
  97. {
  98. QDECZ_FORWARD_PENDING_CLEAR();
  99. QDECZDATA_VALUE_GET(step_count);
  100. QDECZDATA_SYMBOL_GET(symbol_state);
  101. step_count <<= 20;
  102. step_count >>= 20;
  103. pending_count++;
  104. }
  105. else if(QDECZ_REVERSE_PENDING_GET)
  106. {
  107. QDECZ_REVERSE_PENDING_CLEAR();
  108. QDECZDATA_VALUE_GET(step_count);
  109. QDECZDATA_SYMBOL_GET(symbol_state);
  110. step_count <<= 20;
  111. step_count >>= 20;
  112. pending_count++;
  113. }
  114. else if(QDECZ_ERROR_PENDING_GET)
  115. {
  116. QDECZ_ERROR_PENDING_CLEAR();
  117. QDECZDATA_VALUE_GET(step_count);
  118. }
  119. else if(QDECZ_OV_PNDING_GET)
  120. {
  121. QDECZ_OV_PNDING_CLEAR();
  122. }
  123. }
  124. }
  125. void qdec_init(qdec_init_typedef *qdec_cfg)
  126. {
  127. printf("enter to test_qdec\n");
  128. qdec_init_typedef *config = qdec_cfg;
  129. if(config){
  130. CLKCON1 |= BIT(8); //xosc or rtc
  131. if(qdec_cfg->qdec_asis_sel == QDEC_X_AXIS) // sel qdec_x_axis
  132. {
  133. clk_gate1_cmd(CLK_GATE1_QDECX, CLK_EN); //qdecx_clken
  134. QDECXCON |= ((qdec_cfg->qdec_cm_sel) << 12);
  135. QDECXCON |= ((qdec_cfg->number_samples_sel) << 16);
  136. qdec_isr_flag_x = true;
  137. qdecx_init();
  138. }
  139. else if(qdec_cfg->qdec_asis_sel == QDEC_Y_AXIS) //sel qdec_y_axis
  140. {
  141. clk_gate1_cmd(CLK_GATE1_QDECY, CLK_EN); //qdecy_clken
  142. QDECYCON |= ((qdec_cfg->qdec_cm_sel) << 12);
  143. QDECYCON |= ((qdec_cfg->number_samples_sel) << 16);
  144. qdec_isr_flag_y = true;
  145. qdecy_init();
  146. }
  147. else if(qdec_cfg->qdec_asis_sel == QDEC_Z_AXIS) ////sel qdec_z_axis
  148. {
  149. clk_gate1_cmd(CLK_GATE1_QDEC, CLK_EN); //qdecz_clken
  150. QDECZCON |= ((qdec_cfg->qdec_cm_sel) << 12);
  151. QDECZCON |= ((qdec_cfg->number_samples_sel) << 16);
  152. qdec_isr_flag_z = true;
  153. qdecz_init();
  154. }
  155. sys_irq_init(IRQn_IR_QDEC_LEDC, 0, qdec_isr);
  156. }
  157. }