因此我们在这个芯片上研究不少韶光,文档和开拓板都很大略,但是自写软件总是掌握不了,走了很大的弯路,直到后面实测创造才创造这个文档有留了一个坑。
这款芯片一大特点便是用一个4线的SPI总线来输入一个分外指令来掌握输出电流的变革,相对付用IO脚来掌握方法,大大节约了硬件管脚数量。
它的事理便是在有一个稳定的输入参考电压(VREFX),通过软件发送SPI指定参数可以动态在在输出端输出 仿照电压,跨度在0-7.5V 电压. 这个特性常用于硬件乘法器,旗子暗记发器等设计.

个中输入电压与输出电压的换算关系知足如下公式
这个公式中,-Vref 是输入电压,一样平常是桓定的5V, Vout为输出电压, 65536是一个常量,这个D就SPI输入换算系数. 65536即2的16次方,可以限定D的最大值不能超过16bit ,这便是由芯片硬件精度限定.
在这个公式里,开头-号表示输入和输出电压极性恰好相反.即输入一个正电压,出来是负电压.
这里顺便是提一下ADI另一颗DAC芯片AD5554是14bit精度,这样公式就换算成
这里16384便是 2的14次方.
硬件解读
这是硬件框图,
在面向上位机 ,有7个管脚,个中CS/SCLK/SCIN/SDO 这是SPI四个标准脚,但这里只须要软件输出即可,SCIN用于多块AD5544串连利用.因此ADI把这个又称为3 wire spi.
其余一个3个功能脚是 MSB 用于设定输出量程, 零代码状态(MSB = 0) 接地
或半量程状态(MSB = 1), MSB脚为0表示全量程,为1表示输出半量程,即参考电压一半(比如即5V输入, -2.5v输出)。这是输出是硬件实行,不须要软件干预,以是可以用于测试芯片硬件是否正常事情。在实际运行直接设为MSB=0
对RS复位管脚,低电平有效置0表示软件复位,相称于软件重启
LDAC管脚,低电平有效,功能加载DAC寄存器选通.相称于spi数据生效.
也便是说最低须要 ldac,cs,sclk,sdo 四个管脚就可以事情了。
为了验证这一过程,ADI供应发板 EVAL-AD5544为例来先容如何掌握AD5544,
按文档先容,专门先容两个实例
翻译过来便是
当输入电压为10v,输入数据为0x4000时,输入地址为0,即产生1/4量程电压,即在 VoutA上产生 -2.5v电压输出
当输入电压为10v,输入数据为0xC000时,输入地址为0,即在 VoutA上产生 -7.5v电压输出
测试下来,的确如此。
软件掌握接口
参考基功能框图,在其SDO端,软件要发来18bit的SPI掌握数据
个中 18bit 的数据中,高2位是地址,低16bit 掌握数据D
地址对应关系如下,用来指明向哪个通道输出电压
但是我们知道,无论单片机还是x86,arm 软件用下传输数据都是基于8对齐,也便是说我们通过spi发送18bit数据,必须要补齐至少24bit,也便是3个byte数据,软件才能操作。
那这多出来6bit补哪里呢?这里文档写明是按msb优先。我们理解成在SPI MSB模式下,首先传输bit17,bit16,自然多出位要补数字低位.但是测试下来芯片如终不为所动.
末了溘然反应过来是否补错了?ADI公布很多芯片的驱动代码,但偏偏就少这款芯片的,后面反应过来,实际上补在数字高位也便是第一个byte低两位便是地址,高位没用。
然后再传输16bit的掌握数据,恰好2byte,至此所有代码一通百通。希望后来的兄弟少走弯路
void US_SPI_Write2Byte(u8 addr_TD, u16 ad5544_data){ u8 tempdata = 0; AD5544_CS_HIGH(); if(addr_TD == 0)//通道0 { AD5544_CS_LOW(); AD5544_ReadWriteByte(0); } else if(addr_TD == 1)//通道1 { AD5544_CS_LOW(); AD5544_ReadWriteByte(1); } else if(addr_TD == 2)//通道2 { AD5544_CS_LOW(); AD5544_ReadWriteByte(2); } else//通道3 { AD5544_CS_LOW(); AD5544_ReadWriteByte(3); } tempdata = (ad5544_data >> 8); //发送高8位 AD5544_ReadWriteByte(tempdata); tempdata = ad5544_data;//发送低8位 AD5544_ReadWriteByte(tempdata); AD5544_CS_HIGH();}