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

📄 dps2812_rtc_func.c

📁 合众达2812开发例程
💻 C
字号:
/****************************************************************************
	filename	DPS2812_RTC_FUNC.c
	designer	戴展波
	date:		2004/12/27
****************************************************************************/

#include "DSP28_Device.h"
#include "DPS2812_RTC_FUNC.h"

/*********************************************************************
	函数名:	void init_rtc(void)
	目的:		初始化RTC
	输入:		无
	输出:		无
*********************************************************************/
void init_rtc(void)
{
	IIC_SCL_DIR(OUTPUT);
	IIC_SDA_DIR(OUTPUT);
	delay_time(50);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(100);
	IIC_SDA_OUT(HIGH_LEVEL);
	delay_time(100);
}

/*********************************************************************
	函数名:	void delay_time(unsigned int value)
	目的:		时钟延迟
	输入:		value	延迟值
	输出:		无
*********************************************************************/
void delay_time(unsigned int value)
{
	unsigned int i;
	for(i = 0; i < value; i++)
	{
		NOP;
	}
}

/*********************************************************************
	函数名:	void IIC_SDA_DIR(unsigned int dir)
	目的:		SDATA输出方向
	输入:		dir	方向值
			OUTPUT:	输出
			INPUT:	输入
	输出:		无
*********************************************************************/
void IIC_SDA_DIR(unsigned int dir)
{
	switch(dir)
	{
		case OUTPUT:
			//set sdata is output
			EALLOW;
     			//设置PE02为SDA输出
     			GpioMuxRegs.GPEDIR.bit.GPIOE2 = 1;   	
     			EDIS;
			break;
			
		case INPUT:
			//set sdata is input
			EALLOW;
     			//设置PE02为SDA输入
     			GpioMuxRegs.GPEDIR.bit.GPIOE2 = 0;   	
     			EDIS;
			break;
			
		default:
			break;
	}
}

/*********************************************************************
	函数名:	void IIC_SCL_DIR(unsigned int dir)
	目的:		SCLK输出方向
	输入:		dir	方向值
			OUTPUT:	输出
			INPUT:	输入
	输出:		无
*********************************************************************/
void IIC_SCL_DIR(unsigned int dir)
{
	switch(dir)
	{
		case OUTPUT:
			//set sclk is output
			EALLOW;
     			//设置PE02为SCL输出
     			GpioMuxRegs.GPFDIR.bit.GPIOF14 = 1;   	
     			EDIS;
			break;
			
		case INPUT:
			//set sclk is input
			EALLOW;
     			//设置PE02为SCL输入
     			GpioMuxRegs.GPFDIR.bit.GPIOF14 = 0;   	
     			EDIS;
			break;
			
		default:
			break;
	}
}

/*********************************************************************
	函数名:	void IIC_SCL_OUT(unsigned int data)
	目的:		SCLK输出信号
	输入:		data	信号值
	输出:		无
*********************************************************************/
void IIC_SCL_OUT(unsigned int data)
{
	//sclk keep high level
	GpioDataRegs.GPFDAT.bit.GPIOF14 = data;
}

/*********************************************************************
	函数名:	void IIC_SDA_OUT(unsigned int data)
	目的:		SDATA输出信号
	输入:		data	信号值
	输出:		无
*********************************************************************/
void IIC_SDA_OUT(unsigned int data)
{
	//sdin start status is low_edge
	GpioDataRegs.GPEDAT.bit.GPIOE2 = data;
}

/*********************************************************************
	函数名:	unsigned int IIC_SDA_IN(void)
	目的:		SDATA输入信号
	输入:		无
	输出:		信号值
*********************************************************************/
unsigned int IIC_SDA_IN(void)
{
	unsigned int i;
	i = GpioDataRegs.GPEDAT.bit.GPIOE2;
	return i;
}

/*********************************************************************
	函数名:	void Write_Start_bit(void)
	目的:		RTC通讯起始位
	输入:		无
	输出:		无
*********************************************************************/
void Write_Start_bit(void)
{
	//sdata 输出
	IIC_SDA_DIR(OUTPUT);
	//sclk 输出高电平
	IIC_SCL_OUT(HIGH_LEVEL);
	//sdata 输出高电平
	IIC_SDA_OUT(HIGH_LEVEL);
	//4.7us
	delay_time(50);
	IIC_SDA_OUT(LOW_LEVEL);
	//
	delay_time(100);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(100);	
}

/*********************************************************************
	函数名:	void Write_Stop_bit(void)
	目的:		RTC通讯起始位
	输入:		无
	输出:		无
*********************************************************************/
void Write_Stop_bit(void)
{
	//sdata 方向输出
	IIC_SDA_DIR(OUTPUT);
	//sdata 数据输出
	IIC_SDA_OUT(LOW_LEVEL);
	IIC_SCL_OUT(HIGH_LEVEL);
	delay_time(50);
	IIC_SDA_OUT(HIGH_LEVEL);
	delay_time(100);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(100);
}

