RX8025T值不变

2019-07-20 08:33发布

参考了网上的大牛的代码,是寄存器地址错了吗
[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,数据没变化
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。