📄 bsp_pcf8563.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 + -