dac_common.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <string.h>
  7. #include "esp_log.h"
  8. #include "esp_err.h"
  9. #include "esp_check.h"
  10. #include "freertos/FreeRTOS.h"
  11. #include "freertos/semphr.h"
  12. #include "freertos/timers.h"
  13. #include "driver/rtc_io.h"
  14. #include "driver/dac.h"
  15. #include "soc/dac_periph.h"
  16. #include "hal/dac_hal.h"
  17. extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished.
  18. static __attribute__((unused)) const char *TAG = "DAC";
  19. /*---------------------------------------------------------------
  20. DAC
  21. ---------------------------------------------------------------*/
  22. esp_err_t dac_pad_get_io_num(dac_channel_t channel, gpio_num_t *gpio_num)
  23. {
  24. ESP_RETURN_ON_FALSE(channel < DAC_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, "DAC channel error");
  25. *gpio_num = (gpio_num_t)dac_periph_signal.dac_channel_io_num[channel];
  26. return ESP_OK;
  27. }
  28. static esp_err_t dac_rtc_pad_init(dac_channel_t channel)
  29. {
  30. ESP_RETURN_ON_FALSE(channel < DAC_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, "DAC channel error");
  31. gpio_num_t gpio_num = 0;
  32. dac_pad_get_io_num(channel, &gpio_num);
  33. rtc_gpio_init(gpio_num);
  34. rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED);
  35. rtc_gpio_pullup_dis(gpio_num);
  36. rtc_gpio_pulldown_dis(gpio_num);
  37. return ESP_OK;
  38. }
  39. esp_err_t dac_output_enable(dac_channel_t channel)
  40. {
  41. ESP_RETURN_ON_FALSE(channel < DAC_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, "DAC channel error");
  42. dac_rtc_pad_init(channel);
  43. portENTER_CRITICAL(&rtc_spinlock);
  44. dac_hal_power_on(channel);
  45. dac_hal_rtc_sync_by_adc(false);
  46. portEXIT_CRITICAL(&rtc_spinlock);
  47. return ESP_OK;
  48. }
  49. esp_err_t dac_output_disable(dac_channel_t channel)
  50. {
  51. ESP_RETURN_ON_FALSE(channel < DAC_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, "DAC channel error");
  52. portENTER_CRITICAL(&rtc_spinlock);
  53. dac_hal_power_down(channel);
  54. portEXIT_CRITICAL(&rtc_spinlock);
  55. return ESP_OK;
  56. }
  57. esp_err_t dac_output_voltage(dac_channel_t channel, uint8_t dac_value)
  58. {
  59. ESP_RETURN_ON_FALSE(channel < DAC_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, "DAC channel error");
  60. portENTER_CRITICAL(&rtc_spinlock);
  61. dac_hal_update_output_value(channel, dac_value);
  62. portEXIT_CRITICAL(&rtc_spinlock);
  63. return ESP_OK;
  64. }
  65. esp_err_t dac_out_voltage(dac_channel_t channel, uint8_t dac_value)
  66. {
  67. ESP_RETURN_ON_FALSE(channel < DAC_CHANNEL_MAX, ESP_ERR_INVALID_ARG, TAG, "DAC channel error");
  68. portENTER_CRITICAL(&rtc_spinlock);
  69. dac_hal_update_output_value(channel, dac_value);
  70. portEXIT_CRITICAL(&rtc_spinlock);
  71. return ESP_OK;
  72. }
  73. esp_err_t dac_cw_generator_enable(void)
  74. {
  75. portENTER_CRITICAL(&rtc_spinlock);
  76. dac_hal_cw_generator_enable();
  77. portEXIT_CRITICAL(&rtc_spinlock);
  78. return ESP_OK;
  79. }
  80. esp_err_t dac_cw_generator_disable(void)
  81. {
  82. portENTER_CRITICAL(&rtc_spinlock);
  83. dac_hal_cw_generator_disable();
  84. portEXIT_CRITICAL(&rtc_spinlock);
  85. return ESP_OK;
  86. }
  87. esp_err_t dac_cw_generator_config(dac_cw_config_t *cw)
  88. {
  89. ESP_RETURN_ON_FALSE(cw, ESP_ERR_INVALID_ARG, TAG, "invalid clock configuration");
  90. portENTER_CRITICAL(&rtc_spinlock);
  91. dac_hal_cw_generator_config(cw);
  92. portEXIT_CRITICAL(&rtc_spinlock);
  93. return ESP_OK;
  94. }