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

📄 bsp_pcf8563.c

📁 使用STR710的IIC接口对PCF8563时钟芯片的测试程序.采用KEIL UV3编译.使用了MDK3.05操作系统.
💻 C
字号:
 /*=========================================================================*
 * 项目:		
 * 文件:		.\src\bsp\BSP_PCF8563.c
 * 描述:		at45db161的驱动程序
 * 编译:		
 * 版本:		0.1
 * 创建日期:	2007年6月21日
 * 最后修订:	
 * 函数列表:
 * 修改历史:		
 * 编译环境:	RVMDK 3.05 + RTL-ARM 3.05
 * ----------------------------------------------------------------------
 * PCF8563接STR710的I2C0
 * 
*=========================================================================*/
#include <71x_lib.h>
#include "bsp_pcf8563.h"
/*=============================================================================
 * 名称:			SC752Delay
 * 描述:			延时
 * 创建:			2007年6月22日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		延时时间
 * 返回值:			None
 * 特殊说明:		RVMDK 3.05 + RTL-ARM 3.05
 *=============================================================================*/
void PCF8563Delay( u32 n )
{
	while ( n-- )
 	;
}

/*=============================================================================
 * 名称:			Config I2C0
 * 描述:			对I2C0进行配置
 * 创建:			2007年6月25日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		None
 * 返回值:			None
 * 特殊说明:		
 *=============================================================================*/
void Config_I2C0( void )
{
	GPIO_Config( GPIO1, I2C0_SDA | I2C0_SCL, GPIO_AF_OD );
	I2C_Init( I2C0 );
	I2C_FCLKConfig( I2C0 );
	I2C_OnOffConfig( I2C0, ENABLE );
	I2C_SpeedConfig( I2C0,200000 );
	I2C_AcknowledgeConfig( I2C0, ENABLE );
}

/*=============================================================================
 * 名称:			Write_PCF8563_Reg
 * 描述:			向指定的寄存器写入参数值
 * 创建:			2007年6月25日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		
 * 返回值:			
 * 特殊说明:		
 *=============================================================================*/
void Write_PCF8563_Reg( u8 RegAddr, u8 dat )
{
	u32 i = 10000;
	//Enable Start generation
	I2C_STARTGenerate( I2C0, ENABLE );
	while ( !( I2C0->SR1 & I2C_SB ) )
	{
		I2C_ERR_EXIT(i);
	}

	//Send the slave address
	I2C0->DR = PCF8563_IC_ADDR & 0xfe;	// Tx
	while ( !( I2C0->SR2 & 0x20 ) )			// ENDAD
	{
		I2C_ERR_EXIT(i);
	}
	I2C0->CR |= 0x20;					// Set PE

	//Send Data to the slave
	while ( !( I2C0->SR1 & I2C_BTF ) )
	{
		I2C_ERR_EXIT(i);
	}
	I2C0->DR = RegAddr;
	while ( !( I2C0->SR1 & I2C_BTF ) )
	{
		I2C_ERR_EXIT(i);
	}
	I2C0->DR = dat;
	while ( !( I2C0->SR1 & I2C_BTF ) )
	{
		I2C_ERR_EXIT(i);
	}

	//Stop the communication
	I2C_STOPGenerate( I2C0, ENABLE );
	while ( I2C0->CR & I2C_STOP_Mask )
	{
		I2C_ERR_EXIT(i);
	}
}
/*=============================================================================
 * 名称:			Read_PCF8563_Reg
 * 描述:			从指定的寄存器读取数值
 * 创建:			2007年6月25日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		
 * 返回值:			
 * 特殊说明:		sssssssssss
 *=============================================================================*/
u8 Read_PCF8563_Reg( u8 RegAddr )
{
	u8 c;
	u32 i = 10000;
	//Enable Start generation
	I2C_STARTGenerate( I2C0, ENABLE );
	while ( !( I2C0->SR1 & I2C_SB ) )
	{
		I2C_ERR_RETURN(i, 0x00);
	}
	//Send the slave address
	I2C0->DR = PCF8563_IC_ADDR & 0xfe;	// Tx
	while ( !( I2C0->SR2 & 0x20 ) )			// ENDAD
	{
		I2C_ERR_RETURN(i, 0x00);
	}
	I2C0->CR |= 0x20;					// Set PE
	//Send Data to the slave
	while ( !( I2C0->SR1 & I2C_BTF ) )
	{
		I2C_ERR_RETURN(i, 0x00);
	}
	I2C0->DR = RegAddr;
	while ( !( I2C0->SR1 & I2C_BTF ) )
	{
		I2C_ERR_RETURN(i, 0x00);
	}
	//Disable I2C acknowledge feature
	I2C_AcknowledgeConfig( I2C0, DISABLE );
	//Enable Start generation
	I2C_STARTGenerate( I2C0, ENABLE );
	while ( !( I2C0->SR1 & I2C_SB ) )
	{
		I2C_ERR_RETURN(i, 0x00);
	}
	//Send the slave address
	I2C0->DR = PCF8563_IC_ADDR | 0x01;	// Rx
	while ( !( I2C0->SR2 & 0x20 ) )			// ENDAD
	{
		I2C_ERR_RETURN(i, 0x00);
	}
	I2C0->CR |= 0x20;					// Set PE
	//Read Data from the slave & stop the communication
	while ( !( I2C0->SR1 & I2C_BTF ) )
	{
		I2C_ERR_RETURN(i, 0x00);
	}
	I2C_STOPGenerate( I2C0, ENABLE );
	c = I2C0->DR;
	while ( I2C0->CR & I2C_STOP_Mask )
	{
		I2C_ERR_RETURN(i, 0x00);
	}

	return c;
}

