#include "FreeRTOS.h" #include "task.h" #include "dac8552.h" #include "gpio.h" #include "spi.h" dac8552x_object dac8552; void dac8552_cs(cs_state_type state) { if (state == CS_L) { DAC8552_SYNC(GPIO_PIN_RESET); } else { DAC8552_SYNC(GPIO_PIN_SET); } } void dac8552_transmit_data(uint8_t *data, uint16_t len) { HAL_SPI_Transmit(&hspi3, data, len, 1000); } void dac8552_init(dac8552x_object *dac, dac8552_write write, dac8552_chip_select cs) { if ((dac == NULL) || (write == NULL) || (cs == NULL)) { return; } dac->write_data = write; dac->chip_selcet = cs; } void set_dac8552_channel_value(dac8552x_object *dac, dac8552_ld_type ld, dac8552_bs_type bs, dac8552_pd_type pd, uint16_t data) { uint32_t input = 0; uint8_t sdata[3]; input = data; input = input | (ld << 20); input = input | (bs << 18); input = input | (pd << 16); sdata[0] = (uint8_t)(input >> 16); sdata[1] = (uint8_t)(input >> 8); sdata[2] = (uint8_t)input; dac->chip_selcet(CS_L); vTaskDelay(10); dac->write_data(sdata, 3); dac->chip_selcet(CS_H); } void dac8552_operation(float32 *data1, float32 *data2) { uint16_t data = 0; float32 temp = 0.0f; dac8552_init(&dac8552, dac8552_transmit_data, dac8552_cs); if (data1 != NULL) { // 4~20mA输出 if (*data1 > 20.0f) *data1 = 20.0f; else if (*data1 < 4.0f) *data1 = 4.0f; temp = (*data1) * 100.0f; data = (uint16_t)(65535.0f * temp / 2500.0f); set_dac8552_channel_value(&dac8552, LD_CH_B, SEL_BUF_B, PD_NONE, data); // set_dac8552_channel_value(&dac8552, LD_CH_A, SEL_BUF_A, PD_NONE, data); } if (data2 != NULL) { //-2.5~2.5v输出 if (*data2 < -2.5f) *data2 = -2.5f; else if (*data2 > 2.5f) *data2 = 2.5f; temp = (*data2) * 0.5f + 1.25f; data = (uint16_t)(65535.0f * temp / 2.5f); // set_dac8552_channel_value(&dac8552, LD_CH_B, SEL_BUF_B, PD_NONE, data); set_dac8552_channel_value(&dac8552, LD_CH_A, SEL_BUF_A, PD_NONE, data); } }