PCF8563中的定时器
PCF8563中的定时器其定时功能一般用来干什么,是只要用PCF8563实时时钟芯片,就必须打开定时器的吗?只有定时功能开始,芯片才可以计时吗PCF8563中的定时器一般用来定时报警,比如定时在每天早上6点的闹钟,就可以通过定时器来设置,这个定时器不是必须要打开的,用到定时报警功能时才会用到这个定时器,RTC计时是否开始与这个定时器没有直接关系。 Angel_YY 发表于 2018-3-27 15:56
PCF8563中的定时器一般用来定时报警,比如定时在每天早上6点的闹钟,就可以通过定时器来设置,这个定时器不 ...
明白,谢谢您的解答 Angel_YY 发表于 2018-3-27 15:56
PCF8563中的定时器一般用来定时报警,比如定时在每天早上6点的闹钟,就可以通过定时器来设置,这个定时器不 ...
您好,我还想问一个问题,我现在的I2C时序是,对PCF8563的某些寄存器设置能够得到ACK应答,但也有对一些寄存器的设置等到的是NACK,这是为什么呢? 寄存器都有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;//月
}
Angel_YY 发表于 2018-3-27 16:33
寄存器都有ACK啊。
我的代码如下,可以参考
可是我的是对偶数寄存器设置有ACK,对奇数寄存器设置就是NACK watercici 发表于 2018-3-27 16:46
可是我的是对偶数寄存器设置有ACK,对奇数寄存器设置就是NACK
我主要是参考了好多代码了 watercici 发表于 2018-3-27 16:46
可是我的是对偶数寄存器设置有ACK,对奇数寄存器设置就是NACK
上逻辑分析仪,慢慢分析
页:
[1]