论坛风格切换切换到宽版
  • 3790阅读
  • 14回复

AD9951 求救 [复制链接]

上一主题 下一主题
离线BG7YDO
 
发帖
3654
只看楼主 倒序阅读 0楼 发表于: 2011-02-16
下午没有事,拿出以前在网上买的一片板(ad9951)写了个送数,就频率出不来,如下请教这样是否可行
dds_init:
clr   dds_reset
clr   io_updata
clr   dds_sdio
clr   dds_sclk
setb   dds_reset
setb   dds_sclk
clr   dds_sclk
clr   dds_reset                 ;复位芯片

setb   io_updata                
nop
clr   io_updata                 ;送个脉冲,准备送数
mov   a,#01h                   ;寄存器地址
call   dds_w_dat
mov   a,#00h
call   dds_w_dat
mov   a,#00h
call   dds_w_dat
mov   a,#03h
call   dds_w_dat
setb   io_updata
nop
clr   io_updata                 ;给cfr2送数结束 :00 00 03h

mov   a,#04h                   ;寄存器地址
call   dds_w_dat
mov   a,#06h
call   dds_w_dat
mov   a,#66h
call   dds_w_dat
mov   a,#66h
call   dds_w_dat
mov   a,#66h
call   dds_w_dat
setb   io_updata
nop
clr   io_updata                 ;ftw送数结束   06 66 66 66h

ret
dds_w_dat:                     ;串行送数子程序
mov   r7,#8
clr   c
dds_w_dat_00:
rlc   a
mov   dds_sdio,c
nop
setb   dds_sclk
nop
clr   dds_sclk
djnz   r7,dds_w_dat_00
ret
离线BG7TBL
发帖
2963
只看该作者 1楼 发表于: 2011-02-16
这个是我的ad9951初始化程序,使用atmega8控制!
    rst_9951_set;   //复位
    data_9951_clr;
    clk_9951_clr;
    up_9951_clr;
    delay_long(3000);
    rst_9951_clr; //rst完毕
    delay_long(300);
    //config,mul*8,std=50*8=400mhz 设置倍频,vco范围
    up_9951_clr;
    w3_ser=0x01;//crf2
    w2_ser=0x00;
    w1_ser=0x00;
    w0_ser=dds_mul_ad9951<<3; //mul*8,vco 250-400mhz,
    if(dds_mul_ad9951*dds_std_9951>250000000)
    w0_ser=w0_ser+0x04;
    send_ad9951(w3_ser);
    send_ad9951(w2_ser);
    send_ad9951(w1_ser);
    send_ad9951(w0_ser);
    up_9951_set;
    delay_long(300);
    //output 1.8mhz 输出1.8mhz!
    up_9951_clr;
    w4_ser=0x04;//ftw0
    w3_ser=0x01;
    w2_ser=0x26;
    w1_ser=0xe9;
    w0_ser=0x78; //
    send_ad9951(w4_ser);
    send_ad9951(w3_ser);
    send_ad9951(w2_ser);
    send_ad9951(w1_ser);
    send_ad9951(w0_ser);
    up_9951_set;
离线nbcdmagsm
发帖
650
只看该作者 2楼 发表于: 2011-02-16
bascom的:

config portb.0 = output
dds_fqud alias portb.0

config portd.4 = output
dds_data alias portd.4

config portd.5 = output
dds_clock alias portd.5

config portd.3 = output
dds_reset alias portd.3

declare sub sendddstuningword(ddstuningword as long)
declare sub reset_ad9951
declare sub config_ad9951


call reset_ad9951
call config_ad9951
ddstuningword = 10737418
call sendddstuningword(ddstuningword)

sub reset_ad9951
  set dds_reset
  waitms 50
  reset dds_reset
end sub

sub config_ad9951
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop

ddsregaddress = &b00000010
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8

ddsregaddress = &b00000001
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop

ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00101100
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8


ddsregaddress = &b00000010
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsa = &b0011111111111111
shiftout dds_data , dds_clock , ddsa , 1 , 16

set dds_fqud
nop
nop
nop
nop
nop
nop
nop
nop
reset dds_fqud

end sub

sub sendddstuningword(ddstuningword as long)

ddsregaddress = &b0000100
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
shiftout dds_data , dds_clock , ddstuningword , 1 , 32

set dds_fqud
nop
nop
nop
nop
nop
nop
nop
nop

reset dds_fqud