unsigned int Get_Wday(unsigned int y, unsigned int m, unsigned int d)
{
	unsigned int w, c;
	if (m <= 2)
	{
		m |= 4;//1月2月同5月六月表
		y--;
	}
	c = y / 100;
	c &= 0x03;//百年%4
	y %= 100;
	w = ((c | (c << 2)) + (y + (y >> 2)) + (13 * m + 8)/ 5 + d) % 7;//(星期=百年%4*5+年+年/4+(13*月+8)/5+日)%7
	return w;//返回星期
}
u16 Time_check_valid( RTC_clock *time )
{
	u8 y,m,d,h,min;
	// bcd 转换成 bin
	y = BCD2BIN( time->year );
	m = BCD2BIN( time->month );
	d = BCD2BIN( time->date );
	h = BCD2BIN( time->hour );
	min = BCD2BIN( time->minute );

	if ( ( y > 99 ) || ( m > 12 ) || ( d > 31 ) || ( h > 23 ) || ( min > 59 ) || (d == 0) || (m == 0))
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
/*=============================================================================
 * 名称:			Set_PCF8563_Time
 * 描述:			设置PCF8563时间
 * 创建:			2007年6月25日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		时间数据码类别:BCD,ASC;时间数据
 * 返回值:			None
 * 特殊说明:		
 *=============================================================================*/
void Set_PCF8563_Time( RTC_clock *time )
{
	
	if( !Time_check_valid( time ) )	// 检查时间合法性
	{
		return;
	}
	
	time->wday = Get_Wday(BCD2BIN(time->year),  BCD2BIN(time->month), BCD2BIN(time->date));	// 计算星期
//	os_mut_wait( MUT_i2c, 0xffff );
	Write_PCF8563_Reg( PCF8563_Y_R, time->year );	
	Write_PCF8563_Reg( PCF8563_MON_R, time->month );
	Write_PCF8563_Reg( PCF8563_DAY_R, time->wday);		
	Write_PCF8563_Reg( PCF8563_DAT_R, time->date );	
	Write_PCF8563_Reg( PCF8563_H_R, time->hour );	
	Write_PCF8563_Reg( PCF8563_MIN_R, time->minute );	
	Write_PCF8563_Reg( PCF8563_S_R, time->second );		
//	os_mut_release( MUT_i2c );
}

void Start_PCF8563( void )
{
	u8 temp;
	RTC_clock Time;

	Config_I2C0();

	temp = Read_PCF8563_Reg( PCF8563_C_R );
	temp |=  ~PCF8563_RUN;
	Write_PCF8563_Reg( PCF8563_C_R, temp);
	PCF8563Delay(1000);	
	temp &=  PCF8563_RUN;
	Write_PCF8563_Reg( PCF8563_C_R, temp);



	Time.second = 0x22;
	Time.minute = 0x33;
	Time.hour = 0x14;
	Time.date = 0x25;
	Time.month = 0x06;
	Time.year = 0x07;
	Time.wday = 0x01;
	Set_PCF8563_Time(&Time);
}

/*=============================================================================
 * 名称:			Read_PCF8563_Time
 * 描述:			从PCF8563读取时间数据
 * 创建:			2007年6月25日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		用于存放12个时间字符的缓冲区首地址
 * 返回值:		年、月、日、时、分、秒,每个信息2个字符数据,个位在
 					前,十位在后
 * 特殊说明:		sssssssssss
 *=============================================================================*/
void Read_PCF8563_Time( void )//( u8 *time )
{
	RTC_clock Time;
//	u8 y,m,d,h,min,s,wd;

//	os_mut_wait( MUT_i2c, 0xffff );
	Time.second = Read_PCF8563_Reg( PCF8563_S_R ) & 0x7f; //
	Time.minute = Read_PCF8563_Reg( PCF8563_MIN_R ) & 0x7f; //
	Time.hour = Read_PCF8563_Reg( PCF8563_H_R ) & 0x3f;	// 
	Time.date = Read_PCF8563_Reg( PCF8563_DAT_R ) & 0x3f;	//
	Time.month = Read_PCF8563_Reg( PCF8563_MON_R ) &0x1f;	 //
	Time.year = Read_PCF8563_Reg( PCF8563_Y_R );	//
	Time.wday = Read_PCF8563_Reg( PCF8563_DAY_R) &0x07; //

	if(Time_check_valid( &Time))	// 检查时间合法性
	{
		RTC_clock_bcd.second = Time.second;
		RTC_clock_bcd.minute = Time.minute;
		RTC_clock_bcd.hour = Time.hour;
		RTC_clock_bcd.date = Time.date;
		RTC_clock_bcd.month = Time.month;
		RTC_clock_bcd.year = Time.year;
		RTC_clock_bcd.wday = Time.wday;
	}
	
//	os_mut_release( MUT_i2c );
}

⌨️ 快捷键说明

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