时钟芯片RX8025T STM32 Hal库驱动封装代码
#ifndef _RX8025T_H
#define _RX8025T_H
#include "sys.h"
#include "main.h"
extern u8 RX8025T_err;
struct RX8025T_data
{
u8 years;
u8 months;
u8 days;
u8 hours;
u8 minutes;
u8 seconds;
};
extern struct RX8025T_data rx8025t_time;
#define rx8025_sda_1 HAL_GPIO_WritePin(AT_SDA_GPIO_Port,AT_SDA_Pin,GPIO_PIN_SET)
#define rx8025_sda_0 HAL_GPIO_WritePin(AT_SDA_GPIO_Port,AT_SDA_Pin,GPIO_PIN_RESET)
#define rx8025_scl_1 HAL_GPIO_WritePin(AT_SCL_GPIO_Port,AT_SCL_Pin,GPIO_PIN_SET)
#define rx8025_scl_0 HAL_GPIO_WritePin(AT_SCL_GPIO_Port,AT_SCL_Pin,GPIO_PIN_RESET)
#define rx8025_sda_in GPIO_SetPinMode(AT_SDA_GPIO_Port,AT_SDA_Pin,GPIO_MODE_INPUT)
#define rx8025_sda_out GPIO_SetPinMode(AT_SDA_GPIO_Port,AT_SDA_Pin,GPIO_MODE_OUTPUT_PP)
#define rx8025_sda_read HAL_GPIO_ReadPin (AT_SDA_GPIO_Port,AT_SDA_Pin)
void RX8025T_init(void);
void RX8025T_read_time(void);
void RX8025T_time_set(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 sec);
#endif
#include "rx8025t.h"
u8 RX8025T_err=0;
struct RX8025T_data rx8025t_time;
static void RX8025T_delay(u16 D)
{
u8 E;
for(; D > 0; D--)
{
for(E = 5; E > 0; E--)
{
;
}
}
}
static u8 member_RX8025T(u16 M)
{
u8 member_data_8025[4];
member_data_8025[0]=(u8)(M/1000%10);
member_data_8025[1]=(u8)(M/100%10);
member_data_8025[2]=(u8)(M/10%10);
member_data_8025[3]=(u8)(M%10);
member_data_8025[2]<<=4;
member_data_8025[2]|=member_data_8025[3];
return member_data_8025[2];
}
static void RX8025T_start(void)
{
rx8025_sda_1;
rx8025_scl_1;
RX8025T_delay(20);
rx8025_sda_0;
rx8025_scl_0;
}
static void RX8025T_stop(void)
{
rx8025_sda_0;
rx8025_scl_1;
rx8025_sda_1;
}
static void RX8025T_write_ack(u8 ack)
{
if(ack) rx8025_sda_1;
else rx8025_sda_0;
RX8025T_delay(20);
rx8025_scl_1;
RX8025T_delay(20);
rx8025_scl_0;
}
static void RX8025T_wait_ack(void)
{
u8 k = 200;
rx8025_sda_1;
RX8025T_delay(20);
rx8025_sda_in;
RX8025T_delay(20);
rx8025_scl_1;
RX8025T_delay(20);
RX8025T_err = 0;
while(rx8025_sda_read)
{
rx8025_sda_out;
RX8025T_delay(20);
k--;
if(k==0)
{
RX8025T_stop();
RX8025T_err = 1;
break;
}
rx8025_sda_in;
RX8025T_delay(20);
}
rx8025_sda_out;
rx8025_scl_0;
RX8025T_delay(20);
}
static void RX8025T_write_byte(u8 wdata)
{
for(u8 i = 0; i < 8; i++)
{
if(wdata&0x80) rx8025_sda_1;
else rx8025_sda_0;
wdata <<= 1;
rx8025_scl_1;
RX8025T_delay(20);
rx8025_scl_0;
}
RX8025T_wait_ack();
}
static u8 RX8025T_read_byte(void)
{
u8 bytedata;
rx8025_sda_1;
rx8025_sda_in;
RX8025T_delay(20);
for(u8 i=0;i<8;i++)
{
rx8025_scl_1;
bytedata <<= 1;
bytedata |= rx8025_sda_read;
rx8025_scl_0;
RX8025T_delay(20);
}
rx8025_sda_out;
return bytedata;
}
static void RX8025T_write_data(u8 address, u8 mdata)
{
RX8025T_start();
RX8025T_write_byte(0x64);
RX8025T_write_byte(address);
RX8025T_write_byte(mdata);
RX8025T_stop();
}
static void RX8025T_read_data(u8 address, u8 count, u8 *buff)
{
RX8025T_start();
RX8025T_write_byte(0x64);
RX8025T_write_byte(address);
RX8025T_start();
RX8025T_write_byte(0x65);
for(u8 i=0;i<count;i++)
{
buff[i] = RX8025T_read_byte();
if(i<count-1) RX8025T_write_ack(0);
}
RX8025T_write_ack(1);
RX8025T_stop();
}
static u8 RX8025T_trans_data(u8 data)
{
u8 dd = 0;
if(data&0X40) dd+=40;
if(data&0X20) dd+=20;
if(data&0X10) dd+=10;
if(data&0X08) dd+=8;
if(data&0X04) dd+=4;
if(data&0X02) dd+=2;
if(data&0X01) dd+=1;
return(dd);
}
void RX8025T_read_time(void)
{
u8 time[7],data;
RX8025T_read_data(0x00, 7, time);
if(RX8025T_err) return;
data = time[0] & 0x7f;
rx8025t_time.seconds = RX8025T_trans_data(data);
data = time[1] & 0x7f;
rx8025t_time.minutes = RX8025T_trans_data(data);
data = time[2] & 0x3f;
rx8025t_time.hours = RX8025T_trans_data(data);
data = time[4] & 0x3f;
rx8025t_time.days = RX8025T_trans_data(data);
data = time[5] & 0x1f;
rx8025t_time.months = RX8025T_trans_data(data);
data = time[6];
rx8025t_time.years = RX8025T_trans_data(data);
}
static void time_set(u8 hour,u8 min,u8 sec)
{
RX8025T_write_data(0x00,member_RX8025T((u16)sec));
RX8025T_write_data(0x01,member_RX8025T((u16)min));
RX8025T_write_data(0x02,member_RX8025T((u16)hour));
}
static void date_set(u8 year,u8 month,u8 day)
{
RX8025T_write_data(0x04,member_RX8025T((u16)day));
RX8025T_write_data(0x05,member_RX8025T((u16)month));
RX8025T_write_data(0x06,member_RX8025T((u16)year));
}
void RX8025T_time_set(u8 year,u8 month,u8 day,u8 hour,u8 min,u8 sec)
{
date_set(year,month,day);
time_set(hour,min,sec);
}
void RX8025T_init(void)
{
RX8025T_write_data(0x00,0);
RX8025T_write_data(0x01,0);
RX8025T_write_data(0x02,0);
RX8025T_write_data(0x04,10);
RX8025T_write_data(0x05,10);
RX8025T_write_data(0x06,12);
}