From 5e1cb6080fcd214676bceba1681d94ae1054513d Mon Sep 17 00:00:00 2001 From: Yilin Sun Date: Sun, 4 Jun 2023 00:40:19 +0800 Subject: [PATCH] Implemented DAC. Signed-off-by: Yilin Sun --- CMakeLists.txt | 1 + include/app_dac.h | 8 ++++ src/app_dac.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++ src/app_reg_if.c | 11 +++++- src/main.c | 5 ++- 5 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 include/app_dac.h create mode 100644 src/app_dac.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d1a8fc..87ed163 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,7 @@ set(TARGET_SOURCES "board/peripherals.c" "board/pin_mux.c" "src/app_adc.c" + "src/app_dac.c" "src/app_i2c_if.c" "src/app_gpio.c" "src/app_reg_if.c" diff --git a/include/app_dac.h b/include/app_dac.h new file mode 100644 index 0000000..9ded8b6 --- /dev/null +++ b/include/app_dac.h @@ -0,0 +1,8 @@ +#ifndef APP_DAC_H +#define APP_DAC_H + +void app_dac_init(void); +uint16_t app_dac_module_reg_read(uint8_t addr); +void app_dac_module_reg_write(uint8_t addr, uint16_t data); + +#endif // APP_DAC_H diff --git a/src/app_dac.c b/src/app_dac.c new file mode 100644 index 0000000..109159e --- /dev/null +++ b/src/app_dac.c @@ -0,0 +1,93 @@ +/* Board */ +#include "clock_config.h" +#include "pin_mux.h" + +/* SDK drivers */ +#include "fsl_clock.h" +#include "fsl_dac.h" +#include "fsl_power.h" + +/* Private */ +#include "app_dac.h" + +#define APP_DAC_REG_OFFSET_CTRL (0x00U) +#define APP_DAC_REG_OFFSET_DATA (0x01U) + +#define APP_DAC_CTRL_BIAS_Pos (8U) +#define APP_DAC_CTRL_BIAS_Msk (1U << APP_DAC_CTRL_BIAS_Pos) + +static inline uint16_t app_dac_read_reg_ctrl(void); +static inline uint16_t app_dac_read_reg_data(void); +static inline void app_dac_write_reg_ctrl(uint16_t data); +static inline void app_dac_write_reg_data(uint16_t data); + +void app_dac_init(void) { + POWER_DisablePD(kPDRUNCFG_PD_DAC0); + CLOCK_EnableClock(kCLOCK_Dac); + + RESET_PeripheralReset(kDAC0_RST_N_SHIFT_RSTn); + + DAC0->CR = 0UL; + DAC0->CTRL = 0UL; +} + +uint16_t app_dac_module_reg_read(uint8_t addr) { + uint16_t ret = 0x5555; + + switch (addr) { + case APP_DAC_REG_OFFSET_CTRL: + ret = app_dac_read_reg_ctrl(); + break; + case APP_DAC_REG_OFFSET_DATA: + ret = app_dac_read_reg_data(); + break; + default: + break; + } + + return ret; +} + +void app_dac_module_reg_write(uint8_t addr, uint16_t data) { + switch (addr) { + case APP_DAC_REG_OFFSET_CTRL: + app_dac_write_reg_ctrl(data); + break; + case APP_DAC_REG_OFFSET_DATA: + app_dac_write_reg_data(data); + break; + default: + break; + } +} + +static inline uint16_t app_dac_read_reg_ctrl(void) { + uint16_t ret = 0x0000U; + + if (DAC0->CR & DAC_CR_BIAS_MASK) { + ret |= APP_DAC_CTRL_BIAS_Msk; + } + + return ret; +} + +static inline uint16_t app_dac_read_reg_data(void) { + return ((DAC0->CR & DAC_CR_VALUE_MASK) >> DAC_CR_VALUE_SHIFT); +} + +static inline void app_dac_write_reg_ctrl(uint16_t data) { + if (data & APP_DAC_CTRL_BIAS_Msk) { + DAC0->CR |= DAC_CR_BIAS_MASK; + } else { + DAC0->CR &= ~DAC_CR_BIAS_MASK; + } +} + +static inline void app_dac_write_reg_data(uint16_t data) { + uint32_t cr = DAC0->CR; + + cr &= ~DAC_CR_VALUE_MASK; + cr |= DAC_CR_VALUE(data); + + DAC0->CR = cr; +} \ No newline at end of file diff --git a/src/app_reg_if.c b/src/app_reg_if.c index 182a6d0..a2b3655 100644 --- a/src/app_reg_if.c +++ b/src/app_reg_if.c @@ -1,5 +1,6 @@ /* App */ #include "app_adc.h" +#include "app_dac.h" #include "app_gpio.h" #include "app_sys_utils.h" @@ -9,7 +10,8 @@ #define MODULE_ID_SYS_UTILS 0 #define MODULE_ID_GPIO 1 #define MODULE_ID_ADC 2 -#define MODULE_ID_END 3 +#define MODULE_ID_DAC 3 +#define MODULE_ID_END 4 typedef uint16_t (*module_reg_read_t)(uint8_t offset); typedef void (*module_reg_write_t)(uint8_t offset, uint16_t data); @@ -19,7 +21,7 @@ typedef struct { module_reg_write_t write; } module_reg_t; -static const module_reg_t s_module_regs[] = { +static const module_reg_t s_module_regs[MODULE_ID_END] = { [MODULE_ID_SYS_UTILS] = { .read = app_sys_utils_module_reg_read, @@ -35,6 +37,11 @@ static const module_reg_t s_module_regs[] = { .read = app_adc_module_reg_read, .write = app_adc_module_reg_write, }, + [MODULE_ID_DAC] = + { + .read = app_dac_module_reg_read, + .write = app_dac_module_reg_write, + }, }; uint16_t app_reg_if_read(uint8_t reg) { diff --git a/src/main.c b/src/main.c index 4541e9c..500c7a0 100644 --- a/src/main.c +++ b/src/main.c @@ -5,16 +5,19 @@ /* App */ #include "app_adc.h" +#include "app_dac.h" #include "app_gpio.h" #include "app_i2c_if.h" -#include "app_led.h" +#include "app_sys_utils.h" int main(void) { BOARD_InitBootPins(); BOARD_InitBootClocks(); + app_sys_utils_init(); app_gpio_init(); app_adc_init(); + app_dac_init(); app_i2c_if_init(); for (;;) {