/*********************************************************************
	函数名:	unsigned int Read_Rtc_ACK(void)
	目的:		应答
	输入:		无
	输出:		返回值
			1:	失败
			0:	成功
*********************************************************************/
unsigned int Read_Rtc_ACK(void)
{
	unsigned int i;
	//sdata 方向输入,sclk上降沿有效
	IIC_SDA_DIR(INPUT);
	IIC_SCL_OUT(HIGH_LEVEL);
	delay_time(50);
	i = IIC_SDA_IN() & 1;
	delay_time(100);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(100);
	return(i);
}

/*********************************************************************
	函数名:	void Write_Rtc(unsigned int Rtc_Var)
	目的:		RTC参数写
	输入:		Rtc_Var		RTC参数值
	输出:		无
*********************************************************************/
void Write_Rtc(unsigned int Rtc_Var)
{
	int i;
	//sdata 输出,sclk下降沿有效
	IIC_SDA_DIR(OUTPUT);
	for(i = 7; i >= 0; i--)
	{
		//sdata 
		IIC_SDA_OUT((Rtc_Var >> i) & 1);
		delay_time(50);
		IIC_SCL_OUT(HIGH_LEVEL);
		delay_time(100);
		IIC_SCL_OUT(LOW_LEVEL);
		delay_time(100);
	}
}

/*********************************************************************
	函数名:	unsigned int Read_Rtc(void)
	目的:		RTC参数读
	输入:		无
	输出:		RTC参数值
*********************************************************************/
unsigned int Read_Rtc(void)
{
	unsigned int i,k,var1[8];
	k = 0;
	//sdata 输入,sclk下降沿有效
	IIC_SDA_DIR(INPUT);
	for(i = 0; i < 8; i++)
	{
		IIC_SCL_OUT(HIGH_LEVEL);
		delay_time(50);
		var1[i] = IIC_SDA_IN()&1;
		k = k | (var1[i] << (7 - i));
		delay_time(100);
		IIC_SCL_OUT(LOW_LEVEL);
		delay_time(100);
	}
	return k;
}

/*********************************************************************
	函数名:	void Write_Seq(unsigned int first_addr,unsigned int *data,unsigned int length)
	目的:		连续写数据
	输入:		first_addr	首地址
			*data		要写入的数据
			length		要写入数据的长度
	输出:		无
*********************************************************************/
void Write_Seq(unsigned int first_addr,unsigned int *data,unsigned int length)
{
	 int i;
	//写开始位
	Write_Start_bit();
	
	
	
	//写SLAVE—ADDRESS
	Write_Rtc(SLAVE_ADDRESS);
	//应答
	if(Read_Rtc_ACK() == 1)
	{
		while(1);
	}
	//写首地址
	Write_Rtc(first_addr);
	//应答
	if(Read_Rtc_ACK() == 1)
	{
		while(1);
	}
	//写数据
	for(i = 0; i < length; i++)
	{
		//写数据
		Write_Rtc(*(data+i));
		//应答
		if(Read_Rtc_ACK() == 1)
		{
			while(1);
		}
	}
	//写停止位
	Write_Stop_bit();
}

/*********************************************************************
	函数名:	void Read_Seq(unsigned int first_addr,unsigned int *data,unsigned int length)
	目的:		连续读数据
	输入:		first_addr	首地址
			*data		要写入的数据
			length		要写入数据的长度
	输出:		无
*********************************************************************/
void Read_Seq(unsigned int first_addr,unsigned int *data,unsigned int length)
{
	unsigned int i;
	//写开始位
	Write_Start_bit();
	//写SLAVE—ADDRESS
	Write_Rtc(SLAVE_ADDRESS);
	//应答
	if(Read_Rtc_ACK() == 1)
	{
		while(1);
	}
	//写首地址
	Write_Rtc(first_addr);
	//应答
	if(Read_Rtc_ACK() == 1)
	{
		while(1);
	}
	//写停止位
	//Write_Stop_bit();
	//写开始位
	Write_Start_bit();
	//写SLAVE—ADDRESS
	Write_Rtc(SLAVE_ADDRESS|0x01);
	//应答
	if(Read_Rtc_ACK() == 1)
	{
		while(1);
	}
	//写数据
	*data = Read_Rtc();
	//写数据
	for(i = 1; i < length; i++)
	{
		//应答
		Write_Rtc_ACK();
		//写数据
		*(data+i) = Read_Rtc();
	}
	//写停止位
	Write_Stop_bit();
}

/*********************************************************************
	函数名:	void Write_Rtc_ACK(void)
	目的:		写RTC应答
	输入:		无
	输出:		无
*********************************************************************/
void Write_Rtc_ACK(void)
{
	//SDATA 方向输出
	IIC_SDA_DIR(OUTPUT);
	//sdata输出低电平
	IIC_SDA_OUT(LOW_LEVEL);
	delay_time(50);
	IIC_SCL_OUT(HIGH_LEVEL);
	delay_time(100);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(100);
}

⌨️ 快捷键说明

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