STM32 HAL库 模拟SPI驱动 ADN8810
ADN8810是一个12位电流源,可提供高达300 mA的可调满量程输出电流。满量程输出电流通过两个外部检测电阻进行设置。输出顺从电压为2.5 V,即使当输出电路高达300 mA时。该器件尤其适合可调谐激光控制,可以驱动可调谐激光前置镜、后置镜、相位、增益和放大部分。主机CPU或MCU通过3线式SPI接口控制ADN8810操作。3位地址最多可独立控制8个器件,同时连接到相同的SPI总线。本文主要是介绍讲解STM32 HAL库使用模拟SPI驱动ADN8810。
首先是SPI相关的简介:

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

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

本次用到三个GPIO输出来模拟SPI,此外还使用了两个GPIO输出控制禁用输出和复位。
三个输出口分别对应8810上的三个SPI通信口:
CS: PA4
SCLK: PA5
SDI: PA6
另外的两个输出口连接至8810控制禁用输出和复位:
RESET: PC4
SB: PB12
在具体的应用中可以自行修改头文件中的GPIO口以配合硬件完成工程。
ADN8810 datasheet:
https://www.analog.com/media/en/technical-documentation/data-sheets/ADN8810.pdf

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

在向8810写入数据和正常使用时,RESET应该时刻保持高电平,如果需要进行复位则进行一次拉低拉高,则此时8810的寄存器会清零。
当SB为高电平时正常输出,低电平时8810输出会置于高阻抗状态,此时8810寄存器中的数值依旧保持原样。
通过SPI通信改变寄存器值需要16位的数据,其中第1位一定要置零,第2~4位是地址选择位,如果有同时需要控制多个ADN8810输出的情况,可以通过更改ADN8810的引脚5(ADDR0)、引脚4(ADDR1)和引脚1(ADDR2)的高低电位来设定地址。如ADDR0 = H,ADDR1 = L,ADDR2 = L那么前四位设为0b0001(0x1)即可设定为控制此芯片输出。通过此方法我们可以通过三根线同时控制8块ADN8810。后12位则是0x000(0A)~0xfff(300mA)对应的电流值,其中0x000输出0A、0xfff输出300mA,两者之中的分为4096份(DAC12)。


user_8810.h
user_8810.c
使用示例
参考文献:
ADN8810 | 源/吸电流数模转换器 | 亚德诺(ADI)半导体: https://www.analog.com/media/en/technical-documentation/data-sheets/ADN8810.pdf