end sub
离线BG7YDO
发帖
3654
只看该作者 3楼 发表于: 2011-02-16
'
这个是我的ad9951初始化程序,使用atmega8控制!
    rst_9951_set;   //复位
    data_9951_clr;
    clk_9951_clr;
    up_9951_clr;
    delay_long(3000);
    rst_9951_clr; //rst完毕
    delay_long(300);
    //config,mul*8,std=50*8=400mhz 设置倍频,vco范围
    up_9951_clr;
    w3_ser=0x01;//crf2
    w2_ser=0x00;
    w1_ser=0x00;
    w0_ser=dds_mul_ad9951<<3; //mul*8,vco 250-400mhz,
    if(dds_mul_ad9951*dds_std_9951>250000000)
    w0_ser=w0_ser+0x04;
    send_ad9951(w3_ser);
    send_ad9951(w2_ser);
    send_ad9951(w1_ser);
    send_ad9951(w0_ser);
    up_9951_set;
    delay_long(300);
    //output 1.8mhz 输出1.8mhz!
    up_9951_clr;
    w4_ser=0x04;//ftw0
    w3_ser=0x01;
    w2_ser=0x26;
    w1_ser=0xe9;
    w0_ser=0x78; //
    send_ad9951(w4_ser);
    send_ad9951(w3_ser);
    send_ad9951(w2_ser);
    send_ad9951(w1_ser);
    send_ad9951(w0_ser);
    up_9951_set;
'
非常感谢,理解的不多,看到您在reset高电平后加了延时,是这样吗?
离线BG7YDO
发帖
3654
只看该作者 4楼 发表于: 2011-02-16
'
bascom的:
config portb.0 = output
dds_fqud alias portb.0
config portd.4 = output
dds_data alias portd.4
config portd.5 = output
dds_clock alias portd.5
config portd.3 = output
dds_reset alias portd.3
declare sub sendddstuningword(ddstuningword as long)
declare sub reset_ad9951
declare sub config_ad9951
call reset_ad9951
call config_ad9951
ddstuningword = 10737418
call sendddstuningword(ddstuningword)
sub reset_ad9951
  set dds_reset
  waitms 50
  reset dds_reset
end sub
sub config_ad9951
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000010
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
ddsregaddress = &b00000001
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00000000
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsregaddress = &b00101100
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
ddsregaddress = &b00000010
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
nop
nop
ddsa = &b0011111111111111
shiftout dds_data , dds_clock , ddsa , 1 , 16
set dds_fqud
nop
nop
nop
nop
nop
nop
nop
nop
reset dds_fqud
end sub
sub sendddstuningword(ddstuningword as long)
ddsregaddress = &b0000100
shiftout dds_data , dds_clock , ddsregaddress , 1 , 8
shiftout dds_data , dds_clock , ddstuningword , 1 , 32
set dds_fqud
nop
nop
nop
nop
nop
nop
nop
nop
reset dds_fqud
end sub
'
非常感谢,看不懂 config——9951,是功能寄存器设置吗?
离线BG7TBL
发帖
2963
只看该作者 5楼 发表于: 2011-02-16
'
非常感谢,理解的不多,看到您在reset高电平后加了延时,是这样吗?
'
对,这个是参考电路图!
离线nbcdmagsm
发帖
650
只看该作者 6楼 发表于: 2011-02-16
'
非常感谢,看不懂 [表情] config——9951,是功能寄存器设置吗?
'
应该是寄存器初始化设置
离线BG7YDO
发帖
3654
只看该作者 7楼 发表于: 2011-02-16
'
对,这个是参考电路图!
'
我现在这块板基本上和您的图纸是一样的,只是在接口处夹了一片74hc08,片选脚接地,引出;io_updata   sdio sclk reset
就是不出频率,我用的是stc12c5a60s2(8mhz),下面这句我不知道应该如何理解

sclk—serial clock. the serial clock pin is used to synchronize
data to and from the ad9951 and to run the internal state
machines. sclk maximum frequency is 25 mhz.
离线BG7YDO
发帖
3654
只看该作者 8楼 发表于: 2011-02-16
'
应该是寄存器初始化设置
'
感觉是,不过好多数,找不到方向了
离线yuhang
发帖
1803
只看该作者 9楼 发表于: 2011-02-16
明天抽空发给你
离线BG7YDO
发帖
3654
只看该作者 10楼 发表于: 2011-02-16
'
明天抽空发给你
'
非常感谢您的支持。不用发了,已经解决。
离线BG7YDO
发帖
3654
只看该作者 11楼 发表于: 2011-02-16
再次感谢上面无私帮助的热心朋友。
问题已经解决,是复位的问题,电路内在复位端加了一个npn的管子,使复位电平反相,没有使ad9951正常复位,所以白忙了一个下午,做事不够细心的惩罚。程序没有问题,就留着了,也好给需要的人一个借鉴。
离线songxiang
发帖
5499
只看该作者 12楼 发表于: 2011-02-16
第一次仔细看9951的图,没想到那么多电源脚 ||||||||
|||||||||||
-----------
) songxiang        
-----------   ic1
|||||||||||
离线BG7YDO
发帖
3654
只看该作者 13楼 发表于: 2011-02-16
嘿嘿,不多,才48个脚
离线BD8BT
发帖
275
只看该作者 14楼 发表于: 2011-02-17
我的感觉只要按ad9951的时序操作应该是没问题的。起先的初始化最好就按芯片的默认值,等你搞出了波形且控制正常了再按你的爱好修改,我以前也没用过,可在diy机器的时候却是一次成功了。