打印
[STC单片机]

单片机STC15W201S(软件控制IO口输出)给AD9516配置SPI

[复制链接]
1735|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
路过的大神一定帮忙看看,谢谢了。要实现的是通过单片机STC15W201S(软件控制IO口输出)给AD9516配置SPI。我的数据是带地址与数据的32位已经给定的一个数据组,后面我会根据修改这个数据组中的数据来比较方便地更改配置。现在出现的问题是测到的单片机数据输出口 MOSI=P3^3,与时钟输出口SCLK=P3^2波形如下图所示,数据波形输出不对。

我的程序:主程序部分
/********************************************************************
程序 名:AD9516的单片机控制程序, SPI界面

版本: V1.0
修改: 2015.12.18
***********************************************************************/

#include <STC15.h>
#include <stdlib.h>
#include "AD9516.h"
//#include "GlobalVariableDef.h"


//-----------------------------------------------------------------------------
//主函数

void main(void)
{
  /*while(1)
  {         TEST_H;
         delay_ms2(10);               //上电延时,原本500,语句调用延时没测到
         TEST_L;
         delay_ms2(10);
         TEST_H;
         delay_ms2(10);
         TEST_L;
         delay_ms2(10);
         TEST_H;
         delay_ms2(10);
         TEST_L;
         delay_ms2(10);
         TEST_H;
         delay_ms2(10);
         TEST_L;
         delay_ms2(10);
         TEST_H;
         delay_ms2(500);
          }         */
                                                                                                                 
//        TEST_L;       
        //Init_AD9516();               //初始化AD9516                                                          +
        delay_ms2(10);
        Init_AD9516();
       
        //EA=1;                             //开CPU总中断

         //AD9516_Write(2);                                 //改写PLL值

    while(1)
        {
             
                AD9516_Write(2); //改写PLL值
            delay_ms2(10);//原来100,语句调用延时测到       
    }         
}
功能程序部分:
#include "AD9516.h"
//固定值的代表这些寄存器无需修改
unsigned long Register[NUM]=
{  0xaaaaaaaa,
   0x55555555,
};
/*{//0xaaaaaaaa
//0x05060708,
//0x01020304,
0x00001800,
0x00040000,
0x00107C00,
0x00110100,
0x00120000,
0x00130600,
0x00140900,
0x00150000,
0x00160500,
0x00180700,
0x02320100,
0x00180600,
0x02320100,
0x00180700,
0x001c0200,
0x001f0e00,
0x00f00800,
0x00f10800,
0x00f20800,
0x00f30800,
0x00f40800,
0x00f50800,
0x01404200,
0x01414200,
0x01424200,
0x01434200,
0x01901100,
0x01910000,
0x01920000,
0x01931100,
0x01940000,
0x01950000,
0x01961100,
0x01970000,
0x01980000,
0x01990000,
0x019a0000,
0x019b0000,
0x019c0000,
0x019d0000,
0x019e0000,
0x019f0000,
0x01a00000,
0x01a10000,
0x01a20000,
0x01e00100,
0x01e10200,
0x02320100};*/          

void delay_ms2(unsigned int ms)
{
         unsigned char i;
            
          while(ms--)
          {
                    
                  for(i=0;i<110;i++);                                                                                                                    
          }
}


//初始化AD9516
void Init_AD9516(void)
{         

         RST_L;       
         delay_ms2(5);         //原本5,语句调用延时函数未测到       
                                                                                  
         RST_H;
         delay_ms2(500);         //原本500,语句调用延时函数未测到
         
         SS1_H;                            //片选无效
         SCLK_L;         
         MOSI_L;
         
       
          // TEST_H;
                                                                                                                                                                                                                                            
       
}
//SPI写时序
void  SPI_Write(unsigned char Data8)
{          
           unsigned char i;
                                                                                                                                                                                                                                                
           for(i=0;i<8;i++)
           {       
                         SCLK_L;
                        // MOSI_L;
                    // delay_ms2(10); //原来是5,10,语句调用延时函数未测到
                     if(Data8&0x80)
                     MOSI_H;
                     else
                         MOSI_L;  
                     Data8=Data8<<1;
                         SCLK_H;         //上升沿数据有效  
                    // delay_ms2(10);  //原来是5,10,语句调用延时函数未测到
                         
           }
             SCLK_L;  
}
//写AD9516寄存器
void Write_Reg( unsigned long Data32)
{
          unsigned  char Data[4]={0x00,0x00,0x00,0x00};
          unsigned char i=0;
          Data[0]=(unsigned char)((Data32>>24)&0xff);
          Data[1]=(unsigned char)((Data32>>16)&0xff);
          Data[2]=(unsigned char)((Data32>>8)&0xff);
          Data[3]=(unsigned char)(Data32&0xff);
          for(i=0;i<3;i++)                                                  
          {          
                      unsigned char byte=0;
                        byte=Data[i];       
                    SPI_Write(Data[i]);
                    
          }

}
/********************************************************************                                 
函 数 名:AD9516_Write                       

***********************************************************************/
void AD9516_Write(unsigned int Channel)
{
     unsigned int k;
          
         for(k=0;k<NUM;k++)
         {         
               
                unsigned long temp=0;
                SS1_L;   //选9516?????
                temp=Register[NUM-1-k];
                Write_Reg(Register[NUM-1-k]);
            SS1_H;

         }
         
}
头文件部分:
#ifndef __AD9516_H__
#define __AD9516_H__
#include <STC15.h>

//ADF4351引脚定义

sbit SS1=P3^7;
sbit MOSI=P3^3;
sbit SCLK=P3^2;
sbit LD1=P5^4;         //指示锁定引脚
sbit RST=P1^0;
//sbit TEST=P1^1;

#define  SS1_H          SS1=1         //片选
#define  SS1_L          SS1=0

#define  MOSI_H          MOSI=1           //单片机给9516
#define  MOSI_L          MOSI=0

#define  SCLK_H          SCLK=1          //时钟
#define  SCLK_L          SCLK=0
#define  RST_H       RST=1                 //复位
#define  RST_L       RST=0
//#define  TEST_H      TEST=1                 //测试信号
//#define  TEST_L      TEST=0

#define         NUM        2
//
extern unsigned long Register[NUM];


extern void Init_AD9516(void);
extern void AD9516_Write(unsigned int Channel);
//extern void Write_Reg( unsigned long Data32);  //新加
//extern void  SPI_Write(unsigned char Data8);//新加


extern void delay_ms2(unsigned int ms);
                                                                                                                                  
#endif
单片机输出的数据波形与时钟波形对应截图在图片中已加载


QQ截图20160718163145.png (539.16 KB )

QQ截图20160718163145.png

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