时钟芯片RX8025T STM32 Hal库驱动封装代码

时钟芯片RX8025T STM32 Hal库驱动封装代码

#ifndef _RX8025T_H
#define _RX8025T_H
#include "sys.h"
#include "main.h"


//寄存器版本(仅供参考)
//typedef union
//{
//  u8  Byte;
//  struct
//  {
//    u8  F0        : 1;
//    u8  F1        : 1;
//    u8  F2        : 1;
//    u8  F3        : 1;
//    u8  F4        : 1;
//    u8  F5        : 1;
//    u8  F6        : 1;
//    u8  F7        : 1;
//  } Bits;
//} RX8025T_Mark;

//extern    RX8025T_Mark			_RX8025_Mark;

//#define   RX8025_Mark				_RX8025_Mark.Byte;
//#define   bRX8025_err				_RX8025_Mark.Bits.F0
//#define   bRX8025_Reset			_RX8025_Mark.Bits.F1
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"

//RX8025T_Mark  _RX8025_Mark;
u8	RX8025T_err=0;//member_data_8025[4];
struct RX8025T_data rx8025t_time;

static void  RX8025T_delay(u16 D)  //delay(word D) //延时__near
{
	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_delay(20);
	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;                                /*seconds*/
	rx8025t_time.seconds = RX8025T_trans_data(data);

	data = time[1] & 0x7f;                                /*minutes*/
	rx8025t_time.minutes = RX8025T_trans_data(data);

	data = time[2] & 0x3f;                                /*hours*/
	rx8025t_time.hours = RX8025T_trans_data(data);

	data = time[4] & 0x3f;                                /*days*/
	rx8025t_time.days = RX8025T_trans_data(data);

	data = time[5] & 0x1f;                                /*months*/
	rx8025t_time.months = RX8025T_trans_data(data);

	data = time[6];                                       /*years*/
	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);
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值