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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版