一、核心特征
-
分辨率与精度
- 16位分辨率,最大积分非线性误差(INL)±12 LSB
- 差分非线性(DNL)±1 LSB,保证单调性
- 内部基准电压:2.5 V ±5 mV(最大值),温漂4 ppm/°C(典型值)
- 零点误差:±1 mV(最大值),增益误差:±0.01% FSR(典型值)
-
动态性能
- 毛刺脉冲:0.1 nV-s(典型值)
- 建立时间:7 μs(空载),10 μs(1 MΩ负载)
- 压摆率:0.75 V/μs
-
电源与功耗
- 工作电压:2.7 V 至 5.5 V
- 低功耗模式:
- 正常模式(内部基准启用):1.6 mA(最大值,5.5 V)
- 省电模式:0.55 μA(最大值)
-
接口与封装
- 50 MHz SPI接口(施密特触发输入)
- 封装:WSON-10(3 mm × 3 mm)、VSSOP-10
- 温度范围:-40°C 至 125°C
-
特殊功能
- 异步清零(CLR)引脚:复位至零电平
- LDAC引脚支持同步更新多通道输出
- 输出缓冲器支持轨到轨操作,灌/拉电流能力20 mA
二、配置流程
-
硬件配置
- 电源与接地 :
AVDD接2.7--5.5 V,GND单点接地(图103布局示例)。 - 基准源选择 :
- 内部基准:VREFIN/VREFOUT引脚接≥150 nF电容到GND。
- 外部基准:直接输入0--AVDD电压(禁用内部基准)。
- 输出负载:支持2 kΩ并联3 nF容性负载。
- 电源与接地 :
-
软件配置(通过SPI命令)
- 内部基准控制 :
命令位C2C1C0=111
,DB0=1启用(同时强制增益=2)。 - 增益设置 :
命令位C2C1C0=000
,地址A2A1A0=010
,DB0/DB1设置各通道增益(1或2)。 - LDAC模式 :
命令位C2C1C0=110
,DB0/DB1=1时通道忽略LDAC引脚(同步更新)。 - 复位模式 :
- 软件复位:命令位
C2C1C0=101
,DB0=1重置所有寄存器。 - CLR硬件复位:下降沿触发零电平输出。
- 软件复位:命令位
- 内部基准控制 :
三、写入流程
-
SPI帧结构(24位)
[DB23-DB22:无关位] [DB21-DB19:命令位] [DB18-DB16:地址位] [DB15-DB0:数据位]
- 命令位定义 :
000
:写输入寄存器011
:写输入寄存器并更新DAC100
:设置省电模式111
:启用/禁用内部基准
- 命令位定义 :
-
时序要求(图1)
- SYNC下降沿启动传输,SCLK下降沿锁存数据。
- 关键参数:
- SCLK最小周期:20 ns(50 MHz)
- SYNC到SCLK建立时间(t5):≥13 ns
- 数据建立/保持时间(t9/t10):6 ns / 5 ns
-
操作示例
- 单通道写入 :
命令位011
+ 地址000
(DAC-A) + 16位数据 → 直接更新输出。 - 多通道同步 :
先写入各通道数据(命令位000
),再触发LDAC下降沿。
- 单通道写入 :
四、读取流程
⚠️ 重要限制:
DAC8562 不支持数据回读。其SPI接口为单向写入,无MISO或数据输出引脚。需通过外部ADC或监控电路读取输出值。
五、STM32CubeMX配置
验证版本:STM32CubeMX 6.11.1
引脚类型与功能:
- GPIO Pins :关键标签引脚:
- PA4: 配置为GPIO Output,标签DAC_NSS(用于DAC芯片的片选信号)。
- PB8: 配置为GPIO Output,标签DAC_LDAC(用于DAC的加载信号)。
- PB9: 配置为GPIO Output,标签DAC_CLR(用于DAC的清除信号)。
- 所有GPIO模式:Output Push Pull(推挽输出),无上下拉电阻。
- 外设引脚 :
- SPI1: PA1 (SCK), PA6 (MISO), PA12 (MOSI),配置为Alternate Function Push Pull。
- SPI1 (Full-Duplex Master):
- 基本参数 :
- Frame Format: Motorola(标准SPI帧格式)。
- Data Size: 8 Bits,适合DAC8562通信。
- First Bit: MSB First(高位优先)。
- Baud Rate: 2.5 MBits/s,Prescaler设为32以匹配速率。
- Clock Polarity (CPOL): Low(时钟极性低)。
- Clock Phase (CPHA): 1 Edge(时钟相位第1边沿)。
- 高级参数 :
- CRC Calculation: Disabled(无CRC校验)。
- NSSP Mode: Enabled(软件控制片选),NSS Signal Type: Software(通过GPIO手动控制,PA4)。
六、代码部分(完整代码)
只要你按照上面的流程完成cubemx配置并生成代码后,将一下代码加入工程即可直接使用。
上传之后下载太贵,直接放出完整代码,轻松使用~
dac_8562.h
cpp
#ifndef DAC8562_H
#define DAC8562_H
#include "stm32l4xx_hal.h"
// 命令集 (数据手册Table 17)
typedef enum {
CMD_WRITE_INPUT_REG = 0x00, // 写入输入寄存器
CMD_SOFTWARE_LDAC = 0x08, // 软件LDAC更新
CMD_WRITE_UPDATE_ALL = 0x10, // 写入并更新所有DAC
CMD_WRITE_UPDATE_SINGLE = 0x18, // 写入并更新单个DAC
CMD_POWER_MODE = 0x20, // 电源模式控制
CMD_SOFTWARE_RESET = 0x28, // 软件复位
CMD_LDAC_REGISTER = 0x30, // LDAC寄存器配置
CMD_INTERNAL_REF = 0x38 // 内部基准源控制
} DAC8562_Command;
// 通道选择
typedef enum {
DAC_CH_A = 0x00, // 通道A
DAC_CH_B = 0x01, // 通道B
DAC_CH_BOTH = 0x07 // 双通道
} DAC8562_Channel;
// 增益设置
typedef enum {
DAC_GAIN_1 = 0x03, // 增益x1
DAC_GAIN_2 = 0x00 // 增益x2
} DAC8562_Gain;
// 电源模式
typedef enum {
DAC_PWR_UP = 0x03, // 上电模式
DAC_PWR_DOWN = 0x23 // 掉电模式
} DAC8562_PowerMode;
// 设备句柄
typedef struct {
SPI_HandleTypeDef *hspi;
GPIO_TypeDef *cs_port;
uint16_t cs_pin;
} DAC8562_HandleTypeDef;
// 初始化配置
uint8_t DAC8562_Init(DAC8562_HandleTypeDef *hdac);
// 核心功能
uint8_t DAC8562_Write(DAC8562_HandleTypeDef *hdac, DAC8562_Channel ch, uint16_t data);
uint8_t DAC8562_WriteVoltage(DAC8562_HandleTypeDef *hdac, DAC8562_Channel ch, float voltage);
uint8_t DAC8562_SetGain(DAC8562_HandleTypeDef *hdac, DAC8562_Gain gain);
uint8_t DAC8562_SetPowerMode(DAC8562_HandleTypeDef *hdac, DAC8562_PowerMode mode);
uint8_t DAC8562_Reset(DAC8562_HandleTypeDef *hdac);
#endif
dac_8562.c
cpp
#include "dac8562.h"
#include <math.h>
// 私有函数:SPI传输封装
static uint8_t SPI_Transmit(DAC8562_HandleTypeDef *hdac, uint8_t *data, uint16_t size) {
HAL_GPIO_WritePin(hdac->cs_port, hdac->cs_pin, GPIO_PIN_RESET);
HAL_StatusTypeDef status = HAL_SPI_Transmit(hdac->hspi, data, size, HAL_MAX_DELAY);
HAL_GPIO_WritePin(hdac->cs_port, hdac->cs_pin, GPIO_PIN_SET);
return (status == HAL_OK);
}
// 初始化函数
uint8_t DAC8562_Init(DAC8562_HandleTypeDef *hdac) {
uint8_t status = 1;
status &= DAC8562_Reset(hdac);
status &= DAC8562_SetPowerMode(hdac, DAC_PWR_UP);
// 启用内部基准源 (2.5V)
uint8_t ref_cmd[3] = {CMD_INTERNAL_REF, 0x00, 0x01};
status &= SPI_Transmit(hdac, ref_cmd, sizeof(ref_cmd));
// 设置增益x1
status &= DAC8562_SetGain(hdac, DAC_GAIN_1);
return status;
}
// 写入原始数据
uint8_t DAC8562_Write(DAC8562_HandleTypeDef *hdac, DAC8562_Channel ch, uint16_t data) {
uint8_t tx_data[3] = {
CMD_WRITE_UPDATE_SINGLE | ch,
(data >> 8) & 0xFF,
data & 0xFF
};
return SPI_Transmit(hdac, tx_data, sizeof(tx_data));
}
// 写入电压值 (自动计算DAC码)
uint8_t DAC8562_WriteVoltage(DAC8562_HandleTypeDef *hdac, DAC8562_Channel ch, float voltage) {
const float VREF = 2.5f; // 内部基准电压
uint16_t dac_code = (uint16_t)round((voltage * 65536) / (VREF * 1)); // 增益x1
return DAC8562_Write(hdac, ch, dac_code);
}
// 设置增益
uint8_t DAC8562_SetGain(DAC8562_HandleTypeDef *hdac, DAC8562_Gain gain) {
uint8_t tx_data[3] = {CMD_LDAC_REGISTER, 0x00, (uint8_t)gain};
return SPI_Transmit(hdac, tx_data, sizeof(tx_data));
}
// 电源控制
uint8_t DAC8562_SetPowerMode(DAC8562_HandleTypeDef *hdac, DAC8562_PowerMode mode) {
uint8_t tx_data[3] = {CMD_POWER_MODE, 0x00, (uint8_t)mode};
return SPI_Transmit(hdac, tx_data, sizeof(tx_data));
}
// 复位设备
uint8_t DAC8562_Reset(DAC8562_HandleTypeDef *hdac) {
uint8_t tx_data[3] = {CMD_SOFTWARE_RESET, 0x00, 0x01};
return SPI_Transmit(hdac, tx_data, sizeof(tx_data));
}
main.c
cpp
#include "dac8562.h"
// 1. 声明设备句柄
DAC8562_HandleTypeDef hdac = {
.hspi = &hspi1, // CubeMX生成的SPI句柄
.cs_port = DAC_NSS_GPIO_Port,
.cs_pin = DAC_NSS_Pin
};
int main(void) {
HAL_Init();
SystemClock_Config();
MX_SPI1_Init(); // SPI初始化
// 2. 初始化DAC8562
if(!DAC8562_Init(&hdac)) {
Error_Handler(); // 处理初始化失败
}
// 3. 输出2.0V到通道A
DAC8562_WriteVoltage(&hdac, DAC_CH_A, 2.0f);
// 4. 输出1.5V到通道B (原始码方式)
uint16_t dac_code = (uint16_t)round((1.5f * 65536) / 2.5f);
DAC8562_Write(&hdac, DAC_CH_B, dac_code);
// 5. 进入低功耗模式
DAC8562_SetPowerMode(&hdac, DAC_PWR_DOWN);
while(1) {
// 6. 唤醒后更新输出
DAC8562_SetPowerMode(&hdac, DAC_PWR_UP);
DAC8562_WriteVoltage(&hdac, DAC_CH_A, 3.0f);
HAL_Delay(1000);
}
}
七、接线说明(与CubeMX配置匹配)
DAC8562引脚 | STM32引脚 | CubeMX标签 |
---|---|---|
DIN | PA12 | SPI1_MOSI |
SCLK | PA1 | SPI1_SCK |
/SYNC | PA4 | DAC_NSS |
/LDAC | PB8 | DAC_LDAC |
/CLR | PB9 | DAC_CLR |
关键硬件配置 :
根据CubeMX设置,
DAC_LDAC
和DAC_CLR
已配置为GPIO输出模式,驱动中默认/LDAC
接地,/CLR
接VDD,确保同步更新和清除功能禁用。