【硬件SPI】STM32 AD5422芯片手册学习/例程
2026/6/26 8:07:33 网站建设 项目流程

手册解析文章参考:AD5422的使用(控制输出不同范围的电压电流值)-CSDN博客


目录

AD5422

一、AD5422简介

二、AD5422的使用

1.写数据

2.读数据

3.AD5422操作流程

(1)操作复位寄存器

(2)操作控制寄存器进行初始化。

(3)操作数据寄存器 控制输出电流值<初始化配置的时候讲数据寄存器清零>

(4)读取寄存器写入值

(5)总体代码调用


AD5422

一、AD5422简介

AD5422是低成本、精密、完全集成、12/16位数模转换器(DAC),内置可编程电流源和可编程电压输出。
输出电流范围可编程设置为4 mA至20 mA、0 mA至20 mA或者超量程的0 mA至24 mA。
电压输出由一个独立引脚提供,该引脚可配置成提供0 V至5 V、0 V至10 V、±5 V或±10 V输出范围;所有范围均提供10%的超量程。
含有一个异步清零引脚(CLEAR),它可将输出设置为零电平/中间电平电压输出或将输出设置为选定电流范围的低端。
灵活的串行接口为SPI和MICROWIRE兼容型,可以采用三线式模式工作,从而极大地降低隔离应用的数字隔离要求。
简言之,就是可以控制输出不同的电流和电压,以匹配我们的需求。
可应用于在检测到不同信号时,调整不同输出。


二、AD5422的使用

AD5422通过一个多功能三线式串行接口受控,该接口以最高30 MHz的时钟速率工作,与SPI、QSPI™、MICROW-IRE和DSP标准兼容。
本文AD5422的使用主要通过SPI进行数据的读写传输。而后在不同寄存器中写值,来完成不通的操作。也可通过读数据来获取寄存器中写入的值。
书写代码时,最重要的就是写数据读数据的操作。

1.写数据

下图为写入数据的时序图

输入移位寄存器24位宽。数据在串行时钟输入SCLK的控 制下首先作为24位字载入器件MSB中。数据在SCLK的上升 沿逐个输入。输入寄存器包括8个地址位和16个数据位, 如表7所示。
该24位字在LATCH引脚的上升沿无条件锁存。 数据继续逐个输入,与LATCH的状态无关。在LATCH的 上升沿,锁存输入寄存器中存在的数据;换言之,要在 LATCH的上升沿之前逐个输入的最后24位是锁存的数据。写入时序图给出了这种操作的时序图。

上述的话,通俗来讲,意思就是:在 LATCH 引脚上升沿之前,把完整 24 位数据移入 24 位输入移位寄存器;LATCH 上升沿到来时,会锁存此刻移位寄存器内的全部数据,更新硬件输出端口并保持稳定。

匹配上面时序图可以书写写数据的代码:

void Func_AD5422SpiTx(STR_GpioStruct *pCs, STR_SpiStruct *pSpi, uint8_t nRegister, uint16_t wData) // AD5422 { uint8_t nData[3] = {0}; nData[0] = nRegister; //寄存器地址 nData[1] = wData >> 8;//高八位数据 nData[2] = wData; //低八位数据 Gpio_setPinStatus(pCs, PIN_SET_LOW);//拉点LATCH引脚 while(pSpi->pxDriver->GetStatus().busy == 1) {}//等待SPI通信开始 pSpi->pxDriver->Send(nData, 3);//提供24个SCLK 传输数据 while(pSpi->pxDriver->GetStatus().busy == 1) {}//等待SPI通信结束 Gpio_setPinStatus(pCs, PIN_SET_HIGH);//锁存数据 osDelay(1); }

写入操作

Func_AD5422SpiTx(pCs, pSpi, 0x01, wRet);//wRet为需要SPI传输的码值,0x01为数据寄存器

说明:0X01为数据寄存器,wRet为SPI传输的码值。

2.读数据

下图为回读数据的时序图

回读操作
通过在写入输入寄存器时设置地址字节<0x02>读取地址<0x01>(见表9 和表11)可调用回读模式。接下来写入AD5412/AD5422的应 该是一个NOP命令,该命令从先前寻址的寄存器逐个输出 数据,如图3所示。寻址AD5412/AD5422进行读取操作之后SDO引脚默认禁 用;LATCH的上升沿使能SDO引脚预测逐个输出的数据。 数据在SDO上逐个输出后,LATCH的上升沿禁用(三态) SDO引脚。例如,要读回数据寄存器,实施如下序列:
1.0x020001写入输入寄存器。这采用选定数据寄存器配
置用于读取模式的器件。
2.然后进行第二次写入:一个NOP条件,即0x000000。在
此写入期间,来自寄存器的数据在SDO线路上逐个输出。

