微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 有关DAC8568数模转换器初始化

有关DAC8568数模转换器初始化

时间:10-02 整理:3721RD 点击:

搞了好长时间,端口一直没有电压输出,不知是不是其配置有关,我选的DAC_A通道输出,寄存器是这样写的:

write_32bits(0x0800,0xFFFF,0x1000); //打开内部参考,设置静态模式
write_32bits(0x0400,0x0000,0x1000); //给DAC_A端口上电
write_32bits(0x0000,0xFFFF,0x0000); //写入数据给DAC_A寄存器
write_32bits(0x0300,0xFFFF,0x0000); //写入数据给通道A寄存器并更新A

写32位数据我是分四次写的,先写前面12位,再写中间16位,最后写最后四位。

#include <MSP430G2553.h>

#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define uchar unsigned char
#define uint unsigned int

#define write_pca write_prefix_control_address //写前缀位、控制位、地址位
#define pca prefix_control_address
#define write_fea write_feature //写功能位
#define fea feature

#define SCLK BIT0
#define DO BIT1
//#define DI BIT2
#define SYNC BIT3
//#define LDAC BIT4

#define SCLK_0 P2OUT&=~SCLK
#define SCLK_1 P2OUT|=SCLK

//#define DI_0 P2OUT&=~DI
//#define DI_1 P2OUT|=DI

#define DO_0 P2OUT&=~DO
#define DO_1 P2OUT|=DO

#define SYNC_0 P2OUT&=~SYNC
#define SYNC_1 P2OUT|=SYNC

#define LDAC_0 P2OUT&=~LDAC
#define LDAC_1 P2OUT|=LDAC

//写前缀位、控制位、地址位函数
void write_pca(uint pca)
{
uint temp; //,num_in=0
for(uint i=0;i<12;i++)
{
temp=(pca&0x8000);
if(temp==0x8000)
DO_1;
else
DO_0;
delay_us(1);
SCLK_1;
pca<<=1;
delay_us(1);
SCLK_0;
delay_us(1);
}
}


//写数据函数
void write_data(uint data)
{
uint temp1; //,num_in1=0
SCLK_0;
for(uint i=0;i<16;i++)
{
temp1=(data&0x8000);
if(temp1==0x8000)
DO_1;
else
DO_0;
delay_us(1);
SCLK_1;
data<<=1;
delay_us(1);
SCLK_0;
delay_us(1);
}
}


//写功能函数
void write_fea(uint fea)
{
uint temp2; //,num_in2=0
SCLK_0;
for(uint i=0;i<4;i++)
{
temp2=(fea&0x8000);
if(temp2==0x8000)
DO_1;
else
DO_0;
delay_us(1);
SCLK_1;
fea<<=1;
delay_us(1);
SCLK_0;
delay_us(1);
}
}


//写32位数据
void write_32bits(uint pca,uint data,uint fea)
{
//LDAC_1;
SCLK_1;
SYNC_1;
delay_us(1);
SCLK_0;
delay_us(1);
SYNC_0;
write_pca(pca);
write_data(data);
write_fea(fea);
SYNC_1;
//LDAC_0;
delay_ms(1);
//LDAC_1;
}

void init_dac8568(void)
{
write_32bits(0x0800,0xFFFF,0x1000); //打开内部参考,设置静态模式
write_32bits(0x0400,0x0000,0x1000); //给DAC_A端口上电
write_32bits(0x0000,0xFFFF,0x0000); //写入数据给DAC_A寄存器
write_32bits(0x0300,0xFFFF,0x0000); //写入数据给通道A寄存器并更新A

}


void main()
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

P2SEL|=BIT0+BIT1+BIT2+BIT3;
P2DIR|=BIT0+BIT1+BIT3;
P2DIR&=~BIT2;
P2OUT&=~(BIT0+BIT1+BIT3);

init_dac8568();
while(1);
}

大致的电路图如下:

1. 确定内部参考电压配置输出正确吗?可以量下pin 8看有没有参考输出;

2. 最好是能把配置的波形抓出来,对比下,看时序对不对。

谢谢你的回答!我还有几个问题,如下:

1.没有参考电压输出

2.配置的波形该怎么样观察?该用什么软件呢?

LDAC不能直接接地吧,这个信号应该是用来把处理器发来的配置装载到DAC内部的。按照手册SPI时序图,LDAC也不是恒低。

这个芯片不支持寄存器回读,不太好观察实际写入值。

谢谢你热心的解答

我一直接地是因为在DAC8568手册第41耶叶有这么一句话,如下:

我再看看手册吧。

请问楼主,/LDAC能一直接地吗?同步更新(synchronous updates)是默认的工作方式吗?寄存器配置里面没有关于/LDAC是同步更新或者是异步更新的。想用同步更新怎么办?多谢多谢。。。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top