⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad9517_c控制代码.txt

📁 压缩包中为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 + -