文章目录
- [DAC8562 简介](#DAC8562 简介)
- 一、通信协议基础
-
- [1.1 SPI 通信时序](#1.1 SPI 通信时序)
- [1.2 数据包结构](#1.2 数据包结构)
- [1.3 常用命令、地址详解](#1.3 常用命令、地址详解)
- 二、驱动架构设计
- 三、核心功能实现原理
- 四、使用示例
- 五、常见问题与解答
-
- [Q1: 为什么使用24位数据包而不是16位?](#Q1: 为什么使用24位数据包而不是16位?)
- [Q2: 内部参考电压和外部参考电压的区别?](#Q2: 内部参考电压和外部参考电压的区别?)
- [Q3: 什么时候需要使用"写输入寄存器"命令而不是"写并更新"?](#Q3: 什么时候需要使用"写输入寄存器"命令而不是"写并更新"?)
- [Q4: LDAC引脚的作用是什么?](#Q4: LDAC引脚的作用是什么?)
- [Q5: 如何计算实际输出电压?](#Q5: 如何计算实际输出电压?)
- [Q6: 驱动为什么使用函数指针而不是直接调用HAL函数?](#Q6: 驱动为什么使用函数指针而不是直接调用HAL函数?)
- 附录
DAC8562 简介
DAC8562是德州仪器(TI)生产的一款双通道、16位精度的数字模拟转换器(DAC),具有以下特点:
- 分辨率:16位
- 通道数:2路独立的DAC输出(DAC-A和DAC-B)
- 电压范围:0V ~ 5V(或0V ~ 10V,取决于参考电压和增益设置)
- 通信接口:SPI(串行外设接口) 内部参考:可选2.5V内部参考电压
- 增益控制:每通道可独立设置增益(×1或×2)
应用场景:
- 精密电压源
- 波形发生器
- 自动测试设备
- 工业控制系统
- 数据采集系统
一、通信协议基础
1.1 SPI 通信时序
DAC8562采用标准SPI通信协议,数据传输遵循以下时序:

通信要点:
- CS(片选信号):传输期间保持低电平,传输结束后拉高
- 数据传输:每次传输3字节(24位)数据
- 时钟模式 :CPOL=0, CPHA=0(SPI Mode 0)
- 字节顺序:MSB(最高位)先传输
1.2 数据包结构
每个SPI传输包含24位数据,分为以下几个部分:
**24位数据包**
├── 无关位 (2位) : DB23-DB22
├── 命令位 (3位) : DB21-DB19 (C2, C1, C0)
├── 地址位 (3位) : DB18-DB16 (A2, A1, A0)
└── 数据位 (16位) : DB15-DB0 (D15-D0)
DB23-DB22 无关位(X) :不影响操作,通常设为0
DB21-DB19 命令位 :C2, C1, C0 - 定义操作类型
DB18-DB16 地址位 :A2, A1, A0 - 选择目标通道/寄存器
DB15-DB0 数据位:D15-D0 - 16位数据值


1.3 常用命令、地址详解

二、驱动架构设计
本驱动采用平台无关接口设计,通过函数指针实现与硬件平台的解耦。
接口结构体:
c
typedef struct
{
void (*cs_enable)(void); // CS使能函数指针
void (*cs_disable)(void); // CS禁用函数指针
bool (*spi_transmit)(uint8_t *data, uint16_t size); // SPI传输函数指针
void (*delay_ms)(uint32_t ms); // 延时函数指针
} dac8562_interface_t;
设计优势:
- 可移植性:驱动代码不依赖特定的SPI实现(如HAL库、LL库等)
- 可测试性:可以使用模拟接口进行单元测试
- 灵活性:支持不同的MCU平台(STM32、ESP32、Arduino等)
- 解耦性:驱动层与应用层、硬件层分离
驱动分层结构:

三、核心功能实现原理
24位数据组合函数
函数 :DAC8562_Combine24BitData()
原理:使用位运算将命令、地址、数据组合成24位值,然后拆分为3个字节。
c
void DAC8562_Combine24BitData(uint8_t cmd, uint8_t addr, uint16_t data, uint8_t *tx_buffer)
{
uint32_t combined_data = 0;
// 限制输入范围
cmd &= 0x07; // 确保只有3位
addr &= 0x07; // 确保只有3位
// 位运算组合:命令左移19位,地址左移16位,数据不变
combined_data = ((uint32_t)cmd << 19) | ((uint32_t)addr << 16) | data;
// 拆分为3个字节
tx_buffer[0] = (combined_data >> 16) & 0xFF; // 高字节
tx_buffer[1] = (combined_data >> 8) & 0xFF; // 中字节
tx_buffer[2] = combined_data & 0xFF; // 低字节
}
位运算说明:
cmd << 19:将命令位移动到DB21-DB19位置addr << 16:将地址位移动到DB18-DB16位置data:数据位保持在DB15-DB0位置|:按位或运算,合并三个部分
示例计算:
cmd = 0x03 (011), addr = 0x00 (000), data = 0x8000
combined_data = (0x03 << 19) | (0x00 << 16) | 0x8000
= 0x00180000 | 0x00000000 | 0x00008000
= 0x00188000
tx_buffer[0] = (0x00188000 >> 16) & 0xFF = 0x0018 & 0xFF = 0x18
tx_buffer[1] = (0x00188000 >> 8) & 0xFF = 0x001880 & 0xFF = 0x80
tx_buffer[2] = 0x00188000 & 0xFF = 0x00
电压到码值转换
函数 :DAC8562_VoltageToCode()
原理:使用线性映射公式将电压值转换为16位DAC码值。
转换公式:
Code = (Vout / Vfs) × (2^16 - 1)
其中:
Vout:目标输出电压Vfs:满量程电压(通常为5V)2^16 - 1:65535(最大码值)
实现代码:
c
uint16_t DAC8562_VoltageToCode(float voltage)
{
float ratio;
float code_float;
uint16_t code;
// 限制电压范围
if (voltage < DAC_MIN_VOLTAGE)
voltage = DAC_MIN_VOLTAGE;
if (voltage > DAC_MAX_VOLTAGE)
voltage = DAC_MAX_VOLTAGE;
// 计算比例
ratio = voltage / DAC_MAX_VOLTAGE;
// 转换为码值(使用四舍五入)
code_float = ratio * (float)DAC_MAX_CODE;
code = (uint16_t)(code_float + 0.5f);
// 边界检查
if (code > DAC_MAX_CODE)
code = DAC_MAX_CODE;
return code;
}
转换示例:
目标电压 = 2.5V
满量程 = 5.0V
最大码值 = 65535
ratio = 2.5 / 5.0 = 0.5
code = 0.5 × 65535 = 32767.5
code = 32768 (四舍五入)
为什么使用四舍五入?
- 减少量化误差
- 提高转换精度
- 例如:32767.5会转换为32768而不是32767
码值到电压转换
函数 :DAC8562_CodeToVoltage()
原理:反向转换,将DAC码值转换回电压值。
转换公式:
Vout = (Code / (2^16 - 1)) × Vfs
实现代码:
c
float DAC8562_CodeToVoltage(uint16_t code)
{
float ratio;
float voltage;
// 限制码值范围
if (code > DAC_MAX_CODE)
code = DAC_MAX_CODE;
// 计算比例
ratio = (float)code / (float)DAC_MAX_CODE;
// 转换为电压
voltage = ratio * DAC_MAX_VOLTAGE;
return voltage;
}
设置电压功能
函数 :DAC8562_SetVoltage()
流程:
用户输入电压值
↓
DAC8562_VoltageToCode() - 转换为码值
↓
DAC8562_SetCode() - 设置码值
├─→ DAC8562_Combine24BitData() - 组合命令
└─→ DAC8562_WriteCommand() - 发送SPI命令
代码实现:
c
void DAC8562_SetVoltage(uint8_t channel, float voltage)
{
uint16_t code;
// 电压转码值
code = DAC8562_VoltageToCode(voltage);
// 设置码值(使用命令011:写并更新)
DAC8562_SetCode(channel, code);
}
电源管理功能
函数 :DAC8562_SetPowerMode()
原理:使用命令100(电源模式),通过数据位的不同组合实现不同的电源状态。
数据位配置:
- DB5-DB4 :电源下电模式选择
- 00:上电
- 01:1kΩ到GND
- 10:100kΩ到GND
- 11:Hi-Z(高阻态)
- DB1-DB0 :DAC选择
- 01:DAC-A
- 10:DAC-B
- 11:两者
实现代码片段:
c
void DAC8562_SetPowerMode(uint8_t channel, uint8_t power_mode)
{
uint16_t data;
if (power_mode == DAC_POWER_UP)
{
// 上电:DB5=0, DB4=0
if (channel == DAC_ADDR_DAC_A)
data = 0x0001; // DB1=0, DB0=1
else if (channel == DAC_ADDR_DAC_B)
data = 0x0002; // DB1=1, DB0=0
else
data = 0x0003; // DB1=1, DB0=1
}
else
{
// 下电:根据power_mode设置DB5-DB4
uint8_t pd_bits = (power_mode & 0x03) << 4;
// ... 组合数据
}
DAC8562_Combine24BitData(DAC_CMD_POWER_MODE, 0x00, data, tx_buffer);
DAC8562_WriteCommand(tx_buffer);
}
内部参考电压控制
函数 :DAC8562_SetInternalReference()
原理:使用命令111(参考控制),通过DB0位控制内部参考电压的使能/禁用。
数据位配置:
- DB0 = 0:禁用内部参考,增益=1,使用外部参考
- DB0 = 1:使能内部参考(2.5V),增益=2,输出电压范围0~5V
注意事项:
- 使能内部参考后需要延时(约10ms)等待参考稳定
- 使能内部参考后,增益自动设置为2
四、使用示例
4.1 基本初始化
步骤1:定义接口函数
c
// CS控制函数
void dac_cs_enable(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void dac_cs_disable(void)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
// SPI传输函数
bool dac_spi_transmit(uint8_t *data, uint16_t size)
{
return (HAL_SPI_Transmit(&hspi1, data, size, 100) == HAL_OK);
}
步骤2:注册接口并初始化
c
int main(void)
{
// ... 系统初始化 ...
// 注册DAC接口
dac8562_interface_t dac_if = {
.cs_enable = dac_cs_enable,
.cs_disable = dac_cs_disable,
.spi_transmit = dac_spi_transmit,
.delay_ms = HAL_Delay
};
DAC8562_RegisterInterface(&dac_if);
// 初始化DAC(使能内部参考,上电DAC)
DAC8562_Init();
// ... 其他代码 ...
}
4.2 设置输出电压
c
// 设置DAC-A输出2.5V
DAC8562_SetVoltage(DAC_ADDR_DAC_A, 2.5f);
// 设置DAC-B输出3.3V
DAC8562_SetVoltage(DAC_ADDR_DAC_B, 3.3f);
4.3 使用码值直接设置
c
// 设置DAC-A输出码值为32768(中间值,约2.5V)
DAC8562_SetCode(DAC_ADDR_DAC_A, 32768);
// 设置DAC-B输出满量程(65535,5V)
DAC8562_SetCode(DAC_ADDR_DAC_B, 65535);
4.4 电压与码值转换
c
// 电压转码值
float voltage = 2.5f;
uint16_t code = DAC8562_VoltageToCode(voltage);
printf("2.5V对应的码值: %d\r\n", code);
// 码值转电压
uint16_t code = 32768;
float voltage = DAC8562_CodeToVoltage(code);
printf("码值32768对应的电压: %.3fV\r\n", voltage);
4.5 高级功能使用
电源管理
c
// 上电DAC-A
DAC8562_SetPowerMode(DAC_ADDR_DAC_A, DAC_POWER_UP);
// 下电DAC-B,使用1kΩ负载
DAC8562_SetPowerMode(DAC_ADDR_DAC_B, DAC_POWER_DOWN_MODE_1K);
// 下电两个DAC,使用高阻态
DAC8562_SetPowerMode(DAC_ADDR_DAC_AB, DAC_POWER_DOWN_MODE_HIZ);
增益配置
c
// 设置DAC-A增益=1,DAC-B增益=1
DAC8562_SetGain(DAC_GAIN_B_1_A_1);
// 设置DAC-A增益=2,DAC-B增益=2(使用内部参考时默认)
DAC8562_SetGain(DAC_GAIN_B_2_A_2);
LDAC配置
c
// 禁用LDAC引脚对DAC-A的控制,启用对DAC-B的控制
DAC8562_SetLDAC(0, 1);
// 禁用LDAC引脚对两个DAC的控制(完全软件控制)
DAC8562_SetLDAC(0, 0);
软件复位
c
// 复位所有寄存器并更新所有DAC(上电复位状态)
DAC8562_SoftwareReset(1);
// 仅复位输入寄存器
DAC8562_SoftwareReset(0);
4.6 同步更新两个通道
c
// 方法1:使用写并更新所有命令
// 先写DAC-A输入寄存器
uint8_t tx_buffer[3];
DAC8562_Combine24BitData(DAC_CMD_WRITE_REGISTER, DAC_ADDR_DAC_A,
DAC8562_VoltageToCode(2.5f), tx_buffer);
DAC8562_WriteCommand(tx_buffer);
// 再写DAC-B输入寄存器
DAC8562_Combine24BitData(DAC_CMD_WRITE_REGISTER, DAC_ADDR_DAC_B,
DAC8562_VoltageToCode(3.3f), tx_buffer);
DAC8562_WriteCommand(tx_buffer);
// 最后同时更新两个通道
DAC8562_UpdateAll();
// 方法2:使用地址0x07同时写入
DAC8562_Combine24BitData(DAC_CMD_WRITE_UPDATE_ALL, DAC_ADDR_DAC_AB,
DAC8562_VoltageToCode(2.5f), tx_buffer);
DAC8562_WriteCommand(tx_buffer);
五、常见问题与解答
Q1: 为什么使用24位数据包而不是16位?
A: DAC8562的数据寄存器是16位的,但需要额外的命令位和地址位来指定操作类型和目标通道。24位格式(3字节)正好包含了命令、地址和数据的所有必要信息。
Q2: 内部参考电压和外部参考电压的区别?
A:
- 内部参考:芯片内置2.5V参考,启用后增益自动为×2,输出范围0~5V
- 外部参考:使用外部提供的参考电压,增益为×1,输出范围0~Vref
Q3: 什么时候需要使用"写输入寄存器"命令而不是"写并更新"?
A: 当需要同时更新多个DAC通道时,可以先使用"写输入寄存器"命令分别写入数据,然后使用"更新所有"命令一次性更新所有输出,这样可以确保多个通道同时更新,避免时序差异。
Q4: LDAC引脚的作用是什么?
A: LDAC(Load DAC)引脚用于硬件控制DAC输出更新。当LDAC引脚拉低时,输入寄存器的值会更新到输出寄存器。使用LDAC可以实现多个DAC的同步更新,这在多通道系统中很有用。
Q5: 如何计算实际输出电压?
A:
Vout = (Code / 65535) × Vfs × Gain
其中:
- Code:16位DAC码值(0~65535)
- Vfs:满量程电压(内部参考时为2.5V,外部参考时为Vref)
- Gain:增益(×1或×2)
Q6: 驱动为什么使用函数指针而不是直接调用HAL函数?
A: 使用函数指针实现平台无关设计,使驱动可以在不同的MCU平台上使用,提高代码的可移植性和可测试性。
附录
驱动代码
本文章的驱动代码可以在dac8562_driver中免费下载,有能力的可以在资源绑定中下载。
头文件展示:
c
#ifndef __DAC8562_H
#define __DAC8562_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
/**
* @file dac8562.h
* @brief DAC8562驱动程序(平台无关SPI接口)
*
* @note 使用说明:
*
* 1. 定义CS控制和SPI传输函数:
* void cs_enable(void) {
* HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
* }
* void cs_disable(void) {
* HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
* }
* bool spi_transmit(uint8_t *data, uint16_t size) {
* return (HAL_SPI_Transmit(&hspi1, data, size, 100) == HAL_OK);
* }
*
* 2. 注册接口并初始化:
* dac8562_interface_t dac_if = {
* .cs_enable = cs_enable,
* .cs_disable = cs_disable,
* .spi_transmit = spi_transmit,
* .delay_ms = HAL_Delay
* };
* DAC8562_RegisterInterface(&dac_if);
* DAC8562_Init();
*
* 3. 使用驱动函数:
* DAC8562_SetVoltage(DAC_ADDR_DAC_A, 2.5f); // 设置2.5V输出
*
* 注意:使用前必须先调用 DAC8562_RegisterInterface() 注册接口!
*
* 24位数据格式:
* =============================================
* - DB23-DB22: 无关位 (X)
* - DB21-DB19: 命令位 (C2, C1, C0)
* - DB18-DB16: 地址位 (A2, A1, A0)
* - DB15-DB0: 数据位 (D15-D0)
*/
/* ============================================================================
* DAC8562 命令定义 (Command Bits: DB21-DB19)
* ============================================================================ */
#define DAC_CMD_WRITE_REGISTER 0x00 // 000: 写输入寄存器n
#define DAC_CMD_SOFTWARE_LDAC 0x01 // 001: 软件LDAC,更新DAC寄存器n
#define DAC_CMD_WRITE_UPDATE_ALL 0x02 // 010: 写输入寄存器n并更新所有DAC寄存器
#define DAC_CMD_WRITE_UPDATE_N 0x03 // 011: 写输入寄存器n并更新DAC寄存器n
#define DAC_CMD_POWER_MODE 0x04 // 100: 设置DAC上电/下电模式
#define DAC_CMD_SOFTWARE_RESET 0x05 // 101: 软件复位
#define DAC_CMD_SET_LDAC 0x06 // 110: 设置LDAC寄存器
#define DAC_CMD_REFERENCE_CONTROL 0x07 // 111: 使能/禁用内部参考
/* ============================================================================
* DAC8562 地址定义 (Address Bits: DB18-DB16)
* ============================================================================ */
#define DAC_ADDR_DAC_A 0x00 // 000: DAC-A通道
#define DAC_ADDR_DAC_B 0x01 // 001: DAC-B通道
#define DAC_ADDR_GAIN 0x02 // 010: 增益寄存器(仅用于命令000)
#define DAC_ADDR_DAC_AB 0x07 // 111: DAC-A和DAC-B
/* ============================================================================
* DAC8562 增益配置定义 (Data Bits: DB1-DB0)
* ============================================================================ */
#define DAC_GAIN_B_2_A_2 0x00 // DAC-B增益=2, DAC-A增益=2 (内部VREF默认)
#define DAC_GAIN_B_2_A_1 0x01 // DAC-B增益=2, DAC-A增益=1
#define DAC_GAIN_B_1_A_2 0x02 // DAC-B增益=1, DAC-A增益=2
#define DAC_GAIN_B_1_A_1 0x03 // DAC-B增益=1, DAC-A增益=1 (上电默认)
/* ============================================================================
* DAC8562 电源模式定义 (Power Down Mode: DB5-DB4, DB1-DB0)
* ============================================================================ */
#define DAC_POWER_DOWN_MODE_1K 0x01 // 1kΩ to GND
#define DAC_POWER_DOWN_MODE_100K 0x02 // 100kΩ to GND
#define DAC_POWER_DOWN_MODE_HIZ 0x03 // Hi-Z (高阻态)
#define DAC_POWER_UP 0x00 // 上电
/* ============================================================================
* DAC8562 电压范围定义
* ============================================================================ */
#define DAC_MAX_VOLTAGE 5.0f // 最大输出电压 (V)
#define DAC_MIN_VOLTAGE 0.0f // 最小输出电压 (V)
#define DAC_MAX_CODE 65535U // 最大DAC码值 (16位)
/* ============================================================================
* DAC8562 接口定义
* ============================================================================ */
typedef struct
{
void (*cs_enable)(void); // CS使能函数指针
void (*cs_disable)(void); // CS禁用函数指针
bool (*spi_transmit)(uint8_t *data, uint16_t size); // SPI传输函数指针
void (*delay_ms)(uint32_t ms); // 延时函数指针
} dac8562_interface_t;
/* ============================================================================
* 函数声明
* ============================================================================ */
/**
* @brief 注册DAC8562 SPI接口(平台无关接口)
* @param interface: SPI接口结构体指针,包含CS控制函数、SPI传输函数、延时函数等
* @note 使用此接口可以使驱动与平台无关,支持任何SPI实现
* @note 使用示例(STM32 HAL库):
* // 定义CS控制函数
* void cs_enable(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); }
* void cs_disable(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); }
*
* // 定义SPI传输函数
* bool spi_transmit(uint8_t *data, uint16_t size) {
* return (HAL_SPI_Transmit(&hspi1, data, size, 100) == HAL_OK);
* }
*
* // 注册接口
* dac8562_interface_t dac_if = {
* .cs_enable = cs_enable,
* .cs_disable = cs_disable,
* .spi_transmit = spi_transmit,
* .delay_ms = HAL_Delay
* };
* DAC8562_RegisterInterface(&dac_if);
* DAC8562_Init();
*/
void DAC8562_RegisterInterface(const dac8562_interface_t *interface);
/**
* @brief 组合24位DAC8562指令数据
* @param cmd: 命令位 (C2,C1,C0) - 0x00~0x07
* @param addr: 地址位 (A2,A1,A0) - 0x00~0x07
* @param data: 数据位 (D15-D0) - 0x0000~0xFFFF
* @param tx_buffer: 输出的3字节缓冲区
* @note 24位数据格式:
* Byte[0]: [DB23][DB22][DB21][DB20][DB19][DB18][DB17][DB16]
* [ X ][ X ][ C2 ][ C1 ][ C0 ][ A2 ][ A1 ][ A0 ]
* Byte[1]: [DB15][DB14][DB13][DB12][DB11][DB10][DB9 ][DB8 ]
* Byte[2]: [DB7 ][DB6 ][DB5 ][DB4 ][DB3 ][DB2 ][DB1 ][DB0 ]
*/
void DAC8562_Combine24BitData(uint8_t cmd, uint8_t addr, uint16_t data, uint8_t *tx_buffer);
/**
* @brief 发送DAC8562指令
* @param tx_buffer: 3字节指令缓冲区
* @retval bool类型(true: 成功, false: 失败或接口未注册)
*/
bool DAC8562_WriteCommand(uint8_t *tx_buffer);
/**
* @brief 初始化DAC8562(使能内部参考)
*/
void DAC8562_Init(void);
/**
* @brief 设置DAC输出电压(写入并立即更新)
* @param channel: DAC通道 (DAC_ADDR_DAC_A 或 DAC_ADDR_DAC_B)
* @param voltage: 目标电压值 (DAC_MIN_VOLTAGE~DAC_MAX_VOLTAGE)
*/
void DAC8562_SetVoltage(uint8_t channel, float voltage);
/**
* @brief 设置DAC输出码值(写入并立即更新)
* @param channel: DAC通道 (DAC_ADDR_DAC_A 或 DAC_ADDR_DAC_B)
* @param code: DAC码值 (0x0000~DAC_MAX_CODE, 16位)
*/
void DAC8562_SetCode(uint8_t channel, uint16_t code);
/**
* @brief 将电压值转换为DAC码值
* @param voltage: 电压值 (DAC_MIN_VOLTAGE~DAC_MAX_VOLTAGE)
* @retval DAC码值 (0~DAC_MAX_CODE)
*/
uint16_t DAC8562_VoltageToCode(float voltage);
/**
* @brief 将DAC码值转换为电压值
* @param code: DAC码值 (0~DAC_MAX_CODE)
* @retval 电压值 (DAC_MIN_VOLTAGE~DAC_MAX_VOLTAGE)
*/
float DAC8562_CodeToVoltage(uint16_t code);
/**
* @brief 设置增益配置
* @param gain_config: 增益配置 (DAC_GAIN_B_2_A_2等)
*/
void DAC8562_SetGain(uint8_t gain_config);
/**
* @brief 设置LDAC引脚配置
* @param ldac_a: 1=LDAC对DAC-A有效(使能LDAC控制), 0=LDAC对DAC-A无效(禁用LDAC控制)
* @param ldac_b: 1=LDAC对DAC-B有效(使能LDAC控制), 0=LDAC对DAC-B无效(禁用LDAC控制)
* @note LDAC寄存器使用反向逻辑:
* - DB1=0, DB0=0 (0x00): LDAC对两者都有效(LDAC引脚可以控制两者)
* - DB1=0, DB0=1 (0x01): LDAC仅对DAC-B有效
* - DB1=1, DB0=0 (0x02): LDAC仅对DAC-A有效
* - DB1=1, DB0=1 (0x03): LDAC对两者都无效(LDAC引脚不能控制任何DAC)
* - 注意:参数ldac_a=1,ldac_b=1会设置DB1=1,DB0=1,结果是"两者都无效"
*/
void DAC8562_SoftwareLDAC(uint8_t channel);
/**
* @brief 更新所有DAC寄存器
*/
void DAC8562_UpdateAll(void);
/**
* @brief 设置DAC电源模式
* @param channel: DAC通道 (DAC_ADDR_DAC_A 或 DAC_ADDR_DAC_B)
* @param power_mode: 电源模式 (DAC_POWER_UP, DAC_POWER_DOWN_MODE_1K等)
*/
void DAC8562_SetPowerMode(uint8_t channel, uint8_t power_mode);
/**
* @brief 软件复位
* @param reset_all: 1=复位所有寄存器并更新所有DAC, 0=仅复位输入寄存器
*/
void DAC8562_SoftwareReset(uint8_t reset_all);
/**
* @brief 设置LDAC引脚配置
* @param ldac_a: 1=LDAC对DAC-A有效, 0=无效
* @param ldac_b: 1=LDAC对DAC-B有效, 0=无效
*/
void DAC8562_SetLDAC(uint8_t ldac_a, uint8_t ldac_b);
/**
* @brief 使能/禁用内部参考
* @param enable: 1=使能内部参考(增益=2), 0=禁用内部参考(增益=1)
*/
void DAC8562_SetInternalReference(uint8_t enable);
#ifdef __cplusplus
}
#endif
#endif /* __DAC8562_H */