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

📄 cs5529.c

📁 AD芯片CS5529的驱动程序,包括SPI读写函数,初始化函数,校准函数,转换函数,复位函数等等.
💻 C
字号:
/*========================================================/
/														  /
/ Copyright (C), 2001-2005, Pangu Automation. Co., Ltd.	  /	
/ FileName:		CS5529.c								  /
/ Author:		Zheng M.D.							  	  /
/ Version:		1.0										  /
/ Date:			2005.11.12								  /
/ Description:	CS5529驱动程序			  				  /
/ Modify:												  /
/														  /
/========================================================*/

#include <reg52.h>
#include "include/CS5529.h"
#include "include/time.h"

/**********************************************************************
CS5529的全局变量定义
**********************************************************************/

/***********************************************
Offset与 Gain寄存器共用一个变量
***********************************************/
unsigned char idata CS5529_OffetGainReg[3];

/***********************************************
配置寄存器变量
***********************************************/
unsigned char bdata CS5529_ConfigReg[3];

/***********************************************
转换数据寄存器变量
***********************************************/
unsigned char bdata CS5529_DataReg[3];



/**********************************************************************
CS5529的配置位定义
**********************************************************************/
//Low Power Mode(0:Normal Mode 2.5mW;1:Reduced Power Mode 1mW)												 
sbit	__CS5529_CONFIG_LPM			= CS5529_ConfigReg[0]^0;
//Unipolar/Bipolar(0:Bipolar;1:Unipolar)
sbit	__CS5529_CONFIG_UB			= CS5529_ConfigReg[1]^4;
//Reset System(0:Normal;1:复位系统,复位完后将RS位置0返回正常模式)
sbit	__CS5529_CONFIG_RS			= CS5529_ConfigReg[2]^7;
//Reset Valid(0:没有复位产生;1:已经产生影响有效的复位)
sbit	__CS5529_CONFIG_RV			= CS5529_ConfigReg[2]^6;
//Port Flag(0:Port Flag Mode Inactive此时通过查询配置寄存器的DF标志位判断数据转换是否完成;
//1:Port flag Mode active 此时能过查询SDO线判断数据转换是否完成)
sbit	__CS5529_CONFIG_PF			= CS5529_ConfigReg[2]^5;
//Power Save Select(0:标准模式,时钟正常;1:睡眠模式,时钟关闭
sbit	__CS5529_CONFIG_PSS			= CS5529_ConfigReg[2]^4;
//Done Flag (1:校准或者数据转换完成)
sbit	__CS5529_CONFIG_DF			= CS5529_ConfigReg[2]^3;

/**********************************************************************
CS5529的数据位定义
**********************************************************************/
//数据溢出
sbit	__CS5529_DATA_OF			= CS5529_DataReg[2]^0;
//振荡检测,当输入大大的超出范围(-2.5V~+2.5V)时,置位,此时的转换是不正确的
sbit	__CS5529_DATA_OD			= CS5529_DataReg[2]^1;

