#include "RTC.h"
|
#include "delay.h"
|
|
|
|
calendar_obj calendar;
|
|
|
|
//IIC ½ÓÊÜÊý¾ÝÁÙʱ»º³åÇø
|
u8 I2C_RECV_DATA[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};//second minutes hour week date month year
|
|
|
/*******************************************
|
IIC ÐźŽáÊøÐźź¯Êý
|
********************************************/
|
// // void I2C_STOP(void)
|
// // {
|
// // SDA_OUT();//sdaÏßÊä³ö
|
// // IIC_SCL=0;
|
// // IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
|
// // delay_us(3);
|
// // IIC_SCL=1;
|
// // IIC_SDA=1;//·¢ËÍI2C×ÜÏß½áÊøÐźÅ
|
// // delay_us(3);
|
// // }
|
|
// /*******************************************
|
// IIC ÐÅºÅÆðʼÐźź¯Êý
|
// ********************************************/
|
// void I2C_START(void)
|
// {
|
// SDA_OUT(); //sdaÏßÊä³ö
|
// IIC_SDA=1;
|
// IIC_SCL=1;
|
// delay_us(3);
|
// IIC_SDA=0;//START:when CLK is high,DATA change form high to low
|
// // DS1339_SDA_LOW;
|
// delay_us(3);
|
// IIC_SCL=0;
|
// }
|
|
|
// //////////////////////
|
|
// //µÈ´ýÓ¦´ðÐźŵ½À´
|
// //·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
|
// // 0£¬½ÓÊÕÓ¦´ð³É¹¦
|
// u8 I2C_Wait_Ack(void)
|
// {
|
// u8 ucErrTime=0;
|
// SDA_IN(); //SDAÉèÖÃΪÊäÈë
|
// IIC_SCL=1;delay_us(3);
|
// while(READ_SDA)
|
// {
|
// ucErrTime++;
|
// if(ucErrTime>250)
|
// {
|
// I2C_STOP();
|
// return 1;
|
// }
|
// }
|
// IIC_SCL=0;//ʱÖÓÊä³ö0
|
// return 0;
|
// }
|
|
|
// //²úÉúACKÓ¦´ð
|
// void I2C_Ack(void)
|
// {
|
// IIC_SCL=0;
|
// SDA_OUT();
|
// IIC_SDA=0;
|
// delay_us(3);
|
// IIC_SCL=1;
|
// delay_us(3);
|
// IIC_SCL=0;
|
// delay_us(3);
|
// }
|
|
|
|
// //²»²úÉúACKÓ¦´ð
|
// void I2C_NAck(void)
|
// {
|
// IIC_SCL=0;
|
// SDA_OUT();
|
// IIC_SDA=1;
|
// delay_us(3);
|
// IIC_SCL=1;
|
// delay_us(3);
|
// IIC_SCL=0;
|
// }
|
|
// /*******************************************
|
// IIC ·¢ËÍ×Ö½Úº¯Êý
|
// ²ÎÊý 1£ºÒª·¢ËÍ×Ö½ÚÖµ
|
// return £ºÎÞ·µ»Ø
|
// ********************************************/
|
// void I2C_TxByte(unsigned char nValue)
|
// {
|
// int i;
|
// SDA_OUT();
|
// IIC_SCL=0;
|
// for(i = 0;i < 8;i++)
|
// {
|
// if(nValue & 0x80)
|
// IIC_SDA=1;
|
// else
|
// IIC_SDA=0;
|
// nValue <<= 1;
|
// delay_us(3);
|
// IIC_SCL=1;
|
// delay_us(3);
|
// IIC_SCL=0;
|
// delay_us(3);
|
// }
|
// }
|
|
// /*******************************************
|
// IIC ½ÓÊÕ×Ö½Úº¯Êý
|
// ²ÎÊý ÎÞ
|
// return £ºÎÞ·µ»Ø
|
// ********************************************/
|
// u8 I2C_RxByte(void)
|
// {
|
// unsigned char nTemp = 0;
|
// int i;
|
//
|
// SDA_IN();//SDAÉèÖÃΪÊäÈë
|
//
|
// for(i = 0;i < 8;i++)
|
// {
|
|
// IIC_SCL=1;
|
// if(READ_SDA)
|
// {
|
// nTemp |= (0x01 << (7-i));
|
// }
|
// delay_us(3);
|
// IIC_SCL=0;
|
// delay_us(3);
|
// }
|
|
// return nTemp;
|
// }
|
|
|
// /*******************************************
|
// IIC ·¢ËÍÊý×麯Êý
|
// ²ÎÊý 1 num : ·¢ËÍ×Ö½ÚÊý
|
// 2 device_addr : iicÄ¿±êµØÖ·
|
// 3 *data £º·¢ËÍÊý×鵨ַ
|
// return £ºÎÞ·µ»Ø
|
// ********************************************/
|
// void I2C_Write(u8 num, u8 Write_addr,u8 *data)
|
// {
|
// int i = 0;
|
// unsigned char *send_data = data;
|
|
// I2C_START();
|
// I2C_TxByte(DS1339_Write_Add);
|
// I2C_Wait_Ack();
|
// I2C_TxByte(Write_addr);
|
//
|
// for(i = 0;i < num;i++)
|
// {
|
// I2C_Wait_Ack();
|
// I2C_TxByte(send_data[i]);
|
// }
|
// I2C_STOP();
|
// }
|
|
|
// /*******************************************
|
// IIC ¶ÁÈ¡Êý×麯Êý
|
// ²ÎÊý 1 num : ·¢ËÍ×Ö½ÚÊý
|
// 2 device_addr : iicÄ¿±êµØÖ·
|
// 3 *data £º½ÓÊÕÊý×鵨ַ
|
// return £ºÎÞ·µ»Ø
|
// ********************************************/
|
// void I2C_Read(u8 num, u8 Read_addr)
|
// {
|
// u8 i = 0;
|
|
// I2C_START();
|
// I2C_TxByte(DS1339_Write_Add);
|
// I2C_Wait_Ack();
|
// I2C_TxByte(Read_addr);
|
// I2C_Wait_Ack();
|
//
|
// I2C_START();
|
// I2C_TxByte(DS1339_Read_Add);
|
//
|
// for(i = 0; i < num;i++)
|
// {
|
// I2C_Ack();
|
// I2C_RECV_DATA[i] = I2C_RxByte();
|
// }
|
// I2C_NAck();
|
// I2C_STOP();
|
// }
|
|
|
// u8 OSFBIT_Check(void)
|
// {
|
// I2C_Read(1,DS1339_Status_Reg);
|
// if(I2C_RECV_DATA[0]&0x80)
|
// return 1;
|
// else
|
// return 0;
|
// }
|
|
|
// void OSFBIT_SetLow(void)
|
// {
|
// u8 a=0;
|
// I2C_Write(1,DS1339_Status_Reg,&a);
|
// }
|
|
void IIC_Start(void)
|
{
|
SDA_OUT();
|
IIC_SCL=1;
|
IIC_SDA=1;
|
delay_us(10);
|
IIC_SDA=0;
|
delay_us(10);
|
IIC_SCL=0;
|
delay_us(10);
|
|
|
|
}
|
|
void IIC_Stop(void)
|
{
|
u8 i;
|
SDA_OUT();//sda???
|
IIC_SDA=0;
|
delay_us(10);
|
IIC_SCL=1;
|
delay_us(10);
|
IIC_SDA=1;
|
for(i=0;i<5;i++)
|
{
|
delay_us(10);
|
}
|
}
|
|
u8 IIC_Wait_Ack(void)
|
{
|
u8 ucErrTime=0;
|
SDA_IN(); //SDA?????
|
delay_us(10);
|
delay_us(10);
|
while(READ_SDA)
|
{
|
ucErrTime++;
|
if(ucErrTime>250)
|
{
|
IIC_Stop();
|
return 1;
|
}
|
|
}
|
IIC_SCL=0;//????0
|
return 0;
|
}
|
|
void IIC_Ack(void)
|
{
|
|
SDA_OUT();
|
IIC_SDA=0;;
|
delay_us(10);
|
IIC_SCL=1;
|
delay_us(10);
|
IIC_SCL=0;
|
delay_us(10);
|
}
|
|
void IIC_NAck(void)
|
{
|
SDA_OUT();
|
IIC_SDA=1;;
|
delay_us(10);
|
IIC_SCL=1;
|
delay_us(10);
|
IIC_SCL=0;
|
delay_us(10);
|
}
|
|
void IIC_Send_Byte(u8 txd)
|
{
|
u8 i;
|
SDA_OUT();
|
for(i=0;i<8;i++)
|
{
|
if(txd & 0x80) IIC_SDA=1;
|
else IIC_SDA=0;
|
txd <<= 1;
|
delay_us(10);
|
IIC_SCL=1;
|
delay_us(10);
|
IIC_SCL=0;
|
}
|
delay_us(10);
|
IIC_SCL=1;
|
delay_us(10);
|
IIC_SCL=0;
|
}
|
|
u8 IIC_Read_Byte(unsigned char ack)
|
{
|
u8 i,receive=0;
|
SDA_IN();//SDA?????
|
|
for(i=0;i<8;i++)
|
{
|
IIC_SCL=1;
|
delay_us(10);
|
receive <<=1;
|
if(READ_SDA) receive |= 0x01;
|
|
IIC_SCL=0;
|
delay_us(10);
|
}
|
SDA_OUT();
|
return receive;
|
|
}
|
|
|
void R8025AC_Read(u8 sadd, u8 *buf, u8 len)
|
{
|
u8 i;
|
IIC_Start();
|
IIC_Send_Byte(0x64);
|
IIC_Send_Byte(sadd|0x01);
|
IIC_Start();
|
IIC_Send_Byte(0x65);
|
for(i=0;i<len-1;i++)
|
{
|
buf[i] = IIC_Read_Byte(1);
|
IIC_Ack();
|
}
|
buf[i] = IIC_Read_Byte(0);
|
IIC_NAck();
|
IIC_Stop();
|
}
|
|
void R8025AC_Write(u8 sadd,u8 *buf,u8 len)
|
{
|
u8 i;
|
|
IIC_Start();
|
IIC_Send_Byte(0X64);
|
IIC_Send_Byte(sadd);
|
|
for(i=0;i<len;i++)
|
{
|
IIC_Send_Byte(buf[i]);
|
}
|
IIC_Stop();
|
}
|
|
|
|
void set_alarm(void)
|
{
|
|
|
#if 0
|
u8 alarm[5];
|
alarm[0] = 64;
|
alarm[1] = 0x00; // Counter ?0x0500,?1280??,??64Hz???,??20S?????
|
alarm[2] = 0x19; //??Time interrupt,FOUT ?1hz(????????), ??????64Hz?
|
alarm[3] = 0x00;
|
alarm[4] = 0x50; //??????2s(??),??Time interrupt
|
R8025AC_Write(0x0B,alarm,5);
|
#endif
|
|
#if 1
|
u8 alarm[5];
|
alarm[0] = 0; //B //?????? //??????
|
alarm[1] = 0x00; // Counter ?0x0500,?1280??,??64Hz???,??20S????? //
|
alarm[2] = 0x02; //D??Time interrupt,FOUT ?1hz(????????), ??????64Hz? 00011001 19 //00000010 02
|
alarm[3] = 0x00; //E //00000000
|
alarm[4] = 0x60; //F??????2s(??),??Time interrupt 01010000 50 //01100000 60
|
R8025AC_Write(0x0B, alarm, 5);
|
#endif
|
|
}
|
|
|
|
// void set_peroid_alarm()
|
// {
|
// u8 alarm[4];
|
// u8 sec_alarm;
|
// u8 second;
|
// //alarm[0] = 0x00;
|
// Get_Time();
|
// second = calendar.sec;
|
// if(second < 58)
|
// {
|
// second = second + 2;
|
// }else
|
// {
|
// second = second - 58;
|
// }
|
// sec_alarm = (second / 10)*16 + (second % 10);
|
|
// alarm[0] = sec_alarm;
|
// alarm[1] = 0x80;
|
// alarm[2] = 0x80;
|
// alarm[3] = 0x91;
|
// I2C_Write(4,0x07,&alarm[0]);
|
// I2C_Read(4,0x07);
|
//
|
// sec_alarm = 0x00;
|
// I2C_Write(1,0x0f,&sec_alarm);
|
// sec_alarm = 0x05;
|
// I2C_Write(1,0x0e,&sec_alarm);
|
// /* while(1)
|
// {
|
// I2C_Read(1,0x0f);
|
// delay_ms(1);
|
// }*/
|
// }
|
|
|
// void set_peroid_alarm_rst()
|
// {
|
// u8 alarm[4];
|
// u8 sec_alarm;
|
// u8 second;
|
// //alarm[0] = 0x00;
|
// Get_Time();
|
// second = calendar.sec;
|
// if(second < 58)
|
// {
|
// second = second + 2;
|
// }else
|
// {
|
// second = second - 58;
|
// }
|
|
// sec_alarm = (second / 10)*16 + (second % 10);
|
|
// alarm[0] = sec_alarm;
|
// alarm[1] = 0x80;
|
// alarm[2] = 0x80;
|
// alarm[3] = 0x80;
|
// I2C_Write(4,0x07,&alarm[0]);
|
// sec_alarm = 0x00;
|
// I2C_Write(1,0x0f,&sec_alarm);
|
|
// }
|
|
|
|
|
|
|
void Time_Set(u16 year,u8 month,u8 date,u8 week,u8 hour,u8 min,u8 sec)
|
{
|
u8 time[7];
|
year%=100;
|
time[0]=((sec/10)<<4)|(sec%10);
|
time[1]=((min/10)<<4)|(min%10);
|
time[2]=((hour/10)<<4)|(hour%10);
|
time[3]=week;
|
time[4]=((date/10)<<4)|(date%10);
|
time[5]=((month/10)<<4)|(month%10);
|
time[6]=((year/10)<<4)|(year%10);
|
R8025AC_Write(0x00,time,7);
|
}
|
|
|
|
void Get_Time(void)
|
{
|
|
R8025AC_Read(0x00,I2C_RECV_DATA,7);
|
|
calendar.sec=((I2C_RECV_DATA[0]&0xf0)>>4)*10+(I2C_RECV_DATA[0]&0x0f);
|
calendar.min=((I2C_RECV_DATA[1]&0xf0)>>4)*10+(I2C_RECV_DATA[1]&0x0f);
|
calendar.hour=((I2C_RECV_DATA[2]&0xf0)>>4)*10+(I2C_RECV_DATA[2]&0x0f);
|
calendar.week=I2C_RECV_DATA[3];
|
calendar.date=((I2C_RECV_DATA[4]&0xf0)>>4)*10+(I2C_RECV_DATA[4]&0x0f);
|
calendar.month=((I2C_RECV_DATA[5]&0xf0)>>4)*10+(I2C_RECV_DATA[5]&0x0f);
|
calendar.year=2000+((I2C_RECV_DATA[6]&0xf0)>>4)*10+(I2C_RECV_DATA[6]&0x0f);
|
|
}
|
|
|
|
|
|
void test_rtc(void)
|
{
|
u8 time_read[7];
|
|
//ÉèÖÃʱ¼ä
|
// Time_Set(2019,11,11,1,12,12,12);
|
while(1)
|
{
|
//Time_Set(2019,11,11,1,12,12,12);
|
delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
// delay_ms(888);
|
Get_Time();
|
}
|
|
}
|