参考了网上的大牛的代码,是寄存器地址错了吗
[mw_shl_code=c,true]
//rx8025.h
#include "sys.h"
// 设备读写地址
#define RX8025_ADDR_READ 0x65
#define RX8025_ADDR_WRITE 0x64
// 设备寄存器地址
#define RX8025_ADDR_SECONDS 0x00
#define RX8025_ADDR_WEEK 0x30
#define RX8025_ADDR_DATES 0x40
#define RX8025_ADDR_MONTH 0x50
#define RX8025_ADDR_MINUTES 0x80
#define RX8025_ADDR_CONTROL1 0xE0
#define RX8025_ADDR_CONTROL2 0xF0
// 设备操作模式
#define RX8025_WRITE_MODE 0xF0
#define RX8025_READ_MODE 0xF0
#define RX8025_SIMP_READ_MODE 0x04
#define u8BAND(addr, u8num) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(u8num<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define u8_ADDR(addr, u8num) MEM_ADDR(u8BAND(addr, u8num))
#define R8025_I2C_SCL GPIO_Pin_15
#define R8025_I2C_SDA GPIO_Pin_14
#define R8025_GPIO_I2C GPIOB
#define R8025_AHB RCC_AHB1Periph_GPIOB
#define SCL_H GPIO_SetBits(R8025_GPIO_I2C,R8025_I2C_SCL)
#define SCL_L GPIO_ResetBits(R8025_GPIO_I2C,R8025_I2C_SCL)
#define SDA_H GPIO_SetBits(R8025_GPIO_I2C,R8025_I2C_SDA)
#define SDA_L GPIO_ResetBits(R8025_GPIO_I2C,R8025_I2C_SDA)
void R8025_I2C_Init(void);
void R8025_I2C_SDA_OUT(void);
void R8025_I2C_SDA_IN(void);
void R8025_I2C_Start(void);
void R8025_I2C_Stop(void);
void R8025_I2C_Ack(void);
void R8025_I2C_NAck(void);
u8 R8025_I2C_Wait_Ack(void);
void R8025_I2C_Send_Byte(u8 txd);
u8 R8025_I2C_Read_Byte(u8 ack);
void RX8025_Init(void);
u8 rx8025_WriteRTC(u8 buf0,u8 buf1,u8 buf2,u8 buf3,u8 buf4,u8 buf5,u8 buf6);
void rx8025_ReadRTC(void);[/mw_shl_code]
[mw_shl_code=c,true]void R8025_I2C_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(R8025_AHB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//RCC_APB2Periph_AFIO
GPIO_InitStructure.GPIO_Pin=R8025_I2C_SDA;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(R8025_GPIO_I2C,&GPIO_InitStructure);
}
void R8025_I2C_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(R8025_AHB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//RCC_APB2Periph_AFIO
GPIO_InitStructure.GPIO_Pin=R8025_I2C_SDA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_Init(R8025_GPIO_I2C,&GPIO_InitStructure);
}
//函数名;I2C_inti
//输入:无
//输出:无
//描述:初始化SDA和SCL
void R8025_I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(R8025_AHB ,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//RCC_APB2Periph_AFIO
GPIO_InitStructure.GPIO_Pin=R8025_I2C_SCL|R8025_I2C_SDA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_Init(R8025_GPIO_I2C,&GPIO_InitStructure);
SCL_H;
SDA_H;
}
/*******************************************************************************
函数名:StartI2c
功能: 产生I2C开始信号(SDA在SCL高电平时产生一个下降沿信号)
参数: 无
返回值:无
*******************************************************************************/
void R8025_I2C_Start(void) //产生起始信号
{
R8025_I2C_SDA_OUT();
SDA_H;
SCL_H;
delay_us(5);
SDA_L;
delay_us(5);
SCL_L;
}
/*******************************************************************************
函数名:StopI2c
功能: 产生I2C停止信号(SDA在SCL高电平时产生一个上升沿信号)
参数: 无
返回值:无
*******************************************************************************/
void R8025_I2C_Stop(void)//产生停止信号
{
R8025_I2C_SDA_OUT();
SCL_L;
SDA_L;
SCL_H;
delay_us(5);
SDA_H;
delay_us(5);
}
//主机产生应答信号ACK
void R8025_I2C_Ack(void)
{
SCL_L;
R8025_I2C_SDA_OUT();
SDA_L;
delay_us(2);
SCL_H;
delay_us(4);
SCL_L;
}
//主机不产生应答信号NACK
void R8025_I2C_NAck(void)
{
SCL_L;;
R8025_I2C_SDA_OUT();
SDA_H;
delay_us(2);
SCL_H;
delay_us(2);// delay_us(4);
SCL_L;;
}
/*******************************************************************************
函数名:R8025_I2C_Wait_Ack
功能: 等待从机应答信号,并检查应答位是否正确
参数:
返回值:1 无应答 0接收应答成功
*******************************************************************************/
u8 R8025_I2C_Wait_Ack(void)
{
u8 tempTime=0;
R8025_I2C_SDA_IN();
SDA_H;
delay_us(1);
SCL_H;
delay_us(1);
while(GPIO_ReadInputDataBit(R8025_GPIO_I2C,R8025_I2C_SDA))
{
tempTime++;
if(tempTime>250)
{
R8025_I2C_Stop();
return 1;
}
}
SCL_L;
return 0;
}
/*******************************************************************************
函数名:R8025_I2C_Send_Byte
功能: 向I2C总线写入数据,并检查应答位是否正确
参数: Data 发送的字节
返回值:
*******************************************************************************/
void R8025_I2C_Send_Byte(u8 Data)//I2C 发送一个字节
{
u8 i=0;
R8025_I2C_SDA_OUT();
SCL_L;;//拉低时钟开始数据传输
for(i=0;i<8;i++)
{
if((Data&0x80)>0) //0x80 1000 0000
SDA_H;
else
SDA_L;
Data<<=1;
SCL_H;
delay_us(2); //发送数据
SCL_L;;
delay_us(2);
}
}
/*******************************************************************************
函数名:R8025_I2C_Read_Byte
功能: 从I2C总线读一个字节的数据
参数: receive 要读出的数据存放的地址
返回值:1成功 0失败
*******************************************************************************/
u8 R8025_I2C_Read_Byte(u8 ack)//I2C 读取一个字节
{
u8 i=0,receive=0;
R8025_I2C_SDA_IN();
for(i=0;i<8;i++)
{
SCL_L;
delay_us(2);
SCL_H;
receive<<=1;
if(GPIO_ReadInputDataBit(R8025_GPIO_I2C,R8025_I2C_SDA))
receive++;
delay_us(1);
}
if(ack==0)
R8025_I2C_NAck();
else
R8025_I2C_Ack();
return receive;
}
/*******************************************************************************
函数名:RX8025_Writedata
功能: 向I2C总线写一个或多个字节的数据
参数: Addr写入的起始地址,*buf 要写入的数据存放的地址,len要写入的数据长度
返回值:1失败 0成功
*******************************************************************************/
u8 RX8025_Writedata(u8 Addr,u8 *buf,u8 len) //写数据
{
u8 i;
R8025_I2C_Start();
R8025_I2C_Send_Byte(0x64); //写器件地址
R8025_Ack_temp=R8025_I2C_Wait_Ack();//等待应答信号
if (!R8025_Ack_temp)
{
R8025_I2C_Send_Byte(Addr<<4); //写寄存器地址
R8025_Ack_temp=R8025_I2C_Wait_Ack(); //等待应答信号
if (!R8025_Ack_temp)
{
for(i=0;i<len;i++)
{
R8025_I2C_Send_Byte(buf);
R8025_I2C_Ack();
}
}
}
//R8025_I2C_Ack();
R8025_I2C_Stop();
return R8025_Ack_temp;
}
/*******************************************************************************
函数名:RX8025_Readdata
功能: 向I2C总线读一个或多个字节的数据
参数: sadd 读数据的起始地址,*buf 要读出的数据存放的地址,len要读出数据的长度
返回值:1失败 0成功
*******************************************************************************/
u8 RX8025_Readdata(u8 sadd, u8 *buf, u8 len) //读取数据
{
u8 i;
R8025_I2C_Start();
R8025_I2C_Send_Byte(RX8025_ADDR_WRITE); //写器件地址
R8025_Ack_temp=R8025_I2C_Wait_Ack();//等待应答信号
if (!R8025_Ack_temp)
{
R8025_I2C_Send_Byte(sadd<<4|0x01);//读信号
R8025_Ack_temp=R8025_I2C_Wait_Ack();//等待应答信号
if (!R8025_Ack_temp)
{
R8025_I2C_Start();
R8025_I2C_Send_Byte(RX8025_ADDR_READ);//写地址
R8025_Ack_temp=R8025_I2C_Wait_Ack();//等待应答信号
if (!R8025_Ack_temp)
{
for(i=0;i<len;i++)
{
buf = R8025_I2C_Read_Byte(1);
}
}
}
}
R8025_I2C_Stop();
return R8025_Ack_temp;
}
/*******************************************************************************
函数名:rx8025_WriteRTC
功能: 向8025器件写日期时间数据
参数: buf0秒 buf1分 buf时 buf3周 buf4日 buf5月 buf6年
返回值:1失败 0成功
*******************************************************************************/
u8 rx8025_WriteRTC(u8 buf0,u8 buf1,u8 buf2,u8 buf3,u8 buf4,u8 buf5,u8 buf6)
{
u8 REC[7];
u8 ret;
REC[0]=Dec_BCD(buf0);
REC[1]=Dec_BCD(buf1);
REC[2]=Dec_BCD(buf2);
REC[3]=Dec_BCD(buf3);
REC[4]=Dec_BCD(buf4);
REC[5]=Dec_BCD(buf5);
REC[6]=Dec_BCD(buf6);
if(RX8025_Writedata(0,REC,7))ret=1; else ret=0;
return ret;
}
/*******************************************************************************
函数名:rx8025_ReadRTC
功能: 从8025器件中读日期时间数据并同时存到全局变量:SS,MM,HH,WW,DD,MO,YY中去
参数:
返回值:
*******************************************************************************/
void rx8025_ReadRTC(void)
{
u8 ret;
u8 buf[7];
RX8025_Readdata(0,buf,7);
ss = buf[0]; //写入全局变量,秒
mm = buf[1]; //写入全局变量,分
hh = buf[2]; //写入全局变量,时
ddd = buf[3]; //写入全局变量,周
DD = buf[4]; //写入全局变量,日
MM = buf[5]; //写入全局变量,月
YY = buf[6]; //写入全局变量,年
}
/*******************************************************************************
函数名:rx8025_SetReg
功能: 设置8025寄存器值
参数: 需要设值的寄存器地址
返回值:
*******************************************************************************/
void rx8025_SetReg(u8 sadd, u8 buf)//设置寄存器
{
u8 REC[1];
//REC[0]=Dec_BCD(buf);
REC[0]=buf;
RX8025_Writedata(sadd,REC,1);
}
/*******************************************************************************
函数名:rx8025_GetReg
功能: 从8025器件中读寄存器间数据
参数: 需要读的寄存器地址
返回值:寄存器值
*******************************************************************************/
u8 rx8025_GetReg(u8 sadd)
{
u8 BUF[1];
u8 buf;
RX8025_Readdata(sadd,BUF,1);
buf=BUF[0];
return buf;
}
/*******************************************************************************
函数名:RX8025_Init
*******************************************************************************/
void RX8025_Init(void)
{
rx8025_SetReg(0x0e,0x20);//24小时制
}
[/mw_shl_code]
初始化后调用rx8025_ReadRTC,数据没变化
一周热门 更多>