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