搞了好长时间,端口一直没有电压输出,不知是不是其配置有关,我选的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);}
大致的电路图如下:
Wanda WANG:
1. 确定内部参考电压配置输出正确吗?可以量下pin 8看有没有参考输出;
2. 最好是能把配置的波形抓出来,对比下,看时序对不对。
chuangchuang Sugong:
回复 Wanda WANG:
谢谢你的回答!我还有几个问题,如下:
1.没有参考电压输出
2.配置的波形该怎么样观察?该用什么软件呢?
Decapton Wang:
回复 chuangchuang Sugong:
LDAC不能直接接地吧,这个信号应该是用来把处理器发来的配置装载到DAC内部的。按照手册SPI时序图,LDAC也不是恒低。
这个芯片不支持寄存器回读,不太好观察实际写入值。
chuangchuang Sugong:
回复 Decapton Wang:
谢谢你热心的解答
我一直接地是因为在DAC8568手册第41耶叶有这么一句话,如下:
我再看看手册吧。
tom wang2:
回复 chuangchuang Sugong:
请问楼主,/LDAC能一直接地吗?同步更新(synchronous updates)是默认的工作方式吗?寄存器配置里面没有关于/LDAC是同步更新或者是异步更新的。想用同步更新怎么办?多谢多谢。。。