driver_sdadc.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /*
  2. * @File name : driver_sdadc.c
  3. * @Author : Bluetrum IOT Team
  4. * @Date : 2023-07-03
  5. * @Description : This file provides functions to manage the most functionalities
  6. * of the SDADC peripheral.
  7. *
  8. * Copyright (c) by Bluetrum, All Rights Reserved.
  9. */
  10. #include "driver_sdadc.h"
  11. #include "driver_clk.h"
  12. /**
  13. * @brief Initializes the sdadc peripheral according to the specified
  14. * parameters in the sdadc_init_struct.
  15. * @param sdadc_init_struct: pointer to a sdadc_init_typedef structure that
  16. * contains the configuration information for the specified SDADC peripheral.
  17. * @retval None
  18. */
  19. void sdadc_init(sdadc_init_typedef *sdadc_init_struct)
  20. {
  21. /* Config sampling rate */
  22. SDADC->con &= ~SDADC_CON_FSOUT_SEL;
  23. SDADC->con |= sdadc_init_struct->sample_rate & SDADC_CON_FSOUT_SEL;
  24. /* Config MIC analog register */
  25. mic_adc_init(sdadc_init_struct->mic_analog_cfg);
  26. /* Config sw_sub dc status */
  27. if (sdadc_init_struct->subtract_soft_dc_en != DISABLE) {
  28. SDADC->con |= SDADC_CON_SW_DC_EN;
  29. } else {
  30. SDADC->con &= ~SDADC_CON_SW_DC_EN;
  31. }
  32. /* Config getdc status */
  33. if (sdadc_init_struct->get_dc_en != DISABLE) {
  34. SDADC->con |= SDADC_CON_GETDC_EN;
  35. } else {
  36. SDADC->con &= ~SDADC_CON_GETDC_EN;
  37. }
  38. /* Config remove dc status */
  39. if (sdadc_init_struct->remove_dc_en != DISABLE) {
  40. SDADC->con |= SDADC_CON_RMDC_EN;
  41. } else {
  42. SDADC->con &= ~SDADC_CON_RMDC_EN;
  43. }
  44. /* Config gain status */
  45. if (sdadc_init_struct->dig_gain_en != DISABLE) {
  46. SDADC->con |= SDADC_CON_GAIN_EN;
  47. } else {
  48. SDADC->con &= ~SDADC_CON_GAIN_EN;
  49. }
  50. }
  51. /**
  52. * @brief De-initialize the specified SDADC peripheral.
  53. * @retval None
  54. */
  55. void sdadc_deinit(void)
  56. {
  57. SDADC->con &= ~(SDADC_CON_SW_DC_EN | \
  58. SDADC_CON_GETDC_EN | \
  59. SDADC_CON_RMDC_EN | \
  60. SDADC_CON_GAIN_EN | \
  61. SDADC_CON_ADC_EN);
  62. SDADC->dma_con &= ~SDADC_DMACON_DMA_EN;
  63. mic_adc_deinit();
  64. clk_gate0_cmd(CLK_GATE0_SDADCL, CLK_DIS);
  65. }
  66. /**
  67. * @brief Enable or disable the specified SDADC peripheral.
  68. * @param state: the state of the SDADC peripheral.
  69. * this parameter can be: ENABLE or DISABLE.
  70. * @retval None
  71. */
  72. void sdadc_cmd(FUNCTIONAL_STATE state)
  73. {
  74. if (state != DISABLE) {
  75. SDADC->con |= SDADC_CON_ADC_EN;
  76. } else {
  77. SDADC->con &= ~SDADC_CON_ADC_EN;
  78. }
  79. }
  80. /**
  81. * @brief Enable or disable the SDADC DMA function.
  82. * @param addr: DMA start address.
  83. * @param len: DMA transmit len.
  84. * @param state: the new state need to config.
  85. * this parameter can be: ENABLE or DISABLE.
  86. * @retval None
  87. */
  88. void sdadc_dma_cmd(u32 addr, u16 len, FUNCTIONAL_STATE state)
  89. {
  90. if (state != DISABLE) {
  91. /* Config DMA address and size */
  92. SDADC->dma_addr = addr;
  93. SDADC->dma_size = len;
  94. SDADC->dma_con |= SDADC_DMACON_DMA_EN;
  95. } else {
  96. SDADC->dma_con &= ~SDADC_DMACON_DMA_EN;
  97. }
  98. }
  99. /**
  100. * @brief Enable or disable the specified SDADC interrupt.
  101. * @param isr: Function to be executed for service interruption.
  102. * @param pr: Priority of service interruption.
  103. * @param flag_type: specifies the SDADC interrupt sources to be enable or disable.
  104. * this parameter can be one of the following values:
  105. * @arg SDADC_FLAG_SINGLE_SAMPLE: Single sampling complete interrupt.
  106. * @arg SDADC_FLAG_DMA_ALL_DONE: DMA full-transfer interrupt.
  107. * @arg SDADC_FLAG_DMA_HALF_DONE: DMA half-transfer interrupt.
  108. * @param state: the state of the SDADC peripheral's interrupt.
  109. * this parameter can be: ENABLE or DISABLE.
  110. * @retval None
  111. */
  112. void sdadc_pic_config(isr_t isr, int pr, SDADC_FLAG_TYPEDEF flag_type, FUNCTIONAL_STATE state)
  113. {
  114. u32 flag_pending_bit = 0;
  115. u32 all_flag_mask = (SDADC_DMACON_SAMPLES_IE | SDADC_DMACON_DMA_ALLDONE_IE | SDADC_DMACON_DMA_HALFDONE_IE);
  116. if (flag_type == 0) {
  117. return;
  118. }
  119. if (flag_type & SDADC_FLAG_SINGLE_SAMPLE) {
  120. flag_pending_bit |= SDADC_DMACON_SAMPLES_IE;
  121. }
  122. if (flag_type & SDADC_FLAG_DMA_ALL_DONE) {
  123. flag_pending_bit |= SDADC_DMACON_DMA_ALLDONE_IE;
  124. }
  125. if (flag_type & SDADC_FLAG_DMA_HALF_DONE) {
  126. flag_pending_bit |= SDADC_DMACON_DMA_HALFDONE_IE;
  127. }
  128. if (state != DISABLE) {
  129. SDADC->dma_con |= flag_pending_bit;
  130. sys_irq_init(IRQn_SDADC_DMA, pr, isr);
  131. } else {
  132. SDADC->dma_con &= ~flag_pending_bit;
  133. if (flag_pending_bit & all_flag_mask) {
  134. PICEN &= ~BIT(IRQn_SDADC_DMA);
  135. }
  136. }
  137. }
  138. /**
  139. * @brief Check the specified SDADC flag is set or not.
  140. * @param flag_type: specifies the flag to check.
  141. * the parameter can be one of the following values:
  142. * @arg SDADC_FLAG_SINGLE_SAMPLE: Single sampling complete interrupt.
  143. * @arg SDADC_FLAG_DMA_ALL_DONE: DMA full-transfer interrupt.
  144. * @arg SDADC_FLAG_DMA_HALF_DONE: DMA half-transfer interrupt.
  145. * @retval the state of flag_type (SET or RESET).
  146. */
  147. AT(.com_periph.sdadc.flag)
  148. FLAG_STATE sdadc_get_flag(SDADC_FLAG_TYPEDEF flag_type)
  149. {
  150. u32 flag_pending_bit = 0;
  151. if (flag_type & SDADC_FLAG_SINGLE_SAMPLE) {
  152. flag_pending_bit |= SDADC_DMAPND_SAMPLEDONE;
  153. }
  154. if (flag_type & SDADC_FLAG_DMA_ALL_DONE) {
  155. flag_pending_bit |= SDADC_DMAPND_ALLDONE;
  156. }
  157. if (flag_type & SDADC_FLAG_DMA_HALF_DONE) {
  158. flag_pending_bit |= SDADC_DMAPND_HALFDONE;
  159. }
  160. if ((SDADC->dma_pend & flag_pending_bit) != RESET) {
  161. return SET;
  162. } else {
  163. return RESET;
  164. }
  165. }
  166. /**
  167. * @brief Clear the SDADC pending.
  168. * @param flag_type: specifies flag to clear.
  169. * the parameter can be one of the following values:
  170. * @arg SDADC_FLAG_SINGLE_SAMPLE: Single sampling complete interrupt.
  171. * @arg SDADC_FLAG_DMA_ALL_DONE: DMA full-transfer interrupt.
  172. * @arg SDADC_FLAG_DMA_HALF_DONE: DMA half-transfer interrupt.
  173. * @retval None
  174. */
  175. AT(.com_periph.sdadc.flag)
  176. void sdadc_clear_flag(SDADC_FLAG_TYPEDEF flag_type)
  177. {
  178. u32 flag_pending_bit = 0;
  179. if (flag_type & SDADC_FLAG_SINGLE_SAMPLE) {
  180. flag_pending_bit |= SDADC_DMACPND_SAMPLEDONE_CLR;
  181. }
  182. if (flag_type & SDADC_FLAG_DMA_ALL_DONE) {
  183. flag_pending_bit |= SDADC_DMACPND_ALLDONE_CLR;
  184. }
  185. if (flag_type & SDADC_FLAG_DMA_HALF_DONE) {
  186. flag_pending_bit |= SDADC_DMACPND_HALFDONE_CLR;
  187. }
  188. SDADC->dma_cpnd |= flag_pending_bit;
  189. }
  190. /**
  191. * @brief Set digital gain function.
  192. * @param dig_gain: the value of digital gain need to set.
  193. * @retval None
  194. */
  195. void sdadc_digital_gain_set(SDADC_DIGITAL_GAIN_TYPEDEF dig_gain)
  196. {
  197. SDADC->gain_con = dig_gain & SDADC_GAINCON_GAIN;
  198. }
  199. /**
  200. * @brief Set removeDC bits_len function.
  201. * @param removeDC_bits_sel: the enum value of removeDC need to set.
  202. * @retval None
  203. */
  204. void sdadc_removeDC_bits_set(SDADC_RMDC_BITS_TYPEDEF removeDC_bits_sel)
  205. {
  206. u32 reg = SDADC->con;
  207. reg &= ~SDADC_CON_GETDC_SEL;
  208. reg |= removeDC_bits_sel & SDADC_CON_GETDC_SEL;
  209. SDADC->con = reg;
  210. }
  211. /**
  212. * @brief Set getDC bits_len function.
  213. * @param getDC_bits_sel: the enum value of getDC need to set.
  214. * @retval None
  215. */
  216. void sdadc_getDC_bits_set(SDADC_GETDC_BITS_TYPEDEF getDC_bits_sel)
  217. {
  218. u32 reg = SDADC->con;
  219. reg &= ~SDADC_CON_RMDC_SEL;
  220. reg |= getDC_bits_sel & SDADC_CON_RMDC_SEL;
  221. SDADC->con = reg;
  222. }
  223. /**
  224. * @brief Get digital gain function.
  225. * @retval the value of digital gain.
  226. */
  227. uint16_t sdadc_digital_gain_get(void)
  228. {
  229. return (SDADC->gain_con & SDADC_GAINCON_GAIN);
  230. }
  231. /**
  232. * @brief Get getDC bits_len function.
  233. * @retval the enum value of getDC_bits.
  234. */
  235. SDADC_GETDC_BITS_TYPEDEF sdadc_getDC_bits_get(void)
  236. {
  237. return (SDADC->con & SDADC_CON_GETDC_SEL);
  238. }
  239. /**
  240. * @brief Get removeDC bits_len function.
  241. * @retval the enum value of removeDC_bits.
  242. */
  243. SDADC_RMDC_BITS_TYPEDEF sdadc_removeDC_bits_get(void)
  244. {
  245. return (SDADC->con & SDADC_CON_RMDC_SEL);
  246. }