controller-pcba/User/driver/dac161s997.c

109 lines
3.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}
}