路过的大神一定帮忙看看,谢谢了。要实现的是通过单片机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
单片机输出的数据波形与时钟波形对应截图在图片中已加载
|