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

📄 x5045.c

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


//////////////////////////////////////////////////////

//extern 	PRODUCESETING  	xdata	SYSTEMCONFIG;
//extern	TRANFORMGLOBAL 	xdata 	SYSTEMINI;
extern CALIPARAM idata pHCaliParam;
extern TRANSMISSION idata TransData;

/*************************************************
//函 数 名:	wbyte_wdt()
//功    能:	向x5045写入1Byte数据 (内部函数)
//输入参数:	w_byte(写入的数据)
//返 回 值:	无
*************************************************/
static void wbyte_wdt(unsigned char w_byte)
{
	unsigned char i;

	for(i = 0; i < 8; ++i)
	{
		
		__WDTSCK = 0;

		if(w_byte & 0x80)
		{
			__WDTMOSI = 1;	/* set port pin high to read data */
		}
		else
		{
			__WDTMOSI = 0;			
		}
		__WDTSCK = 1;
		w_byte <<= 1;
	}
}

/*************************************************
//函 数 名:	rbyte_wdt()
//功    能:	从x5045中读取1 byte数据
//输入参数:	无
//返 回 值:	r_byte(读出的数据)
*************************************************/
static unsigned char rbyte_wdt(void)
{
	unsigned char i, r_byte;

	//释放数据总线
	__WDTMISO = 1;
	r_byte=0;
	for(i=0; i<8; ++i)
	{
		//下降延送出数据
		__WDTSCK = 1;
		__WDTSCK = 0;
		
		//最高位在前
		r_byte <<= 1;
		if (__WDTMISO)
		{
			r_byte |= 0x01;
		}
	}


	return r_byte;
}

/*************************************************
//函 数 名:	IfBusyX5045()
//功    能:	判忙5045芯片
//输入参数:	无
//返 回 值:	无
*************************************************/
void	IfBusyX5045(void)
{
	unsigned char	i;

	__WDTCS = 0;						//打开x5045

	for(i = 0; i < 100; i++)
	{
		wbyte_wdt(WDT_RSDR);			//读状态字
		if(!(rbyte_wdt() & 0x01))		// = 0,不忙
		break;
	}

	__WDTCS = 1;						//关闭x5045
//	__WDTCS = 0;						//打开x5045
}

/*************************************************
//函 数 名:	WriteX5045()
//功    能:	写入x5045内部数据
//输入参数:	addr(数据写入的地址),sdata(数据源指针),
			len(写入数据的数量)
//返 回 值:	无
*************************************************/
 void	WriteX5045(short addr, unsigned char* sdata, unsigned char len)
{
	char	i;

	if(addr >= 512 || len == 0)			//x5045容量为512字节,写入长度为0字节
		return;

	while(addr < 512)
	{
		__WDTCS = 0;						//打开x5045
		wbyte_wdt(WDT_WREN);				//打开写使能
		__WDTCS = 1;						//关闭x5045
	
		__WDTCS = 0;						//打开x5045

		//写入多字节指令,判断地址在上半区还是下半区
		wbyte_wdt((addr >= 256) ? (WDT_WRITE | 0x08) : WDT_WRITE);
		
		//写入地址
		wbyte_wdt((char)(addr % 256));
		
		//写入数据,16个字节为一包
		for(i = 0; i <= 16; i++)
		{
			wbyte_wdt(*sdata);				//写数据
			sdata ++;						//数据指针+1
			addr ++;						//地址+1
			len --;							//剩余数据数量-1


			//判断停止传输数据条件
			if(len == 0 || addr >= 512)
			{
				__WDTCS = 1;				//关闭x5045
				IfBusyX5045();				//等待写入
				return;
			}
			//判断x5045的页是否到头(16字节/每页)
			if((addr & 0x000F) == 0)
			{
				__WDTCS = 1;				//关闭x5045
				IfBusyX5045();				//等待写入
				break;
			}			
		}
	}  
}

