watercici 发表于 2018-3-27 14:36:00

PCF8563中的定时器

PCF8563中的定时器其定时功能一般用来干什么,是只要用PCF8563实时时钟芯片,就必须打开定时器的吗?只有定时功能开始,芯片才可以计时吗

Angel_YY 发表于 2018-3-27 15:56:22

PCF8563中的定时器一般用来定时报警,比如定时在每天早上6点的闹钟,就可以通过定时器来设置,这个定时器不是必须要打开的,用到定时报警功能时才会用到这个定时器,RTC计时是否开始与这个定时器没有直接关系。

watercici 发表于 2018-3-27 16:15:11

Angel_YY 发表于 2018-3-27 15:56
PCF8563中的定时器一般用来定时报警,比如定时在每天早上6点的闹钟,就可以通过定时器来设置,这个定时器不 ...

明白,谢谢您的解答

watercici 发表于 2018-3-27 16:17:55

Angel_YY 发表于 2018-3-27 15:56
PCF8563中的定时器一般用来定时报警,比如定时在每天早上6点的闹钟,就可以通过定时器来设置,这个定时器不 ...

您好,我还想问一个问题,我现在的I2C时序是,对PCF8563的某些寄存器设置能够得到ACK应答,但也有对一些寄存器的设置等到的是NACK,这是为什么呢?

Angel_YY 发表于 2018-3-27 16:33:20

寄存器都有ACK啊。
我的代码如下,可以参考
/*
* MyPCF85x63.h
*
*Created on: 2017年10月18日
*      Author: Angel_YY
*/

#ifndef SOURCES_MYFILE_MYPCF85X63_H_
#define SOURCES_MYFILE_MYPCF85X63_H_
typedef unsigned char u8;
void I2CInit(void);
void GetPCF8563(unsigned char firsttype,unsigned char count,unsigned char *buff);
void FixTime(unsigned char * data);
void SetPCF8563(unsigned char timetype,unsigned char value);
#endif /* SOURCES_MYFILE_MYPCF85X63_H_ */


/*
* MyPCF85x63.c
*
*Created on: 2017年10月18日
*      Author: Angel_YY
*/
#include "MyPCF85x63.h"
#include "RTC_SCL.h"
#include "RTC_SDA.h"

#define RTC_SDAOUT                RTC_SDA_SetOutput()
#define RTC_SDAIN                        RTC_SDA_SetInput()
#define RTC_SDA_ON                RTC_SDA_SetOutput();RTC_SDA_SetVal()
#define RTC_SDA_OFF                RTC_SDA_SetOutput();RTC_SDA_ClrVal()
#define RTC_GETSDA()                RTC_SDA_GetVal()

#define RTC_SCL_ON                RTC_SCL_SetVal()
#define RTC_SCL_OFF                RTC_SCL_ClrVal()

#define RTC_DEVICE_ADDR 0xA2

unsigned charSystemError;

void SomeNOP(void){
unsigned short i=0x10;
while(i--);
}
//在总线不忙时,数据和时钟线时钟保持高电平。
void I2CInit(void){
        RTC_SDAOUT;
        RTC_SDA_ON;
        RTC_SCL_ON;
}
/**------------------------------------------------------------------
调用方式:void I2CStart(void) 函数说明:私有函数,RTC专用
---------------------------------------------------------------------*/
void I2CStart(void)
{
        //Cpu_DisableInt();
        RTC_SDAOUT;
        RTC_SDA_ON;
        RTC_SCL_ON;
        SomeNOP();//INI
        RTC_SDA_OFF;
        SomeNOP(); //START
        RTC_SCL_OFF;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,RTC专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
        RTC_SCL_OFF;
        RTC_SDAOUT;
        RTC_SDA_OFF;
        SomeNOP(); //INI
        RTC_SCL_ON;
        SomeNOP();
        RTC_SDA_ON; //STOP
        //Cpu_EnableInt();
}

