#include "dac161s997.h" /** * @brief 读取DAC161S997状态寄存器 * @return 状态寄存器值 */ uint16_t dac161s997_read_status(chip_type_e dac_num) { uint8_t tx_buffer[3] = {DAC161S997_STATUS_REG | 0x80, 0x00, 0x00}; // 最高位置1表示读操作 uint8_t rx_buffer[3] = {0, 0, 0}; board_spi_init(dac_num); board_spi_cs_on(dac_num); spi_transmit_receive(&hspi1, tx_buffer, rx_buffer, 3); board_spi_cs_off(dac_num); return ((uint16_t)rx_buffer[1] << 8) | rx_buffer[2]; } /** * @brief 向DAC161S997芯片写入寄存器值 * * 该函数通过SPI接口向DAC161S997芯片写入指定的寄存器值。 * * @param dac_num DAC芯片编号 * @param reg 要写入的寄存器地址 * @param data 要写入的数据,16位 */ void dac161s997_write_reg(chip_type_e dac_num, uint8_t reg, uint16_t data) { uint8_t data_buffer[3] = {0, 0, 0}; uint8_t rx_buffer[3] = {0, 0, 0}; data_buffer[0] = reg; data_buffer[1] = data >> 8; data_buffer[2] = data; board_spi_init(dac_num); board_spi_cs_on(dac_num); spi_transmit_receive(&hspi1, data_buffer, rx_buffer, 3); board_spi_cs_off(dac_num); } /** * @brief 初始化DAC161S997 DAC设备 */ void dac161s997_init(void) { // 复位DAC dac161s997_write_reg(DAC161S997, DAC161S997_RESET_REG, 0x0000); HAL_Delay(10); // 等待复位完成 // 配置错误检测 dac161s997_write_reg(DAC161S997, DAC161S997_ERR_LOW_REG, 0x0000); // 设置低于4mA报警阈值 dac161s997_write_reg(DAC161S997, DAC161S997_ERR_HIGH_REG, 0xFFFF); // 设置高于20mA报警阈值 dac161s997_write_reg(DAC161S997, DAC161S997_ERR_CONFIG_REG, 0x070E); // 配置错误检测 // 读取状态寄存器确认初始化成功 uint16_t status = dac161s997_read_status(DAC161S997); if(status == 0xFFFF || status == 0x0000) { // SPI通信可能有问题,重试初始化 HAL_Delay(100); dac161s997_write_reg(DAC161S997, DAC161S997_RESET_REG, 0x0000); HAL_Delay(10); } // 初始输出设为4mA dac161s997_output(DAC161S997, 4.0f); } /** * @brief DAC161S997芯片输出函数 * * 此函数用于设置DAC161S997芯片的输出电流。 * DAC161S997的输出范围是4-20mA,对应DAC码值0-65535 * * @param dac_num DAC芯片类型 * @param current 需要设置的电流值,单位:毫安 */ void dac161s997_output(chip_type_e dac_num, float current) { // 将电流值限制在4-20mA范围内 if(current < 4.0f) current = 4.0f; if(current > 20.0f) current = 20.0f; // 计算DAC码值:(current - 4mA) * 65535 / (20mA - 4mA) uint32_t dac_code = (uint32_t)((current - 4.0f) * 65535.0f / 16.0f); uint8_t data_buffer[3] = {0, 0, 0}; uint8_t rx_buffer[3] = {0, 0, 0}; data_buffer[0] = DAC161S997_DACCODE_REG; data_buffer[1] = (dac_code >> 8) & 0xFF; data_buffer[2] = dac_code & 0xFF; board_spi_init(dac_num); board_spi_cs_on(dac_num); spi_transmit_receive(&hspi1, data_buffer, rx_buffer, 3); board_spi_cs_off(dac_num); // 读取状态寄存器验证写入是否成功 uint16_t status = dac161s997_read_status(dac_num); if(status == 0xFFFF || status == 0x0000) { // SPI通信可能有问题,重试写入 HAL_Delay(1); board_spi_init(dac_num); board_spi_cs_on(dac_num); spi_transmit_receive(&hspi1, data_buffer, rx_buffer, 3); board_spi_cs_off(dac_num); } }