|
发表于 2021-9-25 00:04:50
|
显示全部楼层
/**************************************************************************
* 函数名: void I2C_delay(void)
* 描述 : 短暂延时
* 输入 : 无
* 输出 : 无
* 说明 : 内部定义的i可以优化速度,经测试最低到5还能写入
*****************************************unsigned char********************************/
static void I2C_delay(void)
{
unsigned char i = 5;
while(i)
{
i--;
}
}
/**************************************************************************
* 函数名: void I2C_Start(void)
* 描述 : 起始信号
* 输入 : 无
* 输出 : 无
* 说明 :
***************************************************************************/
void I2C_Start(void)
{
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
SDA_L;
I2C_delay();
SCL_L;
I2C_delay();
}
/**************************************************************************
* 函数名: I2C_Stop(void)
* 描述 : 终止信号
* 输入 : 无
* 输出 : 无
* 说明 :
***************************************************************************/
void I2C_Stop(void)
{
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
/**************************************************************************
* 函数名: void I2C_Ack(void)
* 描述 : 应答信号
* 输入 : 无
* 输出 : 无
* 说明 :
***************************************************************************/
/*
void I2C_Ack(void)
{
SCL_L; I2C_delay();
SDA_L; I2C_delay();
SCL_H; I2C_delay();
SCL_L; I2C_delay();
}
*/
/**************************************************************************
* 函数名: void I2C_NoAck(void)
* 描述 : 无应答信号
* 输入 : 无
* 输出 : 无
* 说明 :
***************************************************************************/
/*
void I2C_NoAck(void)
{
SCL_L; I2C_delay();
SDA_H; I2C_delay();
SCL_H; I2C_delay();
SCL_L; I2C_delay();
}
*/
/***************unsigned char*********************************************************
* 函数胾nsigned char unsigned char I2C_WaitAck(void)
* 描述 : 等待应答信号
* 输入 : 无
* 输出 : TRUE : 有应答
FALSE : 无应答
* 说明 :
*********************************************************unsigned char****************/
unsigned char I2C_WaitAck(void)
{
unsigned char ucErrTime = 0;
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
while(SDA_RX8025T == 1)
{
ucErrTime++;
if(ucErrTime > 250)
{
I2C_Stop();
return 0;
}
}
SCL_L;
return 1;
}
/**************************************************************************
* 函数名: void I2C_SendByunsigned char(unsigned char SendByte)
* 描述 : 发送一个字节
* 输入 : SendByte : 字节数据
* 输出 : 无
* 说明 : 数据从高位到低位
*********************************************************************unsigned char****/
void I2C_SendByte(unsigned char SendByte)
{
unsigned char i = 8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte & 0x80)
SDA_RX8025T = 1;
else
SDA_RX8025T = 0 ;
SendByte <<= 1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
/**************************************************************************
* 函数胾nsigned char unsigned char I2C_ReceiveByte(void)
* 描述 : 读取一个字节
* 输入 : 无
* 输出 : 字节数据
* 说明 : ReceiveByte : 数据从高位到低位
****************************************************unsigned char*********************/
unsigned char I2C_ReceiveByte(void)
{
unsigned char i = 8;
unsigned char ReceiveByte = 0;
SDA_H;
while(i--)
{
ReceiveByte <<= 1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_RX8025T == 1)
{
ReceiveByte |= 0x01;
}
}
SCL_L;
return ReceiveByte;
}
#include "RX8025T.h"
#include "i2c_soft.h"
//#include "delay.h"
Calendar_OBJ calendar;
#define RX8025T_WriteAddress 0x64
#define RX8025T_ReadAddress 0x65
unsigned char BCD2HEX(unsigned char val)
{
unsigned char i;
i = val & 0x0f;
val >>= 4;
val &= 0x0f;
val *= 10;
i += val;
return i;
}
unsigned int B_BCD(unsigned char val)
{
unsigned char i,j,k;
i=val/10;
j=val%10;
k=j+(i<<4);
return k;
}
void RX8025T_WR_Byte(unsigned char addr, unsigned char bytedata)
{
I2C_Start();
I2C_SendByte(RX8025T_WriteAddress);
I2C_WaitAck();
I2C_SendByte(addr);
I2C_WaitAck();
I2C_SendByte(bytedata);
I2C_WaitAck();
I2C_Stop();
}
unsigned char RX8025T_RD_Byte(unsigned char addr)
{
unsigned char Dat = 0;
I2C_Start();
I2C_SendByte(RX8025T_WriteAddress);
I2C_WaitAck();
I2C_SendByte(addr);
I2C_WaitAck();
I2C_Start();
I2C_SendByte(RX8025T_ReadAddress);
I2C_WaitAck();
Dat = I2C_ReceiveByte();
I2C_Stop();
return Dat;
}
void RX8025T_Init(void)
{
// I2C_GPIO_Config();
RX8025T_WR_Byte(0x0e, 0);
// delay_ms(2);
RX8025T_WR_Byte(0x0f, 0x0);
// delay_ms(2);
// Set_RX8025T_Time(21,4,25,18,9,00,7);
}
/*
void Set_RX8025T_Time(unsigned char yea,unsigned char mon,unsigned char da,unsigned char hou,unsigned char min,unsigned char sec,unsigned char week)
{
unsigned char temp=0;
temp=B_BCD(yea);
RX8025T_WR_Byte(0x06,temp);
temp=B_BCD(mon);
RX8025T_WR_Byte(0x05,temp);
temp=B_BCD(da);
RX8025T_WR_Byte(0x04,temp);
temp=B_BCD(hou);
RX8025T_WR_Byte(0x02,temp);
temp=B_BCD(min);
RX8025T_WR_Byte(0x01,temp);
temp=B_BCD(sec);
RX8025T_WR_Byte(0x00,temp);
temp=B_BCD(week);
RX8025T_WR_Byte(0x03,temp);
}
*/
void Get_RX8025T_Time(void)
{
calendar.w_year = RX8025T_RD_Byte(0x06);
calendar.w_year = BCD2HEX(calendar.w_year);
calendar.w_month = RX8025T_RD_Byte(0x05);
calendar.w_month = BCD2HEX(calendar.w_month);
calendar.w_date = RX8025T_RD_Byte(0x04);
calendar.w_date = BCD2HEX(calendar.w_date);
calendar.hour = RX8025T_RD_Byte(0x02);
calendar.hour &= 0x3f;
calendar.hour = BCD2HEX(calendar.hour);
calendar.min = RX8025T_RD_Byte(0x01);
calendar.min = BCD2HEX(calendar.min);
calendar.sec = RX8025T_RD_Byte(0x00);
calendar.sec = BCD2HEX(calendar.sec);
calendar.week = RX8025T_RD_Byte(0x03);
calendar.week = BCD2HEX(calendar.week);
RX8025T_WR_Byte(0x0e, 0x20);
calendar.temper_H = RX8025T_RD_Byte(0x11);
calendar.temper_L = (RX8025T_RD_Byte(0x12) >> 6) * 25;
}
|
|