/*--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
        unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
        RTC_SDAOUT;
        RTC_SDA_ON;
        RTC_SDAIN;
        SomeNOP();
        RTC_SCL_ON;
        //SomeNOP();
        while(RTC_GETSDA())
        {
                errtime--;
                if (!errtime)
                {
                        I2CStop();
                        SystemError=0x11;
                        return FALSE;
                }
        }
        RTC_SCL_OFF;
        return TRUE;
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
        RTC_SDAOUT;
        RTC_SDA_OFF;
        SomeNOP();
        RTC_SCL_ON;
        SomeNOP();
        RTC_SCL_OFF;
}

/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
        RTC_SDAOUT;
        RTC_SDA_ON;
        SomeNOP();
        RTC_SCL_ON;
        SomeNOP();
        RTC_SCL_OFF;
}

/*--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char ch)
{
        unsigned char BitCnt;
        //while (i--)
       for(BitCnt=0;BitCnt<8;BitCnt++)
        {
                RTC_SCL_OFF;
                SomeNOP();
                RTC_SDAOUT;
                //SDA=(bit)(ch&0x80);
                //ch<<=1;
                if((ch<<BitCnt)&0x80)
               {
                        RTC_SDA_ON;        //        SDA=1;   //判断发送位
               }else{
                       RTC_SDA_OFF;        // SDA=0;
               }
                SomeNOP();
                RTC_SCL_ON;
                SomeNOP();
        }
        RTC_SCL_OFF;
}
/*----------------------------------------------------------------
调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned charI2CReceiveByte(void)
{
        unsigned char i=8;
        unsigned char ddata=0;
        RTC_SDAOUT;
        RTC_SDA_ON;
        RTC_SDAIN;
        while (i--)
        {
                ddata<<=1;
                RTC_SCL_OFF;
                SomeNOP();
                RTC_SCL_ON;
                SomeNOP();
                ddata|=RTC_GETSDA();
        }
        RTC_SCL_OFF;
        return ddata;
}

//开始PCF8563T驱动程序
/*--------------------------------------------------------------------------------
调用方式:void GetPCF8563(uchar firsttype uchar count uchar *buff) ﹫2001/08/0 7
函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取的字节 数,则会一次把时间读取到buff中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void GetPCF8563(unsigned char firsttype,unsigned char count,unsigned char *buff)
{
        unsigned char i;
        I2CStart();
        I2CSendByte(RTC_DEVICE_ADDR);//发送的第一个字节,设备地址
        WaitAck();
        I2CSendByte(firsttype);   //发送的第二个字节
        WaitAck();
        I2CStart();
        I2CSendByte(RTC_DEVICE_ADDR+1);   //发送的第三个字节,要读取的器件地址
        WaitAck();

        for (i=0;i<count;i++)//连续读取count个字节
        {
                buff=I2CReceiveByte();//接收一个字节
                if (i!=count-1){
                        SendAck();//除最后一个字节外,其他都要从MASTER发应答。
                }
        }
        SendNotAck();
        I2CStop();
}


/*--------------------------------------------------------------------------------
调用方式:void SetPCF8563(uchar timetype uchar value) ﹫2001/08/0 7
函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void SetPCF8563(unsigned char timetype,unsigned char value)
{
        I2CStart();
        I2CSendByte(RTC_DEVICE_ADDR);
        WaitAck();
        I2CSendByte(timetype);
        WaitAck();
        I2CSendByte(value);
        WaitAck();
        I2CStop();
}

void FixTime(unsigned char * data)
{
        data=data&0x7F;//秒
        data=data&0x7F;//分
        data=data&0x3F;//时
        data=data&0x3F;//日
        data=data&0x1F;//月
}


watercici 发表于 2018-3-27 16:46:32

Angel_YY 发表于 2018-3-27 16:33
寄存器都有ACK啊。
我的代码如下,可以参考

可是我的是对偶数寄存器设置有ACK,对奇数寄存器设置就是NACK

watercici 发表于 2018-3-27 16:46:54

watercici 发表于 2018-3-27 16:46
可是我的是对偶数寄存器设置有ACK,对奇数寄存器设置就是NACK

我主要是参考了好多代码了

springvirus 发表于 2018-4-25 11:40:31

watercici 发表于 2018-3-27 16:46
可是我的是对偶数寄存器设置有ACK,对奇数寄存器设置就是NACK

上逻辑分析仪,慢慢分析
页: [1]
查看完整版本: PCF8563中的定时器