出50RMB求一个AD9837的驱动程序
就只是让芯片输出一个固定的1Mhz正弦波出来就行了,调试了好久,实在是调不出来,还是请高手帮忙一下,愿意出50RMB,只要测试成功,立马打钱到你的支付宝里。以下是本人现在的程序,没有输出:/************************************************************
测试环境:主芯片:STC12LE5608AD晶振:11.0592M
DDS芯片:AD9837 参考时钟:13.000M
要求:输出一个固定的1Mhz正弦波
************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit FSYNC=P3^3;
sbit SCLK=P1^4;
sbit SDATA=P1^3;
void delay(uchar k) //延迟程序
{
uchar i,j;
for(;k>0;k--)
for(j=100;j>0;j--)
for(i=100;i>0;i--);
}
void indate0(uint p)
{
uchar i;
FSYNC=0;
for(i=0;i<16;i++)
{
SCLK=1;
if(p&0x0001)
{
SDATA=1;
}
else
{
SDATA=0;
}
SCLK=0;
p=p>>1;
}
FSYNC=1;
SCLK=1;
SDATA=1;
}
void main(void)
{
FSYNC=1;
SCLK=1;
SDATA=1;
while(1)
{
indate0(0x0100);//复位DDS芯片
delay(100);//延时
indate0(0x1000);//写频率寄存器的高14位
delay(20);//
indate0(0x53b1);//写寄存器高14位频率字
delay(20);
indate0(0x0000);//写频率寄存器的低14位
delay(20);//
indate0(0x84ec);//写寄存器低14位频率字
delay(20);//
indate0(0xcf0f); //写相位控制字
delay(20);//
while(1);
}
} 你要用ad9837做啥 霸气侧漏 发表于 2014-4-25 10:16
你要用ad9837做啥
要用它产生可变的频率信号 这个是中文PDF
倒数第3行的"while(1); "去掉试试.
lryxr2507 发表于 2014-4-25 10:23
倒数第3行的"while(1); "去掉试试.
试过,不行。 你那些延时也太长了吧,去掉while(1);所以延时改为1.再试试. 注意:
void delay(uchar k) //延迟程序
{
uchar i,j;
for(;k>0;k--)
for(j=100;j>0;j--) //少一个分号!
for(i=100;i>0;i--);
}
lryxr2507 发表于 2014-4-25 10:33
注意:
void delay(uchar k) //延迟程序
这个好像不影响,我用示波器看波形,与程序里写的时序都是相同的,就是没有输出,不是延迟部分的问题,应该是主程序的问题。 把写进去的东西读出了看看 imfv 发表于 2014-4-25 10:35
这个好像不影响,我用示波器看波形,与程序里写的时序都是相同的,就是没有输出,不是延迟部分的问题,应 ...
呵呵,抱歉,我没细看,但但仿真时延时的那段是死的;
//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.
void delayMs(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
}
}
调用时不需要那么长的延时. 修改延时后,驱动已经有输出了.
lryxr2507 发表于 2014-4-25 10:46
呵呵,抱歉,我没细看,但但仿真时延时的那段是死的;
//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时1 ...
不是延迟部分的问题,是主程序的问题。延迟的程序可以不用去考虑它的,用示波器观察过波单片机的I/O是口波形,都是正常的,主要是主程序不对。 lryxr2507 发表于 2014-4-25 11:00
修改延时后,驱动已经有输出了.
仿真是仿真,实际是实际,可是实际我用示波器测试,确定是有输出的。要不我改用你的延迟试一下吧。 现在程序如下,还是一样没有输出。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit FSYNC=P3^3;
sbit SCLK=P1^4;
sbit SDATA=P1^3;
void delay(uchar k) //延迟程序
{
uchar i;
while(k--)
{
for(i = 0; i < 125; i++);
}
}
void indate0(uint p)
{
uchar i;
FSYNC=0;
for(i=0;i<16;i++)
{
SCLK=1;
if(p&0x0001)
{
SDATA=1;
}
else
{
SDATA=0;
}
SCLK=0;
p=p>>1;
}
FSYNC=1;
SCLK=1;
SDATA=1;
}
void main(void)
{
FSYNC=1;
SCLK=1;
SDATA=1;
while(1)
{
indate0(0x0100);//复位DDS芯片
delay(100);//延时
indate0(0x1000);//写频率寄存器的高14位
delay(20);//
indate0(0x53b1);//写寄存器高14位频率字
delay(20);
indate0(0x0000);//写频率寄存器的低14位
delay(20);//
indate0(0x84ec);//写寄存器低14位频率字
delay(20);//
indate0(0xcf0f); //写相位控制字
delay(20);//
while(1);
}
} RAMILE 发表于 2014-4-25 10:44
把写进去的东西读出了看看
芯片好像只能写,不能读,没有看到数据手册里说可以读。 imfv 发表于 2014-4-25 11:12
现在程序如下,还是一样没有输出。
#include
#define uchar unsigned char
没板子,帮不了.改掉延时,去掉最后一个while(1);在我的测试板上用示波器测试,时钟信号基本正常了.
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit FSYNC=P3^3;
sbit SCLK=P1^4;
sbit SDATA=P1^3;
/*void delay(uchar k) //延迟程序
{
uchar i,j;
for(;k>0;k--)
for(j=100;j>0;j--)
for(i=100;i>0;i--);
}
*/
//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.
void delay(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
}
}
void indate0(uint p)
{
uchar i;
FSYNC=0;
for(i=0;i<16;i++)
{
SCLK=1;
if(p&0x0001)
{
SDATA=1;
}
else
{
SDATA=0;
}
SCLK=0;
p=p>>1;
}
FSYNC=1;
SCLK=1;
SDATA=1;
}
void main(void)
{
FSYNC=1;
SCLK=1;
SDATA=1;
while(1)
{
indate0(0x0100);//复位DDS芯片
delay(1);//延时
indate0(0x1000);//写频率寄存器的高14位
delay(1);//
indate0(0x53b1);//写寄存器高14位频率字
delay(1);
indate0(0x0000);//写频率寄存器的低14位
delay(1);//
indate0(0x84ec);//写寄存器低14位频率字
delay(1);//
indate0(0xcf0f); //写相位控制字
delay(1);//
// while(1);
}
}
没实物,最难搞这种了 skynet 发表于 2014-4-25 11:21
没实物,最难搞这种了
网上找了好多资料,都找不到例程,实在是没有办法了,是对照数据手册写的程序啊,应该是没有问题的,开始的时候怀疑芯片问题,后来换了一块,还是一样没有输出。(同时买的还有其它型号的ADI芯片,是PLL部分的,正常使用中) lryxr2507 发表于 2014-4-25 11:16
没板子,帮不了.改掉延时,去掉最后一个while(1);在我的测试板上用示波器测试,时钟信号基本正常了.
#inclu ...
可能是主程序的哪里不对,造成一直没有输出。 void indate0(uint p)
既然有示波器,,, 通信时序对不对先看了再说。。。 手册上明明画的是MSB 撸主的程序是LSB
改成MSB估计就成了 for(i=0;i<16;i++)
{
SCLK=1;
if(p&0x8000)
SDATA=1;
else
SDATA=0;
SCLK=0;
p=p<<1;
}
另外不知CPU速度多少时序是不是要调整。。。 寄存器地址自己检查,寄存器数字写错了就有意思了。。。 本帖最后由 qjs412_avr 于 2014-4-25 12:48 编辑
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit FSYNC=P3^3;
sbit SCLK=P1^4;
sbit SDATA=P1^3;
void delay(uchar k) //延迟程序
{
uchar i,j;
for(;k>0;k--)
for(j=100;j>0;j--)
for(i=100;i>0;i--);
}
void indate0(uint p)
{
uchar i;
FSYNC=0;
for(i=0;i<16;i++)
{
SCLK=0;
if(p&0x8000)
{
SDATA=1;
}
else
{
SDATA=0;
}
SCLK=1;
p=p<<1;
}
FSYNC=1;
SCLK=0;
SDATA=1;
}
void main(void)
{
FSYNC=1;
SCLK=0;
SDATA=1;
while(1)
{
indate0(0x0100);//复位DDS芯片
delay(100);//延时
indate0(0x1000);//写频率寄存器的高14位
delay(20);//
indate0(0x53b1);//写寄存器高14位频率字
delay(20);
indate0(0x0000);//写频率寄存器的低14位
delay(20);//
indate0(0x84ec);//写寄存器低14位频率字
delay(20);//
indate0(0xcf0f); //写相位控制字
delay(20);//
while(1);
}
}
楼主试试这个代码,从芯片手册上看,数据变化的时候在SCLK的上升沿,所以SDATA上的数据信息应该在SCLK低电平时赋值,然后拉高SCLK
编辑原因:修改代码 qjs412_avr 发表于 2014-4-25 12:46
#include
#define uchar unsigned char
#define uint unsigned int
试过您的代码,一样是没有输出。 qjs412_avr 发表于 2014-4-25 12:46
#include
#define uchar unsigned char
#define uint unsigned int
程序的好像是先传低位,再传高位,所以应该是P&0X0001 imfv 发表于 2014-4-25 15:06
程序的好像是先传低位,再传高位,所以应该是P&0X0001
真服了你。。。 自己看时序图,,,MSB... 试了以上的各位的程序,还是没有输出。 huangqi412 发表于 2014-4-25 12:15
for(i=0;i
时序要求好像是时钟的下降沿传送数据,单片机用的是STC12LE5608AD,晶振用的是11.0592M imfv 发表于 2014-4-26 10:48
时序要求好像是时钟的下降沿传送数据,单片机用的是STC12LE5608AD,晶振用的是11.0592M ...
建立时间,保持时间等等,你都有示波器,可以看看。保险起见,先降频最好,每个语句后加几个NOP。
你再去看看时序图。。。是MSB还是LSB... 楼主哪里的?调这类需要硬件才好调 huhandong 发表于 2014-4-26 11:48
楼主哪里的?调这类需要硬件才好调
安徽的。 huangqi412 发表于 2014-4-26 11:10
建立时间,保持时间等等,你都有示波器,可以看看。保险起见,先降频最好,每个语句后加几个NOP。
你再 ...
就几个数据指令,回头我让每个数据指令单独执行,用双通道同时扫描,回头上照片。 imfv 发表于 2014-4-26 11:51
就几个数据指令,回头我让每个数据指令单独执行,用双通道同时扫描,回头上照片。 ...
程序的好像是先传低位,再传高位,所以应该是P&0X0001
你还在认为是LSB??? 时序图。。。 huangqi412 发表于 2014-4-26 14:57
程序的好像是先传低位,再传高位,所以应该是P&0X0001
还是不行啊,怎么办,能不能帮忙解决一下,谢谢! 顶一下贴子,继续求教高手,帮忙解决问题! 这个我还真不会,所以帮不了,自己找了。。。
页:
[1]