单片机
返回首页

STM32 HAL库 模拟SPI驱动 DAC8564

2025-10-24 来源:bilibili

之前写过DAC8560的模拟SPI驱动,相比较而言DAC8564能够在网上找到的内容更加的丰富,本文主要是介绍讲解STM32 HAL库使用模拟SPI驱动DAC8564。


DAC8560

https://www.bilibili.com/opus/519334650730238240


SPI相关的简介:

https://www.bilibili.com/opus/515342298243272188


然后是用STM32CubeMx初始化模拟SPI的引脚:

STM32CubeMx的GPIO输出的配置可以参考:

https://www.bilibili.com/opus/484177792198506654


这里之所以是只用开三个GPIO输出来模拟SPI是因为它只用到了半双工通信。


我所用到的四个输出口分别对应8560上的三个SPI通信口。

    SYNC:PB1

    SCLK:PB0

    DIN:PC5


在具体的应用中可以自行修改头文件中的GPIO口以配合硬件完成工程。

DAC8564 datasheet:

https://www.ti.com/lit/ds/symlink/dac8564.pdf


DAC8564 数据手册:

https://www.ti.com.cn/cn/lit/ds/symlink/dac8564.pdf


SYNC:CS 片选线

SCLK:SCLK 时钟线,用于时钟同步

DIN:DIN(MOSI) 输出24位信号的数据线

    从上面的内容我们可以知道DAC8564是时钟下降沿触发的

    上面这些是我们输出控制DAC8564的控制矩阵,我们常用的是下面这几句

        我们一共需要输出24位的数据,其中前两位是地址选择位,如果有同时需要控制多个DAC8564输出的情况,可以通过更改DAC8564的引脚13(A0)和引脚14(A1)的高低电位来设定地址。如A0 = H,A1 = L,那么前两位设为0b10即可设定为控制此芯片输出。通过此方法我们可以同时控制4块DAC8564。从前数第三到五位我们需要设为0,从前数第六位和第七位则是DAC选择位,可以通过改变它来选择要存入ABCD对应输的寄存器里。从前数第八位为0,后16位则是0x0000(0V)~0xffff(2.5V)对应的电压值,其中0x0000输出0V、0xffff输出2.5V,两者之中的分为65535份。


        注意:此时我们只是把输出的电压数据存入了寄存器中,此时每路DAC输出都不会改变

        如果我们需要改变A0 = L,A1 = L的DAC8564的第B路输出寄存器为输出1V,那么我们应该输出0x26666,再如果我们需要改变A0 = L,A1 = H的DAC8564的第A路输出寄存器为输出2.5V,那么我们应该输出0x80ffff。

        当我们需要在把数据存入寄存器后马上刷新此路的DAC输出,那么从前数第三到五位我们需要设为0b010,其余部分和上面把存入寄存器一样。


        如果我们需要改变A0 = L,A1 = L的DAC8564的第B路输出寄存器为输出1V并且立刻改变该路输出,那么我们应该输出0x126666,再如果我们需要改变A0 = L,A1 = H的DAC8564的第A路输出寄存器为输出2.5V并且立刻改变该路输出,那么我们应该输出0x90ffff。

        改变DAC输出的方法除了像上一段的一路一路更新以外,还可以在更改其中一路的输出寄存器后同时更新所有输出。从前数第三到五位我们需要设为0b100,其余部分和上面把存入寄存器一样。


user_dac8564.h


配合硬件修改对应的IO口


#ifndef __USER_DAC8564_H

#define __USER_DAC8564_H


#ifdef __cplusplus

extern 'C' {

#endif

#include 'main.h'


#define CS_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)

#define CS_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)

#define SCLK_H HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET)

#define SCLK_L HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)

#define DIN_H HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET)

#define DIN_L HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET)

void WriteDac8564(uint32_t Data);


#ifdef __cplusplus

}

#endif


#endif

user_dac8564.c


24位从高到低通过移位的方法依次发出,发送这24位前我们需要先拉低CS,在发送完成后再拉高。


注意:由于是下降沿触发因此我们需要先移位再拉低时钟


#include 'main.h'

#include 'user_dac8564.h'

#include /**

  * 函数名称:DAC8564写函数

  * 函数功能:给DAC8564发数据

  * 形   参:dac值

  * 返回值 :无

  */

void WriteDac8564(uint32_t Data)

{

uint8_t i;

SCLK_H;

DIN_L;

CS_H;

CS_L;

for(i = 0; i < 24;i++)

{

SCLK_H;

if(Data & 0x800000)

DIN_H;

else

DIN_L;

Data<<=1;

SCLK_L;

}

CS_H;

DIN_L;

}


使用示例


WriteDac8564(0xffff); // 更改DAC-A的输出寄存器为输出2.5V

WriteDac8564(0x2ffff); // 更改DAC-B的输出寄存器为输出2.5V

WriteDac8564(0x4ffff); // 更改DAC-C的输出寄存器为输出2.5V

WriteDac8564(0x26ffff); // 更改DAC-D的输出寄存器为输出2.5V,并加载所有路的DAC输出


参考文献:

16 位、四通道、超低毛刺脉冲、电压输出 DAC,具有 2.5V、2ppm/°C 内部基准电压和复位至中标度功能:


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章