STM32 DAC8734 4路16位DA驱动程序

一、DAC8734 芯片概述

DAC8734 是 TI 推出的 4通道、16位、电压输出 DAC ,采用 SPI 接口,特别适合 数字电源基准、偏置电压、校准系统

参数 规格
分辨率 16位
通道数 4路(A/B/C/D)
接口 SPI(最高 50MHz)
输出电压 ±10V、±5V、0-10V、0-5V
参考电压 内部 2.5V / 外部
封装 TSSOP-38

二、硬件连接(STM32 ↔ DAC8734)

推荐连接方式

复制代码
STM32           DAC8734
────────────────────────
SPIx_SCK   ───► SCLK
SPIx_MOSI  ───► SDIN
SPIx_MISO  ◄─── SDOUT
GPIOx_PIN  ───► SYNC (CS)
GPIOx_PIN  ───► LDAC
GPIOx_PIN  ◄─── RDY
GPIOx_PIN  ───► RST

电压配置跳线

PIN 配置
RNG0 / RNG1 输出电压范围
REFSEL 参考电压选择

三、DAC8734 寄存器定义

寄存器地址

c 复制代码
/* DAC8734 寄存器地址 */
#define DAC_REG_A        0x00
#define DAC_REG_B        0x01
#define DAC_REG_C        0x02
#define DAC_REG_D        0x03
#define DAC_REG_ALL      0x04

#define DAC_GAIN_REG     0x08
#define DAC_OFFSET_REG   0x09
#define DAC_CONFIG_REG   0x0A
#define DAC_STATUS_REG   0x0B

命令帧格式(24位)

复制代码
23:20 - 命令位
19:16 - 地址位
15:0  - 数据位

四、STM32 SPI 底层驱动

1、SPI 初始化(CubeMX 配置)

c 复制代码
/* SPI 配置参数 */
/*
Mode: Full-Duplex Master
Hardware NSS: Disable
Data Size: 8 bits
Prescaler: 8~32 (≥10MHz)
CPOL: Low
CPHA: 1 Edge
First Bit: MSB
*/

2、SPI 读写函数

c 复制代码
#include "spi.h"

static uint8_t SPI_TransferByte(SPI_HandleTypeDef *hspi, uint8_t data)
{
    uint8_t rxdata;
    HAL_SPI_TransmitReceive(hspi, &data, &rxdata, 1, 100);
    return rxdata;
}

static void SPI_Write24Bits(SPI_HandleTypeDef *hspi, uint32_t data)
{
    SPI_TransferByte(hspi, (data >> 16) & 0xFF);
    SPI_TransferByte(hspi, (data >> 8)  & 0xFF);
    SPI_TransferByte(hspi, data & 0xFF);
}

五、DAC8734 驱动核心代码

dac8734.h

c 复制代码
#ifndef __DAC8734_H
#define __DAC8734_H

#include "stm32f4xx_hal.h"

/* 输出范围 */
typedef enum {
    DAC_RANGE_0_5V   = 0x00,
    DAC_RANGE_0_10V  = 0x01,
    DAC_RANGE_5V     = 0x02,
    DAC_RANGE_10V    = 0x03,
    DAC_RANGE_5V_NEG = 0x04,
    DAC_RANGE_10V_NEG= 0x05
} DAC_Range_t;

/* 通道定义 */
typedef enum {
    DAC_CH_A = 0,
    DAC_CH_B = 1,
    DAC_CH_C = 2,
    DAC_CH_D = 3,
    DAC_CH_ALL = 4
} DAC_Channel_t;

/* 设备句柄 */
typedef struct {
    SPI_HandleTypeDef *hspi;
    GPIO_TypeDef *cs_port;
    uint16_t cs_pin;
    GPIO_TypeDef *ldac_port;
    uint16_t ldac_pin;
    GPIO_TypeDef *rst_port;
    uint16_t rst_pin;
} DAC8734_Handle_t;

/* API */
HAL_StatusTypeDef DAC8734_Init(DAC8734_Handle_t *hdac);
HAL_StatusTypeDef DAC8734_SetVoltage(DAC8734_Handle_t *hdac,
                                     DAC_Channel_t ch,
                                     float voltage);
HAL_StatusTypeDef DAC8734_SetRange(DAC8734_Handle_t *hdac,
                                   DAC_Channel_t ch,
                                   DAC_Range_t range);
HAL_StatusTypeDef DAC8734_SoftwareUpdate(DAC8734_Handle_t *hdac);

#endif

dac8734.c

c 复制代码
#include "dac8734.h"
#include <math.h>

#define DAC8734_CS_LOW(h)   HAL_GPIO_WritePin((h)->cs_port, (h)->cs_pin, GPIO_PIN_RESET)
#define DAC8734_CS_HIGH(h)  HAL_GPIO_WritePin((h)->cs_port, (h)->cs_pin, GPIO_PIN_SET)
#define DAC8734_LDAC_LOW(h) HAL_GPIO_WritePin((h)->ldac_port,(h)->ldac_pin,GPIO_PIN_RESET)
#define DAC8734_LDAC_HIGH(h)HAL_GPIO_WritePin((h)->ldac_port,(h)->ldac_pin,GPIO_PIN_SET)

/* 内部写函数 */
static void DAC8734_WriteReg(DAC8734_Handle_t *hdac, uint8_t addr, uint16_t data)
{
    uint32_t frame = ((uint32_t)addr << 16) | data;

    DAC8734_CS_LOW(hdac);
    SPI_Write24Bits(hdac->hspi, frame);
    DAC8734_CS_HIGH(hdac);
}

