109 lines
3.4 KiB
C
109 lines
3.4 KiB
C
#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);
|
||
}
|
||
}
|