你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

PCF8563中的定时器

[复制链接]
watercici 提问时间:2018-3-27 14:36 /
PCF8563中的定时器其定时功能一般用来干什么,是只要用PCF8563实时时钟芯片,就必须打开定时器的吗?只有定时功能开始,芯片才可以计时吗
收藏 评论7 发布时间:2018-3-27 14:36

举报

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

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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啊。
我的代码如下,可以参考
  1. /*
  2. * MyPCF85x63.h
  3. *
  4. *  Created on: 2017年10月18日
  5. *      Author: Angel_YY
  6. */

  7. #ifndef SOURCES_MYFILE_MYPCF85X63_H_
  8. #define SOURCES_MYFILE_MYPCF85X63_H_
  9. typedef unsigned char u8;
  10. void I2CInit(void);
  11. void GetPCF8563(unsigned char firsttype,unsigned char count,unsigned char *buff);
  12. void FixTime(unsigned char * data);
  13. void SetPCF8563(unsigned char timetype,unsigned char value);
  14. #endif /* SOURCES_MYFILE_MYPCF85X63_H_ */
复制代码

  1. /*
  2. * MyPCF85x63.c
  3. *
  4. *  Created on: 2017年10月18日
  5. *      Author: Angel_YY
  6. */
  7. #include "MyPCF85x63.h"
  8. #include "RTC_SCL.h"
  9. #include "RTC_SDA.h"

  10. #define RTC_SDAOUT                RTC_SDA_SetOutput()
  11. #define RTC_SDAIN                        RTC_SDA_SetInput()
  12. #define RTC_SDA_ON                RTC_SDA_SetOutput();RTC_SDA_SetVal()
  13. #define RTC_SDA_OFF                RTC_SDA_SetOutput();RTC_SDA_ClrVal()
  14. #define RTC_GETSDA()                RTC_SDA_GetVal()

  15. #define RTC_SCL_ON                RTC_SCL_SetVal()
  16. #define RTC_SCL_OFF                RTC_SCL_ClrVal()

  17. #define RTC_DEVICE_ADDR 0xA2

  18. unsigned char  SystemError;

  19. void SomeNOP(void){
  20.   unsigned short i=0x10;
  21.   while(i--);
  22. }
  23. //在总线不忙时,数据和时钟线时钟保持高电平。
  24. void I2CInit(void){
  25.         RTC_SDAOUT;
  26.         RTC_SDA_ON;
  27.         RTC_SCL_ON;
  28. }
  29. /**------------------------------------------------------------------
  30. 调用方式:void I2CStart(void) 函数说明:私有函数,RTC专用
  31. ---------------------------------------------------------------------*/
  32. void I2CStart(void)
  33. {
  34.         //Cpu_DisableInt();
  35.         RTC_SDAOUT;
  36.         RTC_SDA_ON;
  37.         RTC_SCL_ON;
  38.         SomeNOP();//INI
  39.         RTC_SDA_OFF;
  40.         SomeNOP(); //START
  41.         RTC_SCL_OFF;
  42. }
  43. /*--------------------------------------------------------------------------------
  44. 调用方式:void I2CStop(void) ﹫2001/07/0 4
  45. 函数说明:私有函数,RTC专用
  46. ---------------------------------------------------------------------------------*/
  47. void I2CStop(void)
  48. {
  49.         RTC_SCL_OFF;
  50.         RTC_SDAOUT;
  51.         RTC_SDA_OFF;
  52.         SomeNOP(); //INI
  53.         RTC_SCL_ON;
  54.         SomeNOP();
  55.         RTC_SDA_ON; //STOP
  56.         //Cpu_EnableInt();
  57. }

  58. /*--------------------------------------------------------------------------------
  59. 调用方式:bit I2CAck(void) ﹫2001/07/0 4
  60. 函数说明:私有函数,I2C专用,等待从器件接收方的应答
  61. ---------------------------------------------------------------------------------*/
  62. bool WaitAck(void)
  63. {
  64.         unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
  65.         RTC_SDAOUT;
  66.         RTC_SDA_ON;
  67.         RTC_SDAIN;
  68.         SomeNOP();
  69.         RTC_SCL_ON;
  70.         //SomeNOP();
  71.         while(RTC_GETSDA())
  72.         {
  73.                 errtime--;
  74.                 if (!errtime)
  75.                 {
  76.                         I2CStop();
  77.                         SystemError=0x11;
  78.                         return FALSE;
  79.                 }
  80.         }
  81.         RTC_SCL_OFF;
  82.         return TRUE;
  83. }
  84. /**--------------------------------------------------------------------------------
  85. 调用方式:void SendAck(void) ﹫2001/07/0 4
  86. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
  87. ---------------------------------------------------------------------------------*/
  88. void SendAck(void)
  89. {
  90.         RTC_SDAOUT;
  91.         RTC_SDA_OFF;
  92.         SomeNOP();
  93.         RTC_SCL_ON;
  94.         SomeNOP();
  95.         RTC_SCL_OFF;
  96. }

  97. /*--------------------------------------------------------------------------------
  98. 调用方式:void SendAck(void) ﹫2001/07/0 4
  99. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
  100. --------------------------------------------------------------------------------*/
  101. void SendNotAck(void)
  102. {
  103.         RTC_SDAOUT;
  104.         RTC_SDA_ON;
  105.         SomeNOP();
  106.         RTC_SCL_ON;
  107.         SomeNOP();
  108.         RTC_SCL_OFF;
  109. }

  110. /*--------------------------------------------------------------------------------
  111. 调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
  112. 函数说明:私有函数,I2C专用
  113. ---------------------------------------------------------------------------------*/
  114. void I2CSendByte(unsigned char ch)
  115. {
  116.         unsigned char BitCnt;
  117.         //while (i--)
  118.          for(BitCnt=0;BitCnt<8;BitCnt++)
  119.         {
  120.                 RTC_SCL_OFF;
  121.                 SomeNOP();
  122.                 RTC_SDAOUT;
  123.                 //SDA=(bit)(ch&0x80);
  124.                 //ch<<=1;
  125.                 if((ch<<BitCnt)&0x80)
  126.                  {
  127.                         RTC_SDA_ON;        //        SDA=1;   //判断发送位
  128.                  }else{
  129.                          RTC_SDA_OFF;        // SDA=0;
  130.                  }
  131.                 SomeNOP();
  132.                 RTC_SCL_ON;
  133.                 SomeNOP();
  134.         }
  135.         RTC_SCL_OFF;
  136. }
  137. /*----------------------------------------------------------------
  138. 调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
  139. 函数说明:私有函数,I2C专用
  140. ---------------------------------------------------------------------------------*/
  141. unsigned char  I2CReceiveByte(void)
  142. {
  143.         unsigned char i=8;
  144.         unsigned char ddata=0;
  145.         RTC_SDAOUT;
  146.         RTC_SDA_ON;
  147.         RTC_SDAIN;
  148.         while (i--)
  149.         {
  150.                 ddata<<=1;
  151.                 RTC_SCL_OFF;
  152.                 SomeNOP();
  153.                 RTC_SCL_ON;
  154.                 SomeNOP();
  155.                 ddata|=RTC_GETSDA();
  156.         }
  157.         RTC_SCL_OFF;
  158.         return ddata;
  159. }

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

  177.         for (i=0;i<count;i++)  //连续读取count个字节
  178.         {
  179.                 buff[i]=I2CReceiveByte();  //接收一个字节
  180.                 if (i!=count-1){
  181.                         SendAck();//除最后一个字节外,其他都要从MASTER发应答。
  182.                 }
  183.         }
  184.         SendNotAck();
  185.         I2CStop();
  186. }


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

  203. void FixTime(unsigned char * data)
  204. {
  205.         data[0]=data[0]&0x7F;//秒
  206.         data[1]=data[1]&0x7F;//分
  207.         data[2]=data[2]&0x3F;//时
  208.         data[3]=data[3]&0x3F;//日
  209.         data[5]=data[5]&0x1F;//月
  210. }
复制代码


评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版