/* 初始化 */
HAL_StatusTypeDef DAC8734_Init(DAC8734_Handle_t *hdac)
{
    /* 复位 */
    if (hdac->rst_port) {
        HAL_GPIO_WritePin(hdac->rst_port, hdac->rst_pin, GPIO_PIN_RESET);
        HAL_Delay(10);
        HAL_GPIO_WritePin(hdac->rst_port, hdac->rst_pin, GPIO_PIN_SET);
    }

    /* 配置默认输出范围 */
    for (int i = 0; i < 4; i++) {
        DAC8734_SetRange(hdac, i, DAC_RANGE_0_10V);
    }

    return HAL_OK;
}

/* 设置电压 */
HAL_StatusTypeDef DAC8734_SetVoltage(DAC8734_Handle_t *hdac,
                                      DAC_Channel_t ch,
                                      float voltage)
{
    uint16_t code;

    /* ±10V 范围示例 */
    if (voltage > 10.0f) voltage = 10.0f;
    if (voltage < 0.0f)  voltage = 0.0f;

    code = (uint16_t)((voltage / 10.0f) * 65535.0f);

    DAC8734_WriteReg(hdac, ch, code);

    /* 软件触发更新 */
    DAC8734_SoftwareUpdate(hdac);

    return HAL_OK;
}

/* 设置输出范围 */
HAL_StatusTypeDef DAC8734_SetRange(DAC8734_Handle_t *hdac,
                                   DAC_Channel_t ch,
                                   DAC_Range_t range)
{
    uint16_t gain_code = 0;

    switch (range) {
        case DAC_RANGE_0_5V:   gain_code = 0x0000; break;
        case DAC_RANGE_0_10V:  gain_code = 0x0001; break;
        case DAC_RANGE_5V:     gain_code = 0x0002; break;
        case DAC_RANGE_10V:    gain_code = 0x0003; break;
        default: return HAL_ERROR;
    }

    DAC8734_WriteReg(hdac, DAC_GAIN_REG + ch, gain_code);
    return HAL_OK;
}

/* 软件 LDAC 更新 */
HAL_StatusTypeDef DAC8734_SoftwareUpdate(DAC8734_Handle_t *hdac)
{
    DAC8734_LDAC_LOW(hdac);
    __NOP(); __NOP(); __NOP();
    DAC8734_LDAC_HIGH(hdac);
    return HAL_OK;
}

六、使用示例(数字电源场景)

c 复制代码
DAC8734_Handle_t dac8734 = {
    .hspi = &hspi1,
    .cs_port = GPIOA,
    .cs_pin = GPIO_PIN_4,
    .ldac_port = GPIOA,
    .ldac_pin = GPIO_PIN_5,
};

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_SPI1_Init();

    DAC8734_Init(&dac8734);

    /* 设置 4 路基准电压 */
    DAC8734_SetVoltage(&dac8734, DAC_CH_A, 3.3f);  // 参考电压
    DAC8734_SetVoltage(&dac8734, DAC_CH_B, 5.0f);  // 偏置
    DAC8734_SetVoltage(&dac8734, DAC_CH_C, 1.8f);  // 软启动斜率
    DAC8734_SetVoltage(&dac8734, DAC_CH_D, 0.5f);  // 保护阈值

    while (1) {
        /* 动态调整 */
        DAC8734_SetVoltage(&dac8734, DAC_CH_A, 3.0f);
        HAL_Delay(1000);
    }
}

参考代码 STM32 DAC8734 4路16位DA驱动程序 www.youwenfan.com/contentcsv/72602.html

七、校准功能

c 复制代码
/* 两点校准 */
void DAC8734_Calibrate(DAC8734_Handle_t *hdac,
                        DAC_Channel_t ch,
                        float real_v1, float set_v1,
                        float real_v2, float set_v2)
{
    float gain = (real_v2 - real_v1) / (set_v2 - set_v1);
    float offset = real_v1 - gain * set_v1;

    /* 写入 OFFSET / GAIN 寄存器 */
}

八、常见问题排查

现象 原因 解决
无输出 CS 时序错误 检查 SYNC 低电平宽度
输出不准 参考电压漂移 使用外部 2.5V 基准
噪声大 SPI 串扰 缩短走线,加 RC
多路耦合 LDAC 未同步 统一 LDAC 触发
相关推荐
国科安芯1 小时前
基于RISC-V架构的商业航天级MCU国产化技术路径与产业生态研究
网络·分布式·单片机·嵌入式硬件·架构·risc-v·安全性测试
SmartRadio2 小时前
STM32WLE5 LoRa Smart TDMA 完整协议栈工程实现 -【2】
stm32·单片机·嵌入式硬件·lora·tdma·自组网·smart tdma
国科安芯2 小时前
AS32S601商业航天级抗辐照MCU芯片:架构设计与技术特性研究
单片机·嵌入式硬件·算法·安全·架构·risc-v
搁浅小泽2 小时前
串行I/O 与 并行I/O 口(嵌入式单片机基础,精简易懂)
单片机·嵌入式硬件
踏着七彩祥云的小丑3 小时前
嵌入式测试学习第 20 天:电磁干扰、静电、硬件稳定性
单片机·嵌入式硬件
叁散3 小时前
ESP32智能闹钟系统实验报告
单片机·嵌入式硬件·算法
星夜夏空994 小时前
STM32单片机学习(34) —— ADC实验: ADC规则组配合DMA实现自动化转运
stm32·单片机·学习
星夜夏空994 小时前
FreeRTOS学习(1)——裸机开发与操作系统
单片机·嵌入式硬件·学习
rit84324995 小时前
PIC32MX + FreeRTOS + ENC28J60 + LwIP 构建通讯管理机(通信网关)程序
stm32