#include "ad5303.h" void ad5303_init(ad5303_handle_t *hdac, SPI_HandleTypeDef *hspi, cs_handle_t *hcs, ad5303_res_t res) { hdac->hspi = hspi; hdac->hcs = hcs; hdac->res = res; ad5303_gain(hdac, AD_GAIN_X1); ad5303_mode(hdac, AD_NORAMAL); ad5303_set_value(hdac, 0, AD_DAC1); ad5303_set_value(hdac, 0, AD_DAC2); } void ad5303_set_value(ad5303_handle_t *hdac, uint16_t value, ad5303_dac_t dac) { uint16_t data; uint8_t data8; switch (dac) { case AD_DAC1: hdac->_regCtl &= ~(1 << 15); break; case AD_DAC2: hdac->_regCtl |= (1 << 15); break; default: break; } data = hdac->_regCtl | (value << hdac->res); hdac->hcs->cs_on(hdac->hcs); data8 = (uint8_t)((data >> 8) & 0x00FF); HAL_SPI_Transmit(hdac->hspi, &data8, 1, HAL_MAX_DELAY); data8 = (uint8_t)(data & 0x00FF); HAL_SPI_Transmit(hdac->hspi, &data8, 1, HAL_MAX_DELAY); hdac->hcs->cs_off(hdac->hcs); } void ad5303_mode(ad5303_handle_t *hdac, ad5303_mode_t mode) { switch (mode) { case AD_NORAMAL: hdac->_regCtl &= ~(11 << 12); break; case AD_LOWZ: hdac->_regCtl |= (1 << 12); hdac->_regCtl &= ~(1 << 13); break; case AD_HIGHZ: hdac->_regCtl &= ~(1 << 12); hdac->_regCtl |= (1 << 13); break; case AD_OFF: hdac->_regCtl |= (11 << 12); break; default: break; } } void ad5303_gain(ad5303_handle_t *hdac, ad5303_gain_t gain) { switch (gain) { case AD_GAIN_X1: hdac->_regCtl &= ~(1 << 14); break; case AD_GAIN_X2: hdac->_regCtl |= (1 << 14); break; default: break; } }