#include "C8051F340.h"
#include <stdio.h>
#define HIGH 2
#define LOW 0
#define SO (P1&0x02) // P1.1端口 与 0000 0010
#define SI_H P1=P1|0x02 // P1.1端口 或 0000 0010
#define SI_L P1=P1&0xFD // P1.1端口 与 1111 1101
#define SCK_H P1=P1|0x01 // P1.0端口 或 0000 0001
#define SCK_L P1=P1&0xFE // P1.0端口 与 1111 1110
#define CS_9517_L P1=P1&0xFB // P1.2端口 与 1111 1011
#define CS_9517_H P1=P1|0x04 // P1.2端口 或 1111 0100
#define CS_9627_L P1=P1&0xEF // P1.4端口 与 1110 1111
#define CS_9627_H P1=P1|0x10 // P1.4端口 与 0001 0000
//*********************************************************************************************************
// AD9517函数
//*********************************************************************************************************
void wait() //延时函数
{
int k;
for(k=0;k<250;k++)
{;}
}
/*---------------------------------------------------------------------------------------------------------------*/
void transfer_byte_num_command( char command ) //传送BYTE个数 命令 1BYTE,2BYTE,3BYTE,stream模式 9517写
{
unsigned char mark,data_1,i;
CS_9517_L;
CS_9627_H;
mark=0x80;
if (command==1) data_1=0x00; //0000
else if (command==2) data_1=0x20; //0010
else if (command==3) data_1=0x40; //0100
else data_1=0x60; //0110 data_1=0x60;
for(i=0;i<4;i++) //
{
if((data_1&mark)==0)
SI_L;
else
SI_H;
mark=mark>>1;
SCK_H;
wait();
SCK_L;
}
}
/*---------------------------------------------------------------------------------------------------------------*/
void transfer_data_1byte(unsigned int addr ,unsigned char data_1) //向指定地址写入1个字节 9517写
{
unsigned char mark1;
unsigned int mark2;
unsigned int i;
mark1=0x80;
mark2=0x0800;
for(i=0;i<12;i++) //
{
if((addr&mark2)==0)
SI_L;
else
SI_H;
mark2=mark2>>1;
SCK_H;
wait();
SCK_L;
}
for(i=0;i<8;i++) //
{
if((data_1&mark1)==0)
SI_L;
else
SI_H;
mark1=mark1>>1;
SCK_H;
wait(); //时钟
SCK_L;
}
CS_9517_H;
//CS_9627_H;
}
/*---------------------------------------------------------------------------------------------------------------*/
void transfer_data_2byte(unsigned int addr ,unsigned int data_1) //向指定地址写入2个字节
{
unsigned int mark1;
unsigned int mark2;
unsigned int i;
mark1=0x8000;
mark2=0x0800;
for(i=0;i<12;i++) //
{
if((addr&mark2)==0)
SI_L;
else
SI_H;
mark2=mark2>>1;
SCK_H;
wait(); //时钟
SCK_L;
}
for(i=0;i<16;i++) //
{
if((data_1&mark1)==0)
SI_L;
else
SI_H;
mark1=mark1>>1;
SCK_H;
wait(); //时钟
SCK_L;
}
CS_9517_H;
}
/*---------------------------------------------------------------------------------------------------------------*/
unsigned char read_data(unsigned int addr) //形参为地址 A11~A0 12bit 预读取1个字节 9517读
{
unsigned char return_data; //地址后3字节有效
unsigned char mark2; //1000 0000 读1BYTE
unsigned int mark,i;
unsigned int command=0x8000; // 1000 0000
CS_9517_L;
// CS_9627_L;
return_data=0x00;
mark=0x8000;
mark2=0x80;
for(i=0;i<4;i++)
{
if((command&mark)==0)
SI_L;
else
SI_H;
mark=mark>>1;
SCK_H; //时钟
wait();
SCK_L;
}
for(i=0;i<12;i++) //写入12bit 地址
{
if((addr&mark)==0) // mark此时已为0x0800
SI_L;
else
SI_H;
mark=mark>>1;
SCK_H;
wait();
SCK_L;
}
P1 |= 0x02;
for(i=0;i<8;i++)
{
if(SO==HIGH)
{
return_data=return_data|mark2;
mark2=mark2>>1;
}
else mark2=mark2>>1;
SCK_H;
wait();
SCK_L;
}
CS_9517_H;
//CS_9627_H;
return return_data; //返回的数据为8bit
}
//*********************************************************************************************************
// 单片机初始化
//*********************************************************************************************************
void Oscillator_Init()
{
int i = 0;
// OSCICN = 0x00;
OSCXCN = 0x67;
for (i = 0;i<3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80)== 0);
CLKSEL=0x01; //如果要选择外部振荡器作为系统时钟,必须将CLKSL(CLKSEL的第0位)设为1
}
void Port_IO_Init()
{
P0MDIN = 0x3F;
// P2MDOUT = 0xFF;
// P2MDOUT=0x04;
P1MDIN =0xFF; //P1 端口全数字输入
P1MDOUT=0x17; // 0001 0011 || P1.0 SCK || P1.1 DIO || P1.2 CS9517 || P1.4 CS9627
// P1MDOUT=0xFF; //for test
XBR1 = 0x40; //
// XBR2 = 0x40; //交叉开关使能
}
void Reset_Sources_Init()
{
int i = 0;
// PCA0MD=0x80;
VDM0CN= 0x00;
for (i =0; i <350;i++); // Wait 100us for initialization
RSTSRC=0x02;
}
void PCA_Init()
{
PCA0MD &= ~0x40;
// PCA0MD = 0x00; //Watchdog disenable
}
//*********************************************************************************************************
void initial_9517() //9517 初始化
{
// char data_1;
char num=1;
int i=0;
unsigned char xdata data_1=0,data_2=0,data_3=0,data_4=0,data_5=0,data_6=0,data_7=0,data_8=0,status=0;
unsigned char xdata data_9=0,data_10=0,data_11=0,data_12=0,data_13=0,data_14=0,data_15=0,data_16=0;
unsigned int xdata addr1=0x0000,addr2=0x0004,addr3=0x0232;
//serial port config
/* transfer_byte_num_command(1);
transfer_data_1byte(0x0000,0x3C); //0011 1100 RESET
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register */
transfer_byte_num_command(1);
transfer_data_1byte(0x0018,0x06); // 0000 0110 PLL COntrol_3 VCO CAL NOW
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register
transfer_byte_num_command(1);
transfer_data_1byte(0x0000,0x18);
transfer_byte_num_command(1);
transfer_data_1byte(0x0004,0x01); // read back from active registers
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register
data_1=read_data(0x00F0);
wait();
data_2=read_data(0x00F1);
wait();
data_3=read_data(0x00F4);
wait();
data_4=read_data(0x00F5);
wait();
data_5=read_data(0x0140);
wait();
data_6=read_data(0x0141);
wait();
data_7=read_data(0x0142);
wait();
data_8=read_data(0x0143);
wait();
data_9=read_data(0x0190);
wait();
data_10=read_data(0x0191);
wait();
data_11=read_data(0x0192);
wait();
data_12=read_data(0x0197);
wait();
data_13=read_data(0x0198);
wait();
data_14=read_data(0x0199);
wait();
data_15=read_data(0x019C);
wait();
//PLL config
//从CLK输入
//LVDS/CMOS Channel Dividers
// transfer_by
AD9517_Ccode.rar_AD9517_ad95_lvds
版权申诉
5星 · 超过95%的资源 114 浏览量
2022-07-14
20:50:25
上传
评论
收藏 3KB RAR 举报
alvarocfc
- 粉丝: 108
- 资源: 1万+
最新资源
- 111111111111111111111
- 汉诺塔python代码递归
- 汉诺塔python代码递归
- 汉诺塔python代码递归
- MySQL 8.0 实战教程从入门到项目实战.docx
- 汉诺塔问题是一个经典的递归问题 在这个问题中,我们有三个塔座(通常被称为A、B和C),并且我们有一堆大小不同的盘子,每个盘子都可
- TB-03 二次开发环境搭建指导
- 汉诺塔问题是一个经典的递归问题 在这个问题中,我们有三个塔座(通常被称为A、B和C),并且我们有一堆大小不同的盘子,每个盘子都可
- 汉诺塔问题是一个经典的递归问题 在这个问题中,我们有三个塔座(通常被称为A、B和C),并且我们有一堆大小不同的盘子,每个盘子都可
- 遗传粒子群算法(GA),MATLAB源代码,解决旅行商问题(TSP)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