/*************************************************
//函 数 名:	CS5529_WriteCmd(unsigned char nCmd)
//功    能:	CS5529写命令子程序
//输入参数:	nCmd(unsigned char)命令字
			
//返 回 值:	无
//备    注:	
*************************************************/
void CS5529_WriteCmd(unsigned char nCmd)
{
	
	unsigned char i;
	__CS5529_SCLK = 0;
  	for(i = 0; i < 8; i++)
	{	   	           					  						
		if(nCmd&0x80)					 //低电平写数据,高电平读数据
		{	 
			__CS5529_SDI=1; 
		}
		else
		{
			__CS5529_SDI=0;
		}
     		 
  		delay_us(CS5529_DELAY);			//光偶廷时
       	__CS5529_SCLK = 1;

 		delay_us(CS5529_DELAY);
	    __CS5529_SCLK = 0;

		nCmd <<= 1;						  
	} 
	delay_us(CS5529_DELAY);
}
/*************************************************
//函 数 名:	CS5529_WriteReg(unsigned char nReg)
//功    能:	CS5529写寄存器值子程序
//输入参数:	nReg(unsigned char)寄存器编址
			
//返 回 值:	无
//备    注:	数据来源CS5529_OffetGainReg,
			CS5529_ConfigRega.
			调用些子程序前要先调用WriteCmd写入写数据命令
*************************************************/
void CS5529_WriteReg(unsigned char nReg)
{
 	unsigned char idata *pWriteData;
	unsigned char i,j,temp;
	//不同的寄存器选择不同的内存
	if((nReg==CS5529_REG_OFFSET)||(nReg==CS5529_REG_GAIN))
	{
		pWriteData=CS5529_OffetGainReg;
	}
	if(nReg==CS5529_REG_CONFIGURATION)
	{
		pWriteData=CS5529_ConfigReg;
	}
	if(nReg==CS5529_REG_DATA)
	{
		pWriteData=CS5529_DataReg;
	}
	//写数据,24个时钟周期
	for(j=0;j<3;j++)
	{
		temp=*(pWriteData+j);
	  	for(i = 0; i < 8; i++)
		{	   	           					  						
			if(temp&0x80)
			{
				__CS5529_SDI=1; 
			}
			else
			{
				__CS5529_SDI=0;
			}
	     		 
	  		delay_us(CS5529_DELAY);
	       	__CS5529_SCLK = 1;
	
	 		delay_us(CS5529_DELAY);
		    __CS5529_SCLK = 0;
	
			temp<<= 1;						  
		}
	}
	delay_us(CS5529_DELAY);
	//__CS5529_CS=1;
}
/*************************************************
//函 数 名:	CS5529_ReadReg(unsigned char nReg)
//功    能:	CS5529读寄存器值子程序
//输入参数:	nReg(unsigned char)寄存器编址
			
//返 回 值:	无
//备    注:	读上来的数据保存在CS5529_OffetGainReg,
			CS5529_ConfigRega或CS5529_DataReg;
			分别对应寄存器.
			调用些子程序前要先调用WriteCmd写入读数据命令
*************************************************/
void CS5529_ReadReg(unsigned char nReg)
{
 	unsigned char idata *pWriteData;
	unsigned char i,j,temp;
   	//不同的寄存器选择不同的内存
	if((nReg==CS5529_REG_OFFSET)||(nReg==CS5529_REG_GAIN))
	{
		pWriteData=CS5529_OffetGainReg;
	}
	if(nReg==CS5529_REG_CONFIGURATION)
	{
		pWriteData=CS5529_ConfigReg;
	}
	if(nReg==CS5529_REG_DATA)
	{
		pWriteData=CS5529_DataReg;
	}
	//读数据,24个时钟周期
	for(j=0;j<3;j++)
	{
		temp=0x00;
	  	for(i = 0; i < 8; i++)
		{	
			__CS5529_SCLK = 1; 	 //低电平写数据,高电平读数据
		  	delay_us(CS5529_DELAY);
	
			temp<<=1;
	
			if(__CS5529_SDO)
			{
				temp|=0x01;
			}
	
	     	 __CS5529_SCLK = 0;	 
	 		delay_us(CS5529_DELAY);  						  
		}
		*(pWriteData+j)=temp;
	}
	delay_us(CS5529_DELAY);
	//__CS5529_CS=1;
}
/*************************************************
//函 数 名:	CS5529_SyncSeq(
//功    能:	SPI初始化序列
//输入参数:	无
			
//返 回 值:	无
//备    注:	
*************************************************/
void CS5529_SyncSeq()
{
	unsigned char i;
	//__CS5529_CS=0;
	for(i=0;i<16;i++)
	{
		CS5529_WriteCmd(CS5529_CMD_SYNC1);//最少15个SYNC1("11111111")序列
	}
	CS5529_WriteCmd(CS5529_CMD_SYNC0); //以1个SYNC0("11111110")序列结束
	//__CS5529_CS=1;
}
/*************************************************
//函 数 名:	CS5529_StartupDelay()
//功    能:	上电后延时子程序
//输入参数:	无
			
//返 回 值:	无
//备    注:	CS5529在上电后必需延时500ms.
*************************************************/
void CS5529_StartupDelay()
{
	unsigned char i,j;
	for(j=0;j<50;j++)
	{
		for(i=0;i<50;i++)
		{
			delay_us(200);
		}
	}
}
/*************************************************
//函 数 名:	CS5529_Reset()
//功    能:	复位子函数
//输入参数:	无
			
//返 回 值:	无
//备    注:	
*************************************************/
void CS5529_Reset()
{
	/*将配置寄存器的RS位置1并写入CS5529*/
	__CS5529_CONFIG_RS=1;
	CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);
	CS5529_WriteReg(CS5529_REG_CONFIGURATION);
	/*读配置寄存器直到RV标志位等于1*/
	do{
		CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
 		CS5529_ReadReg(CS5529_REG_CONFIGURATION);
	}while(__CS5529_CONFIG_RV!=1);
	/*清除RS位,回到命令模式*/
	__CS5529_CONFIG_RS=0;
	CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);
	CS5529_WriteReg(CS5529_REG_CONFIGURATION);
	/*再次读CS5529的状态*/
 	CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
	CS5529_ReadReg(CS5529_REG_CONFIGURATION);

}

