【硬件SPI】STM32 AD5422芯片手册学习/例程

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


目录

AD5422

一、AD5422简介

二、AD5422的使用

1.写数据

2.读数据

3.AD5422操作流程

(1)操作复位寄存器

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

[(3)操作数据寄存器 控制输出电流值<初始化配置的时候讲数据寄存器清零>](#(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 上升沿到来时,会锁存此刻移位寄存器内的全部数据,更新硬件输出端口并保持稳定。

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

cs 复制代码
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);
}

写入操作

cs 复制代码
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 线路上逐个输出。

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

cs 复制代码
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;
}

回读操作:

cs 复制代码
Func_AD5422Read(pCs, pSpi, 0x02, 0x0001);

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

3.AD5422操作流程

1.操作复位

2.初始化配置控制寄存器

3.在数据寄存器中写入值,控制输出电流

4.可以读取寄存器的值,判断数据是否正确写入,例如读取状态寄存器检测故障

下图是操作流程图 :

(1)操作复位寄存器

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

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

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

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

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

cs 复制代码
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。

cs 复制代码
Func_AD5422SpiTx(pCs, pSpi, 0x01, 0);
(4)读取寄存器写入值

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

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

0x0000 状态寄存器

0x0001 数据寄存器

0x0010 控制寄存器

(5)总体代码调用

1.复位

2.初始化配置,例如电压、电流输出范围。

3.根据要输出的电流值转换成给到AD5422的值,配置数据寄存器,从而输出电流。

4.根据需要选择读取寄存器,检测故障等。

初始化代码如下:

cs 复制代码
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);
}

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