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 内部基准电压和复位至中标度功能:
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