匹配上面时序图可以书写写数据的代码:

uint16_t Func_AD5422Read(STR_GpioStruct *pCs, STR_SpiStruct *pSpi, uint8_t nRegister, uint16_t wData) // AD5422 { uint8_t nData[3] = {0}; uint16_t nRback = 0;; uint8_t nRead_Data[3] = {0}; nData[0] = nRegister;//0x02 nData[1] = wData >> 8; nData[2] = wData;//0x0001 Gpio_setPinStatus(pCs, PIN_SET_LOW); while(pSpi->pxDriver->GetStatus().busy == 1) {} pSpi->pxDriver->Send(nData, 3);//发送0X020001指令 while(pSpi->pxDriver->GetStatus().busy == 1) {} Gpio_setPinStatus(pCs, PIN_SET_HIGH); osDelay(1); Gpio_setPinStatus(pCs, PIN_SET_LOW); while(pSpi->pxDriver->GetStatus().busy == 1) {} pSpi->pxDriver->Receive(nRead_Data, 3);//接收的时候底层会自己发送NOP哑数据 while(pSpi->pxDriver->GetStatus().busy == 1) {} Gpio_setPinStatus(pCs, PIN_SET_HIGH); nRback = (nRead_Data[1] << 8) + nRead_Data[2];//拼接回传的U16数据 return nRback; }

回读操作:

Func_AD5422Read(pCs, pSpi, 0x02, 0x0001);

0x02是回读寄存器,0x0001是数据寄存器,拼接起来即0x020001,之后RECEIVE函数接收的时候回自己发送NOP哑指令。

3.AD5422操作流程

1.操作复位
2.初始化配置控制寄存器
3.在数据寄存器中写入值,控制输出电流
4.可以读取寄存器的值,判断数据是否正确写入,例如读取状态寄存器检测故障

下图是操作流程图 :

(1)操作复位寄存器

由图可知,复位只需向复位寄存器的地址0x56中的D0位写入1即可完成复位操作

直接调用我们的Func_AD5422SpiTx函数(函数原型在上文写操作),代码如下

Func_AD5422SpiTx(pCs, pSpi, 0x56, 0x0001);
(2)操作控制寄存器进行初始化。

控制寄存器通过将输入移位寄存器的地址字设置为0x55寻址。要写入控制寄存器的数据输入D15至D0位置中,如表14所示。控制寄存器功能如表15所示。

这个要根据工程所使用的参数来填入相对应的数据,这里我写的数据仅以我工程中的配置举例

Func_AD5422SpiTx(pCs, pSpi, 0x55, 0x31B1);

参数解析:

0x31B1转成二进制数为0011 0001 1011 0001

对应上图中置位了REXT OUTEN SR时钟 SR跳跃 SREN DCEN

输出范围是0-10V电压

(3)操作数据寄存器 控制输出电流值<初始化配置的时候讲数据寄存器清零>

数据寄存器通过将输入移位寄存器的地址字设置为0x01寻址。对于AD5412,要写入至数据寄存器的数据输入D15至D4位置中,而对于AD5422,输入D15至D0位置。

数据寄存器写入的值匹配输出的电压或是电流,存在一个计算公式如下:
电压输出
对以下公式进行变换,求出我们需要的D,也就是我们给到数据寄存器的值。其中DAC分辨率为16。VREFIN一般要求输入5V。REFOUT输出5V,一般直接连接到REFIN。

电流输出
电流输出同上,计算出我们需要的D值。其中DAC分辨率为16。

Func_AD5422SpiTx(pCs, pSpi, 0x01, 0);
(4)读取寄存器写入值

例如读状态寄存器,读寄存器类似不再说明。

直接调用上述回读函数Func_AD5422Read<读0x02回读寄存器中的以下指令>即可

0x0000 状态寄存器

0x0001 数据寄存器

0x0010 控制寄存器

(5)总体代码调用

1.复位
2.初始化配置,例如电压、电流输出范围。
3.根据要输出的电流值转换成给到AD5422的值,配置数据寄存器,从而输出电流。
4.根据需要选择读取寄存器,检测故障等。

初始化代码如下:

void Func_AD5422_RegisterInit(STR_GpioStruct *pCs, STR_SpiStruct *pSpi, uint8_t nMode) { Func_AD5422SpiTx(pCs, pSpi, 0x56, 0x0001); osDelay(1); Func_AD5422SpiTx(pCs, pSpi, 0x55, 0x31B1); osDelay(1); Func_AD5422SpiTx(pCs, pSpi, 0x01, 0); }

手册部分大部分文字描述转载开头博客,供个人理解学习参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询