#include "rtc.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
uint8_t data;
void RTC_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOC时钟
//PC2,3初始化设置
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;
GPIO_Initure.Mode=GPIO_MODE_INPUT;
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
RTC_SDA=1;
RTC_SCL=1;
}
//产生IIC起始信号
void RTC_Start(void)
{
RTC_SDA_OUT();
RTC_SCL=1;
delay_us(5);
RTC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(5);
}
//产生IIC停止信号
void RTC_Stop(void)
{
RTC_SDA_OUT();
RTC_SCL=1;
delay_us(5);
RTC_SDA=1;
delay_us(4);
}
//等待应答信号到来
void RTC_Write_Ack(void)
{
RTC_SDA_IN();
RTC_SCL=0;
delay_us(5);
RTC_SCL=1;
delay_us(5);
RTC_SCL=0;
delay_us(5);
RTC_SDA=0;
RTC_SDA_OUT();
delay_us(5);
}
//产生ACK应答
void RTC_Read_Ack(void)
{
RTC_SDA_OUT();
delay_us(5);
RTC_SDA=0;
delay_us(5);
RTC_SCL=1;
delay_us(5);
RTC_SCL=0;
delay_us(5);
RTC_SDA_IN();
delay_us(2);
}
//IIC发送一个字节
void RTC_Send_Byte(u8 txd)
{
u8 t;
RTC_SDA_OUT();
RTC_SCL=0;
delay_us(5);
for(t=0;t<8;t++)
{
RTC_SCL=0;
delay_us(5);
if(txd&0x01)RTC_SDA=1;
else RTC_SDA=0;
txd>>=1;
delay_us(5);
RTC_SCL=1;
delay_us(5);
}
RTC_Write_Ack();
}
//读1个字节
u8 RTC_Read_Byte(u8 data)
{
unsigned char i,receive=0;
RTC_SDA_IN();
for(i=0;i<8;i++ )
{
RTC_SCL=1;
delay_us(5);
RTC_SCL=0;
receive>>=1;
if(READ_RTC_SDA)receive|=0x80;
delay_us(5);
}
return receive;
}
void Clock_init(void)
{
RTC_Init();
RTC_Start();
RTC_Send_Byte(W_RTC_STATUS);
RTC_Send_Byte(W_RTC_24H);
RTC_Stop();
}
void CLOCK_SetDate(u8 *Buffer)
{
u8 i,Clock_RTC_Buffer[7];
for (i=0;i<3;i++)
{
Clock_RTC_Buffer[i]=((Buffer[i]/10)<<4)|(Buffer[i]%10);
Clock_RTC_Buffer[i+4]=((Buffer[i+3]/10)<<4)|(Buffer[i+3]%10);
}
Clock_RTC_Buffer[3]=Buffer[6];//((Buffer[6]/10)<<4)|(Buffer[6]%10);
RTC_Start();
RTC_Send_Byte(W_RTC_YEAR);
//DISPLAY_HEX_CODE(7,0,8,(unsigned char *)&Clock_RTC_Buffer[0],1);
for (i=0;i<7;i++) RTC_Send_Byte(Clock_RTC_Buffer[i]);
RTC_Stop();
}
void CLOCK_SetTime(u8 *Buffer)
{
u8 i,Clock_RTC_Buffer[3];
for (i=0;i<3;i++) Clock_RTC_Buffer[i]=((Buffer[i]/10)<<4)|(Buffer[i]%10);
RTC_Start();
RTC_Send_Byte(W_RTC_HOUR);
for (i=0;i<3;i++) RTC_Send_Byte(Clock_RTC_Buffer[i]);
RTC_Stop();
}
void CLOCK_GetDate(u8 *Buffer)
{
u8 i,Clock_RTC_Buffer[7];
RTC_Start();
RTC_Send_Byte(R_RTC_YEAR);
for (i=0;i<7;i++)
{
Clock_RTC_Buffer[i]= RTC_Read_Byte(data);
if (Clock_RTC_Buffer[i]==0xff) Clock_RTC_Buffer[i]=0;
if (i!=6) RTC_Read_Ack();
}
RTC_Stop();
Buffer[6]=Clock_RTC_Buffer[3];//(Clock_RTC_Buffer[3]&0x0f)+((Clock_RTC_Buffer[3]&0xf0)>>4)*10;
Clock_RTC_Buffer[4]&=0x7f;
for(i=0;i<3;i++)
{
Buffer[i] =(Clock_RTC_Buffer[i]&0x0f)+((Clock_RTC_Buffer[i]&0xf0)>>4)*10;
Buffer[i+3]=(Clock_RTC_Buffer[i+4]&0x0f)+((Clock_RTC_Buffer[i+4]&0xf0)>>4)*10;
}
}
S-35390A RTC读写程序
3星 · 超过75%的资源 需积分: 10 198 浏览量
2019-01-16
21:40:58
上传
评论 2
收藏 2KB ZIP 举报
qq445807936
- 粉丝: 0
- 资源: 1