/*************************************************
//函 数 名:	ReadX5045()
//功    能:	读取x5045内部数据
//输入参数:	addr(数据读取的地址),sdata(目标数据指针),
			len(读取数据的数量)
//返 回 值:	无
*************************************************/
void	ReadX5045(short addr, unsigned char* sdata, unsigned char len)
{
 	if(addr >= 512 || len == 0)			//x5045容量为512字节,写入长度为0字节
		return;

	__WDTCS = 0;						//打开x5045

	//读取多字节指令,判断地址在上半区还是下半区
	wbyte_wdt((addr >= 256) ? (WDT_READ | 0x08) : WDT_READ);
	
	//写入读取地址
	wbyte_wdt((char)(addr % 256));
		
	//读取数据
	for(; len > 0; len --)
	{
		*sdata = rbyte_wdt();			//读取数据
		sdata ++;						//数据指针+1
		addr ++;						//地址+1

		//判断停止传输数据条件,读取地址超出范围
		if(addr >= 512)
		{
			__WDTCS = 1;				//关闭x5045
			return;
		}
	}

	//数据读取完毕
	__WDTCS = 1;				//关闭x5045
	return;

}

/*************************************************
//函 数 名:	ResetWDT()
//功    能:	喂狗
//输入参数:	无
//返 回 值:	无
*************************************************/
void	ResetWDT(void)
{
	__WDTCS = 0;						//打开x5045
	delay_us(2);						//打开写使能
	__WDTCS = 1;						//关闭x5045

}

/*************************************************
//函 数 名:	X5045_Start()
//功    能:	初始化时钟芯片
//输入参数:	无
//返 回 值:	无
*************************************************/
void	X5045_Start(void)
{
	__WDTCS = 0;						//打开x5045

	wbyte_wdt(WDT_WREN);				//打开写使能
	__WDTCS = 1;						//关闭x5045
	__WDTCS = 0;						//打开x5045

	wbyte_wdt(WDT_WRSR);				//写状态字

	wbyte_wdt(0x00);				//,打开wdt
	__WDTCS = 1;						//关闭x5045

}
/*************************************************
//函 数 名:	X5045_Stop()
//功    能:	初始化时钟芯片
//输入参数:	无
//返 回 值:	无
*************************************************/
void	X5045_Stop(void)
{
	__WDTCS = 0;						//打开x5045

	wbyte_wdt(WDT_WREN);				//打开写使能
	__WDTCS = 1;						//关闭x5045
	__WDTCS = 0;						//打开x5045

	wbyte_wdt(WDT_WRSR);				//写状态字

	wbyte_wdt(0x30);				//关闭wdt
	__WDTCS = 1;						//关闭x5045

}

/*************************************************
//函 数 名:	PutDataConfig()
//功    能:	写入标定数据
//输入参数:	无
//返 回 值:	无
*************************************************/
void	PutCaliParam(void)
{
	//获取标定数据指针
	unsigned char* sdata =(unsigned char*) &pHCaliParam;

	//写入数据
	WriteX5045(0x0000, sdata, sizeof(CALIPARAM));
}

/*************************************************
//函 数 名:	GetDataConfig()
//功    能:	读取标定数据
//输入参数:	无
//返 回 值:	无
*************************************************/
void	GetCaliParam(void)
{
	//获取标定数据指针
	unsigned char* sdata = (unsigned char*) &pHCaliParam;

	//读取数据
	ReadX5045(0x0000, sdata, sizeof(CALIPARAM));
	pHCaliParam.Mode =MODE_PH_ATC;
	pHCaliParam.pHOnlineLower =pHCaliParam.pHLower ;
	pHCaliParam.pHOnlineUpper =pHCaliParam.pHUpper ;
	pHCaliParam.OrpOnlineLower=pHCaliParam.pHLower ;
	pHCaliParam.OrpOnlineUpper=pHCaliParam.pHUpper ;

}

/*************************************************
//函 数 名:	GetSYSConfig()
//功    能:	读取系统参数
//输入参数:	无
//返 回 值:	无
************************************************

void	GetSYSConfig(void)
{
	//unsigned char *sdata = &SYSTEMCONFIG;
	//
	//ReadX5045(0x0100,sdata,sizeof(PRODUCESETING));	
}*/

/*************************************************
//函 数 名:	PutSYSConfig()
//功    能:	写入系统参数
//输入参数:	无

//返 回 值:	无
************************************************
void	PutSYSConfig(void)
{
	//unsigned char *sdata = &SYSTEMCONFIG;
	//WriteX5045(0x0100,sdata,sizeof(PRODUCESETING));
}*/


⌨️ 快捷键说明

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