一 简介
DA5449使用双缓冲的3线串行接口,与SPI、QSPI™、MICROWIRE™和大多数DSP接口标准兼容。此外,串行数据输出(SDO)引脚允许在使用多个封装时进行菊花链连接。数据读取功能允许用户通过SDO引脚读取DAC寄存器的内容。在上电时,内部移位寄存器和锁存器被填充为0,DAC输出为零量程.
二 引脚功能
LDAC: 加载DAC输入。当此信号降低时,DAC将异步更新。或者,如果此线保持永久低电平,则选择自动或同步更新模式,其中在设备处于独立模式时,DAC在第16个时钟下降边更新,或在处于菊花链模式时,在SYNC上升边更新
SCLK:串行时钟输入。默认情况下,数据在串行时钟输入的下降边被时钟到输入移位寄存器。或者,通过串行控制位,可以将设备配置为数据在SCLK的上升边时钟到移位寄存器。
SDIN:串行数据输入。数据被输入到串行时钟输入的活动边缘上的16位输入寄存器中。默认情况下,数据在上电时进入SCLK下降沿的移位寄存器。控制位允许用户将活动沿更改为上升沿
SDO:串行数据输出。串行数据输出。该引脚允许多个部件菊花链连接。默认情况下,数据在下降边时钟到移位寄存器,在SCLK的上升边通过SDO时钟出。数据总是在加载数据到移位寄存器的交替边时钟出。将读取控制字写入移位寄存器,使DAC寄存器内容可用于在SDO引脚上读取,并在下一个16个与活动时钟边相反的时钟边时钟出。
SYNC:低电平控制输入。该引脚为输入数据提供帧同步信号。当SYNC降低时,它启用SCLK和DIN缓冲器,并启用输入移位寄存器。数据在随后时钟的活跃边加载到移位寄存器。在独立模式下,串行接口计数时钟,并在第16个活跃时钟边将数据锁存到移位寄存器
CLR:低电平控制输入。该引脚清除DAC输出、输入和DAC寄存器。配置模式允许用户根据需要启用硬件CLR引脚作为清零量程或中位数量程。
三 低功耗
为了尽量减少设备的功耗,接口只有在写入设备时才完全上电,即在SYNC下降沿上电。在同步的上升沿上,SCLK和SDIN输入缓冲区断电。
四 寄存器
控制位C3到控制位C0允许控制DAC的各种功能,如表11所示。DAC在上电时的默认设置是在下降沿时钟边沿将数据时钟到移位寄存器中,并启用菊花链模式。设备上电时,DAC寄存器和IOUT线加载为零比例负载。DAC控制位允许用户在上电时调整某些功能。例如,如果未使用,可以禁用菊花链,将活动时钟边沿更改为上升沿,DAC输出可以清除为零比例或中间比例。用户还可以启动DAC寄存器内容的读回以进行验证。
DSY允许启用或禁用菊花链模式。1启用菊花链模式;0禁用菊花链模式。当禁用时,读回请求被接受;SDO自动启用;相关DAC的DAC寄存器内容在SDO上时钟出;当完成时,SDO再次被禁用。
SDO控制(SDO1和SDO2) SDO位使用户能够控制SDO输出驱动器强度,禁用SDO输出或配置为开漏驱动器。SDO驱动器的强度影响t12的时序,当驱动器更强时,可以实现更快的时钟周期
硬件CLR位(HCLR) 硬件CLR位的默认设置是将寄存器和DAC输出清零。HCLR位中的1允许CLR引脚将DAC输出清零到中间比例,而0则清零到零比例
活动时钟边沿(SCLK) 默认的活动时钟边沿是下降沿。将1写入该位以在上升沿时钟数据,或将0写入以在下降沿时钟数据。
五 功能函数
SYNC Function
同步(SYNC)是一个边沿触发的输入,作为帧同步信号和芯片使能。只有在SYNC为低时才能将数据传输到设备。要开始串行数据传输,应将SYNC拉低,同时考虑最小的SYNC下降沿到SCLK下降沿的建立时间t4。
Daisy-Chain Mode
菊花链模式是默认的上电模式。要禁用菊花链功能,请将1001写入控制字。在菊花链模式下,内部SCLK的门控被禁用。当SYNC为低时,SCLK会持续应用到输入移位寄存器中。如果应用了超过16个时钟脉冲,则数据会从移位寄存器中溢出并出现在SDO线上。此数据在SCLK的上升边沿时钟出(默认设置;使用控制字更改活动边沿),在SCLK的下降边沿有效(默认设置)。通过将此线连接到链中下一个设备的SDIN输入,可以构建多设备接口。对于系统中的每个设备,都需要16个时钟脉冲。因此,总时钟周期数必须等于16n,其中n是链中的总设备数。参见图4。当将所有设备的串行传输完成后,应将SYNC拉高。这可以防止额外的数据被时钟到输入移位寄存器中。可以使用包含确切时钟周期数的突发时钟,然后将SYNC拉高。在SYNC的上升边沿后,数据会自动从每个设备的输入移位寄存器传输到被寻址的DAC。当控制位= 0000时,设备处于无操作模式。在用户不想更改链中特定DAC的设置的菊花链应用程序中,这可能很有用。将0000写入该DAC的控制位;随后的数据位将被忽略
Standalone Mode
上电后,在控制字上写1001,关闭菊花链模式。SYNC的第一个下降沿重置串行时钟计数器,以确保正确的位数被移进和移出串行移位寄存器。在16位写周期期间的SYNC边导致设备中止当前写周期。在第16个SCLK脉冲的下降沿之后,数据自动从输入移位寄存器传输到DAC。为了进行另一次串行传输,计数器必须通过SYNC的下降沿复位。
LDAC Function
LDAC函数允许对DAC输出进行异步和同步更新。当该信号变低时,DAC被异步更新。或者,如果该线永久保持低电平,则选择自动或同步更新模式,即当设备处于独立模式时,DAC在第16个时钟下降沿上更新,或者当设备处于雏菊链模式时,在SYNC的上升沿上更新
Software LDAC Function
无论LDAC引脚上的电压水平如何,加载更新模式也可以用作软件更新功能
六 代码部分
控制字
/* AD5449 */
/******************************************************************************/
/* Input Shift Register */
#define AD5449_CTRL_BITS(x) (((unsigned short)(x) & 0xF) << 12)
#define AD5449_DATA_BITS(x) ((unsigned short)(x) & 0xFFF)/* Input Shift Register: AD5449_CTRL_BITS(x)*/
#define AD5449_CTRL_NOP 0 // No operation (power-on default).
#define AD5449_CTRL_A_LOAD_UPDATE 1 // Load and update.
#define AD5449_CTRL_A_READBACK 2 // Initiate readback.
#define AD5449_CTRL_A_LOAD_INPUT_REG 3 // Load input register.
#define AD5449_CTRL_B_LOAD_UPDATE 4 // Load and update.
#define AD5449_CTRL_B_READBACK 5 // Initiate readback.
#define AD5449_CTRL_B_LOAD_INPUT_REG 6 // Load input register.
#define AD5449_CTRL_AB_UPDATE 7 // Update DAC outputs.
#define AD5449_CTRL_AB_LOAD_INPUT_REG 8 // Load input registers.
#define AD5449_CTRL_DISBL_DAISY 9 // Disable daisy-chain. 禁用菊花链
#define AD5449_CTRL_CLK_POS_EDGE 10 // Clock data to shift register on
// rising edge.
#define AD5449_CTRL_CLR_DAC_ZERO 11 // Clear DAC output to zero scale.
#define AD5449_CTRL_CLR_DAC_MIDDLE 12 // Clear DAC output to midscale.
#define AD5449_CTRL_CONTROL_WORD 13 // Control word./* Control Register bits */
#define AD5449_SDO1 (1 << 11) // Weak SDO driver.
#define AD5449_SDO2 (1 << 10) // SDO configured as open drain.
#define AD5449_DSY (1 << 9) // Enables daisy-chain mode.
#define AD5449_HCLR (1 << 8) // Clears DAC output to midscale.
#define AD5449_SCLK (1 << 7) // Clock on rising edge.
AD5449初始化代码,
//spi软件模拟驱动
void SPI_AD5449_Init(void){
AD5449_BSPInit();
// ----CLR 低电平清除DAC输入输出,寄存器
AD5449_CLR_RESET;
delay(5);
AD5449_CLR_SET;
AD5449_LDAC_RESET;
// delay(5);
// AD5449_LDAC_SET;}
//写命令
void WriteAD5499_CMD(uint32_t CMDBits){
uint8_t i;
uint16_t data = CMDBits;
SYNC_SET;
delay(1);
SCLK_SET;
SYNC_RESET;
for(i=0;i<16;i++)
{
SCLK_SET;
if((data&0x8000)!=0)
{
SDIN_SET;
}else
{
SDIN_RESET;
}
delay(1);
SCLK_RESET;
delay(1);
data = (data<<1);
}
SYNC_RESET;
SCLK_SET;
delay(20);}
//写数据
void WriteAD5449(uint16_t ContralBits,uint16_t DAdata)
{
uint8_t i;
uint16_t buf = DAdata;
uint16_t wave_data;
// buf = (buf<<2);
wave_data = (ContralBits |buf);
SYNC_SET;
delay(1);
SCLK_SET;
SYNC_RESET;
for(i=0;i<16;i++)
{
SCLK_SET;
if((wave_data & 0x8000) != 0)
{
SDIN_SET;
}
else
{
SDIN_RESET;
}
delay(1);
SCLK_RESET;
delay(1);
wave_data = (wave_data<<1);
}
SYNC_RESET;
SCLK_SET;
delay(1);
}
void mian(void)
{
AD5449_BSPInit();
uint16_t i =0;
SPI_AD5449_Init();
WriteAD5499_CMD(0xD080);
AD5449_CLR_RESET;
delay_ms(2);
AD5449_CLR_SET;
while(1)
{
// WriteAD5439(0x4000,i);
i += 0x100;
if(i > 0xFFF)
{
i = 0;
}
// delay_ms(500);
WriteAD5439(0x4000,i);
delay_ms(500);}
倒腾了好几天,踩了无数坑。临了才搞通,MD这个芯片没啥资料。主要参考AD5439调试程序及pdf中文资料 (51hei.com)这篇文章。和博主一样时序没问题,输出一直是-5v。找不到问题所在,慌乱之中,发现了这个宝藏博主,彷佛找到一缕曙光。一顿操作,Ctrl C V。编译,烧录,草,还是没用。。。。。。。
没办法继续看手册,看啊看,看啊看,tmd,我发现我用的是5449,博主用的5439。寄存器都不一样。。。。。。。。。。改了下载,ok。成功。