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

📄 cs5522.c

📁 前段时间做的一个东西,用的24位高精度AD转换芯片CS5532和12DA转换器max531的AVR驱动.芯片用的是ATMEGA8515,开发环境ICCAVR.CS5532的内部寄存器太多,设置有些复杂
💻 C
字号:
#include<io8515.h> 
//**************************************************
//PC1-CS5522_CS  PC0-CS5522_SCLK   PB4-CS5522_SDO  
//PB3-CS5522_SDI
//****************************************************
#define cs    0b00000010
#define sclk  0b00000001
#define sdi   0b00001000
#define sdo   0b00010000
//************************************
#define unch    unsigned char
//*************************************
unsigned char data[3];  //receive cs5522's number;
void Cacu_Display(unsigned char temp);
//***********************************
//向CS5522发送一个字节
void Se_Cs_W(unsigned char Cs_Word)
    {   unsigned char Cs_Tem;
        unsigned char Cs_i=8;      
        while(Cs_i)
	       {
	          Cs_Tem=Cs_Word;
			  Cs_Tem=Cs_Tem>>(Cs_i-1);
			  Cs_Tem&=0b00000001;
			  if(Cs_Tem)
			       {PORTB=PORTB|sdi;} 
			  else
			       {PORTB=PORTB&~sdi;}	   
	          PORTC=PORTC|sclk;//clock=1.
			  PORTC=PORTC&(~sclk);//clock=0                      
	          Cs_i--;
	        }
    }

//***********************************
//读一个字节。
unsigned char ReadW()
                 {
				   unsigned char Read_Temp01,Read_Temp02,Read_i;
				   Read_i=8;
				   Read_Temp01=0;
				   Read_Temp02=0;
				   while(Read_i)
				       {       						  
						  Read_Temp01=PINB;
						  PORTC=PORTC|sclk;
					      PORTC=PORTC&~sclk;
						  Read_Temp01=Read_Temp01&sdo;
						  Read_Temp01=Read_Temp01>>4;
			              Read_Temp01=Read_Temp01<<(Read_i-1);
			              Read_Temp02=Read_Temp02+Read_Temp01;
			              Read_i--;						   
					   }
				  return(Read_Temp02); 		 
				 
				 
				 }	  		
//***********************************
//写1字节读3字节。
  void Sen_Rec(unsigned char comaw)
        { 
		  DDRC=DDRC|cs;
		  DDRC=DDRC|sclk;
		  DDRB=DDRB|sdi;
		  DDRB=DDRB&~sdo;
		  PORTB|=sdo;//选择为输入
	      PORTC=PORTC&~cs;  //片选				  		  
	      Se_Cs_W(comaw);
	      data[2]=ReadW();
	      data[1]=ReadW();
	      data[0]=ReadW();
		  PORTC=PORTC|cs;	 
		   }
//************************************
//直接写4字节。
void F_Word(unch write1,unch write2,unch write3,unch write4)
        { DDRC=DDRC|cs;
		  DDRC=DDRC|sclk;
		  DDRB=DDRB|sdi;		  
	      PORTC=PORTC&~cs;  //片选	
		  PORTB|=sdi;			 
		  Se_Cs_W(write1);
		  Se_Cs_W(write2);
		  Se_Cs_W(write3);
		  Se_Cs_W(write4);
		  PORTC=PORTC|cs;	
		
		} 	 
//***********************************
void ADC(unsigned char ADCtemp)
      {
	      
		  DDRC=DDRC|cs;
		  DDRC=DDRC|sclk;
		  DDRB=DDRB|sdi;
		  DDRB=DDRB&~sdo;
		  PORTB|=sdo;//选择为输入
	      PORTC=PORTC&~cs;  //片选				  		  
	      Se_Cs_W(ADCtemp);	      
		  PORTC=PORTC|cs;	 
	  
	  }		
//**********************************
//接收CS5522的数据:
void ReceiveData(void)
        {
		   unsigned char ReceiveTemp;
		   DDRB=DDRB&~sdo;
		   PORTB|=sdo;//选择为输入
		   DDRC=DDRC|cs;
		   PORTC=PORTC&~cs;  //片选		
		   DDRC=DDRC|sclk;
		   PORTC=PORTC|sclk;
		  do	
		   { 
		     ReceiveTemp=PINB;
		     ReceiveTemp=ReceiveTemp&sdo;
			 }
		  while(ReceiveTemp);	 
		  data[2]=ReadW();
		  data[2]=ReadW();
	      data[1]=ReadW();
	      data[0]=ReadW();		  	   
		  PORTC=PORTC|cs;	
		}
//***********************************
//起动串口。
 void initserial(void)
    { 
	  unsigned char Init_Tem=15;
	  DDRC=DDRC|cs;
	  DDRC=DDRC|sclk;
	  PORTC=PORTC&~cs;
	  DDRB=DDRB|sdi;
	  while(Init_Tem)
	      {
		    Se_Cs_W(0xff);
			Init_Tem--;		  
		   }
	  Se_Cs_W(0xfe);	
	  PORTC=PORTC|cs;
	}
//***********************************
//配置CS5522
void InitCs(void)
        {
		
		     unsigned char InitTemp;
		     initserial();    //起动串口。     
//===================设置配置寄存器=======================
//配置RS位寄存器写一 
       //  distemp();
         F_Word(0x03,0x00,0x00,0x80);    //直接写4字节

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -