#include "ds1339.h"
uint8_t ConvertDataToSet(const T_DS1339TIME *time, uint8_t regType);
void ConvertDataToGet(uint8_t rData, T_DS1339TIME *time, uint8_t regType);
void DS1339Init(const IIC_PIN *PIN)
{
IIC_Init(PIN);
}
IIC_STATUS DS1339SetTime(const IIC_PIN *PIN, const T_DS1339TIME *time)
{
IIC_STATUS status;
uint8_t i, sendData;
osDelay(100);
IIC_Start(PIN);
IIC_WriteByte(PIN, PIN->ADDR);
status = IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, REGADDR_SECONDS);
status |= IIC_Wait_ACK(PIN);
for(i = 0; i < 7; i++)
{
sendData = ConvertDataToSet(time, REGADDR_SECONDS + i);
IIC_WriteByte(PIN, sendData);
status |= IIC_Wait_ACK(PIN);
}
IIC_Stop(PIN);
if(status)
return(IIC_WRITE_ERR);
else
return(IIC_OK);
}
IIC_STATUS DS1339GetTime(const IIC_PIN *PIN, T_DS1339TIME *time)
{
T_DS1339TIME rTime;
uint8_t i, rData[7];
IIC_STATUS status;
IIC_Start(PIN);
IIC_WriteByte(PIN, PIN->ADDR);
status = IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, REGADDR_SECONDS);
status |= IIC_Wait_ACK(PIN);
IIC_Start(PIN);
IIC_WriteByte(PIN, PIN->ADDR | 0x01);
status |= IIC_Wait_ACK(PIN);
for(i = 0; i < 7; i++)
{
if(i != 0 )
IIC_ACK(PIN);
IIC_ReadByte(PIN, &rData[i]);
}
IIC_NACK(PIN);
IIC_Stop(PIN);
for(i = 0; i < 7; i++)
{
ConvertDataToGet(rData[i], &rTime, REGADDR_SECONDS + i);
}
if(status)
{
return (IIC_READ_ERR);
}
else
{
*time = rTime;
return (IIC_OK);
}
}
uint8_t ConvertDataToSet(const T_DS1339TIME *time, uint8_t regType)
{
uint8_t sendData = 0;
switch(regType)
{
case REGADDR_SECONDS:
if(time->second > 10)
{
sendData = ((time->second / 10) << 4) & 0x7F;
sendData |= time->second % 10;
}
else
{
sendData = time->second;
}
break;
case REGADDR_MINUTES:
if(time->minute > 10)
{
sendData = ((time->minute / 10) << 4) & 0x7F;
sendData |= time->minute % 10;
}
else
{
sendData = time->minute;
}
break;
case REGADDR_HOURS:
if(time->hour > 10)
{
sendData = ((time->hour / 10) << 4) & 0x1F;
sendData |= time->hour % 10;
}
else
{
sendData = time->hour;
}
break;
case REGADDR_DAY:
sendData = time->weekday & 0x0E;
break;
case REGADDR_DATA:
if(time->day > 10)
{
sendData = ((time->day / 10) << 4) & 0x3F;
sendData |= time->day % 10;
}
else
{
sendData = time->day;
}
break;
case REGADDR_MONTH_CENTURY:
if(time->month > 10)
{
sendData = ((time->month / 10) << 4) & 0x1F;
sendData |= time->month % 10;
}
else
{
sendData = time->month;
}
break;
case REGADDR_YEAR:
if(time->year > 10)
{
sendData = ((time->year / 10) << 4) & 0xF0;
sendData |= time->year % 10;
}
else
{
sendData = time->year;
}
break;
default:
;
}
return sendData;
}
void ConvertDataToGet(uint8_t rData, T_DS1339TIME *time, uint8_t regType)
{
switch(regType)
{
case REGADDR_SECONDS:
time->second = (rData >> 4 & 0x07) * 10 + (rData & 0x0F);
break;
case REGADDR_MINUTES:
time->minute = (rData >> 4 & 0x07) * 10 + (rData & 0x0F);
break;
case REGADDR_HOURS:
time->hour = (rData >> 4 & 0x01) * 10 + (rData & 0x0F);
break;
case REGADDR_DAY:
time->weekday = rData & 0x07;
break;
case REGADDR_DATA:
time->day = (rData >> 4 & 0x03) * 10 + (rData & 0x0F);
break;
case REGADDR_MONTH_CENTURY:
time->month = (rData >> 4 & 0x01) * 10 + (rData & 0x0F);
break;
case REGADDR_YEAR:
time->year = (rData >> 4 & 0x0F) * 10 + (rData & 0x0F);
break;
default:
;
}
}
#ifndef _DS1339_HEAD_
#define _DS1339_HEAD_
#include "stdio.h"
#include "stdint.h"
#include "stdlib.h"
#include "cmsis_os.h"
#include "hal_iic.h"
#define REGADDR_SECONDS 0x00
#define REGADDR_MINUTES 0x01
#define REGADDR_HOURS 0x02
#define REGADDR_DAY 0x03
#define REGADDR_DATA 0x04
#define REGADDR_MONTH_CENTURY 0x05
#define REGADDR_YEAR 0x06
#define REGADDR_ALARM1SECONDS 0x07
#define REGADDR_ALARM1MINUTES 0x08
#define REGADDR_ALARM1HOURS 0x09
#define REGADDR_ALARM1DAY_ALARM1DATE 0x0A
#define REGADDR_ALARM2MINUTES 0x0B
#define REGADDR_ALARM2HOURS 0x0C
#define REGADDR_ALARM2DAY_ALARM2DATE 0x0D
#define REGADDR_CONTROL 0x0E
#define REGADDR_STATUS 0x0F
#define REGADDR_TRICKLECHARGER 0x10
typedef struct
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t weekday;
uint8_t day;
uint8_t month;
uint8_t year;
} T_DS1339TIME;
void DS1339Init(const IIC_PIN *PIN);
IIC_STATUS DS1339SetTime(const IIC_PIN *PIN, const T_DS1339TIME *time);
IIC_STATUS DS1339GetTime(const IIC_PIN *PIN, T_DS1339TIME *time);
#endif