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

SPI相关的简介:

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

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

这里之所以是只用开三个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口
user_dac8564.c
24位从高到低通过移位的方法依次发出,发送这24位前我们需要先拉低CS,在发送完成后再拉高。
注意:由于是下降沿触发因此我们需要先移位再拉低时钟
使用示例
参考文献:
16 位、四通道、超低毛刺脉冲、电压输出 DAC,具有 2.5V、2ppm/°C 内部基准电压和复位至中标度功能:
https://www.ti.com.cn/cn/lit/ds/symlink/dac8564.pdf