imfv 发表于 2014-4-25 09:59:41

出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);               
        }       
}

霸气侧漏 发表于 2014-4-25 10:16:51

你要用ad9837做啥

imfv 发表于 2014-4-25 10:20:16

霸气侧漏 发表于 2014-4-25 10:16
你要用ad9837做啥

要用它产生可变的频率信号

imfv 发表于 2014-4-25 10:21:50

这个是中文PDF

lryxr2507 发表于 2014-4-25 10:23:35

倒数第3行的"while(1);   "去掉试试.

imfv 发表于 2014-4-25 10:25:30

lryxr2507 发表于 2014-4-25 10:23
倒数第3行的"while(1);   "去掉试试.

试过,不行。

lryxr2507 发表于 2014-4-25 10:30:32

你那些延时也太长了吧,去掉while(1);所以延时改为1.再试试.

lryxr2507 发表于 2014-4-25 10:33:24

注意:

void delay(uchar k)   //延迟程序
{
      uchar i,j;
      for(;k>0;k--)
      for(j=100;j>0;j--)       //少一个分号!
      for(i=100;i>0;i--);
}

imfv 发表于 2014-4-25 10:35:39

lryxr2507 发表于 2014-4-25 10:33
注意:

void delay(uchar k)   //延迟程序


这个好像不影响,我用示波器看波形,与程序里写的时序都是相同的,就是没有输出,不是延迟部分的问题,应该是主程序的问题。

RAMILE 发表于 2014-4-25 10:44:27

把写进去的东西读出了看看

lryxr2507 发表于 2014-4-25 10:46:07

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 11:00:59

修改延时后,驱动已经有输出了.

imfv 发表于 2014-4-25 11:03:40

lryxr2507 发表于 2014-4-25 10:46
呵呵,抱歉,我没细看,但但仿真时延时的那段是死的;

//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时1 ...

不是延迟部分的问题,是主程序的问题。延迟的程序可以不用去考虑它的,用示波器观察过波单片机的I/O是口波形,都是正常的,主要是主程序不对。

imfv 发表于 2014-4-25 11:04:55

lryxr2507 发表于 2014-4-25 11:00
修改延时后,驱动已经有输出了.

仿真是仿真,实际是实际,可是实际我用示波器测试,确定是有输出的。要不我改用你的延迟试一下吧。

imfv 发表于 2014-4-25 11:12: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);               
        }       
}

imfv 发表于 2014-4-25 11:13:20

RAMILE 发表于 2014-4-25 10:44
把写进去的东西读出了看看

芯片好像只能写,不能读,没有看到数据手册里说可以读。

lryxr2507 发表于 2014-4-25 11:16:40

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:10

没实物,最难搞这种了

imfv 发表于 2014-4-25 11:28:36

skynet 发表于 2014-4-25 11:21
没实物,最难搞这种了

网上找了好多资料,都找不到例程,实在是没有办法了,是对照数据手册写的程序啊,应该是没有问题的,开始的时候怀疑芯片问题,后来换了一块,还是一样没有输出。(同时买的还有其它型号的ADI芯片,是PLL部分的,正常使用中)

imfv 发表于 2014-4-25 11:29:44

lryxr2507 发表于 2014-4-25 11:16
没板子,帮不了.改掉延时,去掉最后一个while(1);在我的测试板上用示波器测试,时钟信号基本正常了.

#inclu ...

可能是主程序的哪里不对,造成一直没有输出。

huangqi412 发表于 2014-4-25 12:05:30

void indate0(uint p)


既然有示波器,,, 通信时序对不对先看了再说。。。

huangqi412 发表于 2014-4-25 12:11:22

手册上明明画的是MSB   撸主的程序是LSB
改成MSB估计就成了

huangqi412 发表于 2014-4-25 12:15:30

for(i=0;i<16;i++)
{
   SCLK=1;
   if(p&0x8000)
            SDATA=1;
   else
         SDATA=0;
      SCLK=0;
      p=p<<1;
}

另外不知CPU速度多少时序是不是要调整。。。

huangqi412 发表于 2014-4-25 12:17:33

寄存器地址自己检查,寄存器数字写错了就有意思了。。。

qjs412_avr 发表于 2014-4-25 12:46:47

本帖最后由 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
编辑原因:修改代码

imfv 发表于 2014-4-25 15:05:53

qjs412_avr 发表于 2014-4-25 12:46
#include
#define uchar unsigned char
#define uint unsigned int


试过您的代码,一样是没有输出。

imfv 发表于 2014-4-25 15:06:48

qjs412_avr 发表于 2014-4-25 12:46
#include
#define uchar unsigned char
#define uint unsigned int


程序的好像是先传低位,再传高位,所以应该是P&0X0001

huangqi412 发表于 2014-4-26 09:45:05

imfv 发表于 2014-4-25 15:06
程序的好像是先传低位,再传高位,所以应该是P&0X0001

真服了你。。。 自己看时序图,,,MSB...

imfv 发表于 2014-4-26 10:11:20

试了以上的各位的程序,还是没有输出。

imfv 发表于 2014-4-26 10:48:13

huangqi412 发表于 2014-4-25 12:15
for(i=0;i

时序要求好像是时钟的下降沿传送数据,单片机用的是STC12LE5608AD,晶振用的是11.0592M

huangqi412 发表于 2014-4-26 11:10:58

imfv 发表于 2014-4-26 10:48
时序要求好像是时钟的下降沿传送数据,单片机用的是STC12LE5608AD,晶振用的是11.0592M ...

建立时间,保持时间等等,你都有示波器,可以看看。保险起见,先降频最好,每个语句后加几个NOP。
你再去看看时序图。。。是MSB还是LSB...

huhandong 发表于 2014-4-26 11:48:17

楼主哪里的?调这类需要硬件才好调

imfv 发表于 2014-4-26 11:50:13

huhandong 发表于 2014-4-26 11:48
楼主哪里的?调这类需要硬件才好调

安徽的。

imfv 发表于 2014-4-26 11:51:06

huangqi412 发表于 2014-4-26 11:10
建立时间,保持时间等等,你都有示波器,可以看看。保险起见,先降频最好,每个语句后加几个NOP。
你再 ...

就几个数据指令,回头我让每个数据指令单独执行,用双通道同时扫描,回头上照片。

huangqi412 发表于 2014-4-26 14:57:38

imfv 发表于 2014-4-26 11:51
就几个数据指令,回头我让每个数据指令单独执行,用双通道同时扫描,回头上照片。 ...

程序的好像是先传低位,再传高位,所以应该是P&0X0001


你还在认为是LSB???    时序图。。。

imfv 发表于 2014-4-28 19:52:58

huangqi412 发表于 2014-4-26 14:57
程序的好像是先传低位,再传高位,所以应该是P&0X0001




还是不行啊,怎么办,能不能帮忙解决一下,谢谢!

imfv 发表于 2014-4-28 19:54:07

顶一下贴子,继续求教高手,帮忙解决问题!

点雨落山岚 发表于 2014-4-28 20:54:25

这个我还真不会,所以帮不了,自己找了。。。
页: [1]
查看完整版本: 出50RMB求一个AD9837的驱动程序