/*************************************************
//函 数 名:CS5529_Init()	
//功    能:初始化CS5529	
//输入参数:无	
			
//返 回 值:无	
//备    注:	
*************************************************/
void CS5529_Init()
{
	
	__CS5529_SDO=1;
	CS5529_Selected();//选择CS5529(本系统中CS5529的SPI总线是独立的,所以一直选中)
	CS5529_StartupDelay(); //初始化廷时
	CS5529_SyncSeq();//初始化SPI总线
	CS5529_Reset();//复位CS5529
 	CS5529_SetPortFlag();//设置成Porg Flag模式,通过SDO判断是否完成校准或者数据转换
 	CS5529_SelfCalibration(CS5529_OFFSET_SELF_CALIBRATION);	//自我校准	 			   
	CS5529_SetWordRate(CS5529_WORD_RATE_15);//设置每秒转换次数
	//CS5529_LatchOutputs(6);//输出数字量
	//CS5529_SetGain(0); //设置内部放大陪数
}
/*************************************************
//函 数 名:CS5529_SetPortFlag()	
//功    能:设置为PortFlag模式	
//输入参数:无	
			
//返 回 值:无	
//备    注:	
*************************************************/
void CS5529_SetPortFlag()
{

	 __CS5529_CONFIG_PF=1; //Port Flag有效
	 CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);	 
	 CS5529_WriteReg(CS5529_REG_CONFIGURATION);
	 delay_us(120);
	 CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
	 CS5529_ReadReg(CS5529_REG_CONFIGURATION);
}


/*************************************************
//函 数 名:CS5529_SelfCalibration(unsigned char Type)	
//功    能:自校准	
//输入参数:Type(unsigned char)自校准类型	
			
//返 回 值:无	
//备    注:自校准类型由CS5529.h预定义	
*************************************************/
void CS5529_SelfCalibration(unsigned char Type)
{

	 CS5529_ConfigReg[2]|=Type;	//ConfigReg的0~2位是校准类型
	 CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);	 
	 CS5529_WriteReg(CS5529_REG_CONFIGURATION);
	 //等待校准完成
 	 //当SDO=0时退出等待
	 //在调用该子程序前应先将PorgFlag设为有效
	 while(__CS5529_SDO==1){}

 	 delay_us(120);	
 	 CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
	 CS5529_ReadReg(CS5529_REG_CONFIGURATION);

}
/*************************************************
//函 数 名:CS5529_SetWordRate(unsigned char wordrate)	
//功    能:设置转换速率	
//输入参数:wordrate(unsigned char)每秒转换次数	
			
//返 回 值:无
//备    注:转换速率由头文件CS5529.h预定义	
*************************************************/
void CS5529_SetWordRate(unsigned char wordrate)
{

	 CS5529_ConfigReg[1]|=wordrate;	//ConfigReg的13~15设置转换速率
	 CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);	 
	 CS5529_WriteReg(CS5529_REG_CONFIGURATION);
	 delay_us(120);
	 CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
	 CS5529_ReadReg(CS5529_REG_CONFIGURATION);
	 //delay_us(120);

}
/*************************************************
//函 数 名:CS5529_LatchOutputs(unsigned char outputs)	
//功    能:CS5529的4个开关量输出,用于选择模拟开关通道	
//输入参数:outputs(unsigned char)开关量	
			
//返 回 值:无	
//备    注:	
************************************************
void CS5529_LatchOutputs(unsigned char outputs)
{
	 outputs=outputs<<2;
	 CS5529_ConfigReg[0]|=outputs;

	 delay_us(120);
	 CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
	 CS5529_ReadReg(CS5529_REG_CONFIGURATION);
	 //delay_us(120);
}*/
/*************************************************
//函 数 名:CS5529_SetGain(unsigned char GainIndex)	
//功    能:设定放大倍数
//输入参数:GainIndex (unsigned char)
			
//返 回 值:无	
//备    注:放大倍数由表格给出,能过索引获取GainReg值	
************************************************
void CS5529_SetGain(unsigned char GainIndex)
{
	CS5529_OffetGainReg[0]=GainTable[GainIndex][0];	
	CS5529_OffetGainReg[1]=GainTable[GainIndex][1];
	CS5529_OffetGainReg[2]=GainTable[GainIndex][2];
	CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_GAIN);	 
	CS5529_WriteReg(CS5529_REG_GAIN);
}*/

/*************************************************
//函 数 名:CS5529_SingleConversion()	
//功    能:进行一次转换
//输入参数:无
			
//返 回 值:无	
//备    注:
*************************************************/
void CS5529_SingleConversion()
{
  	CS5529_WriteCmd(CS5529_CMD_SINGLE_CONVERSION);
	//等待转换完成
 	//当SDO=0时退出等待
	//在调用该子程序前应先将PorgFlag设为有效
	while(__CS5529_SDO==1){}
	CS5529_WriteCmd(CS5529_CMD_NULL);
	CS5529_ReadReg(CS5529_REG_DATA);
	//__CS5529_DATA_SIG=~__CS5529_DATA_SIG;

}

⌨️ 快捷键说明

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