📄 ad9517_c控制代码.txt
字号:
#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_byte_num_command(1);
// transfer_data_1byte(0x0199,0x06); //0000 0110 N2.1=6 M2.1=0
// transfer_byte_num_command(1);
// transfer_data_1byte(0x019B,0x44); //0100 0100 N2.2=4 M2.2=4
// transfer_byte_num_command(1);
// transfer_data_1byte(0x019C,0x40); // 0110 0000 2.1 2.2 bypass
data_2=read_data(0x00F1);
wait();
/*
transfer_byte_num_command(1); //OUT7 setting
transfer_data_1byte(0x0143,0x0C);//0000 1100
transfer_byte_num_command(1);
transfer_data_1byte(0x0140,0x16); //0001 0110 OUT4 settings
transfer_byte_num_command(1);
transfer_data_1byte(0x0010,0x71); // 0111 0001 PLL down
transfer_byte_num_command(1);
transfer_data_1byte(0x019C,0x30); //0011 0000
transfer_byte_num_command(1);
transfer_data_1byte(0x01A1,0x30); //0011 0000
transfer_byte_num_command(1);
transfer_data_1byte(0x01E0,0x00); //0000 0000 divider by 2
transfer_byte_num_command(1);
transfer_data_1byte(0x01E1,0x00); //0000 1001 select CLK as input use divider
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x00); // refresh register
*/
transfer_byte_num_command(1);
transfer_data_1byte(0x0010,0x7C); //7C 0111 1100 PFD and Charge Pump
transfer_byte_num_command(1);
transfer_data_1byte(0x0011,0x50); // 50 0101 0000 R counter=80 LSB why?????????????????????
transfer_byte_num_command(1);
transfer_data_1byte(0x0012,0x00);
// transfer_byte_num_command(1);
// transfer_data_1byte(0x0012,0x00);
//transfer_data_1byte(0x0232,0x01); // refresh register
// transfer_byte_num_command(1);
transfer_byte_num_command(1);
transfer_data_1byte(0x0013,0x00); // 0101 0000 A counter=00
transfer_byte_num_command(1);
transfer_data_1byte(0x0014,0x64); //64 0110 0100 B counter=100
transfer_byte_num_command(1);
transfer_data_1byte(0x0015,0x00);
transfer_byte_num_command(1);
//05 0000 0101 PLL Control_1 (DM) divided by 16 when A=0
transfer_byte_num_command(1);
// transfer_data_1byte(0x001C,0x01); // 0000 0001 PLL Control_7 differential reference
// transfer_byte_num_command(1);
//transfer_data_1byte(0x0232,0x01); // refresh register
// transfer_data_1byte(0x0018,0x17);
transfer_byte_num_command(1);
transfer_data_1byte(0x0019,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x001A,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x001B,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x001C,0x01); // 0000 0001 PLL Control_7 differential reference
transfer_byte_num_command(1);
transfer_data_1byte(0x001D,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register
transfer_byte_num_command(1);
transfer_data_1byte(0x00F0,0x08);
transfer_byte_num_command(1);
transfer_data_1byte(0x00F1,0x0A);
transfer_byte_num_command(1);
transfer_data_1byte(0x00F4,0x08);
transfer_byte_num_command(1);
transfer_data_1byte(0x00F5,0x0A);
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register
transfer_byte_num_command(1);
transfer_data_1byte(0x0140,0x44);
transfer_byte_num_command(1);
transfer_data_1byte(0x0141,0x43);
transfer_byte_num_command(1);
transfer_data_1byte(0x0142,0x42);
transfer_byte_num_command(1);
transfer_data_1byte(0x0143,0x43);
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register
transfer_byte_num_command(1);
transfer_data_1byte(0x0190,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x0191,0x80);
transfer_byte_num_command(1);
transfer_data_1byte(0x0192,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x0196,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x0197,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x0198,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x0199,0x11); //0x11
transfer_byte_num_command(1);
transfer_data_1byte(0x019A,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x019B,0x44); //0x44
transfer_byte_num_command(1);
transfer_data_1byte(0x019C,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x019D,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x019E,0x22);
transfer_byte_num_command(1);
transfer_data_1byte(0x019F,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x01A0,0x11);
transfer_byte_num_command(1);
transfer_data_1byte(0x01A1,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x01A2,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x01A3,0x00);
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register
transfer_byte_num_command(1);
transfer_data_1byte(0x01E0,0x02); //0000 0010 VCO divider=4
transfer_byte_num_command(1);
transfer_data_1byte(0x01E1,0x02); //0000 1010 select VCO as input
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(0x0018,0x07); // 0000 0111 PLL COntrol_3 VCO CAL NOW
transfer_byte_num_command(1);
transfer_data_1byte(0x0232,0x01); // refresh register
status=read_data(0x001F);
while(((status)&(0x40))!=0x40) // cal unfinished
{
wait();
status=read_data(0x001F);
}
wait();
wait();
/* P1=0xFF;
for(i=0;i<5;i++);
P1=0x00; */
wait();
}
void main()
{
int i,j;
PCA_Init();
for(i=0;i<1000;i++)
{
for(j=0;j<100;j++);
}
Reset_Sources_Init();
Port_IO_Init();
Oscillator_Init();
initial_9517();
// initial_9627();
wait();
while(1)
{;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -