OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4834|回复: 8

PCF8563 40秒出现跳变

[复制链接]

4

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-7-29
在线时间
84 小时
发表于 2016-9-12 16:00:45 | 显示全部楼层 |阅读模式
1金钱
用IO口模拟I2C 外面接3.3V  4.7K的上拉电阻,现在出现20秒和40秒的时候小时和日期开始出现跳变。而回到0秒的时候又正常,有人遇到同样的问题吗?

最佳答案

查看完整内容[请看2#楼]

已经找到原因 40秒 对应的是值是100 0000 第7位出现1 而影响到其他值。 证明这PCF8563里面是没有清空再发送数据的。这是一个问题 在获取数据后屏蔽对应的数据位就可以了 & 0x3f 等等
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-7-29
在线时间
84 小时
 楼主| 发表于 2016-9-12 16:00:46 | 显示全部楼层
已经找到原因   40秒  对应的是值是100 0000   第7位出现1  而影响到其他值。 证明这PCF8563里面是没有清空再发送数据的。这是一个问题  在获取数据后屏蔽对应的数据位就可以了 & 0x3f 等等
QQ图片20160919152630.png
回复

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-9-12 16:34:06 | 显示全部楼层
我都用内置上拉了,少焊两个电阻,何乐不为呢?你把程序传上来看看
回复

使用道具 举报

4

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-7-29
在线时间
84 小时
 楼主| 发表于 2016-9-12 16:44:07 | 显示全部楼层
liarlaker 发表于 2016-9-12 16:34
我都用内置上拉了,少焊两个电阻,何乐不为呢?你把程序传上来看看

使用了内部的上拉也一样的效果   
回复

使用道具 举报

4

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-7-29
在线时间
84 小时
 楼主| 发表于 2016-9-12 16:47:09 | 显示全部楼层

void I2C_GPIO_Config(void)
{
     uint8_t i;
     GPIO_InitTypeDef  GPIO_InitStructure;

      RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOF, ENABLE);
      GPIO_InitStructure.GPIO_Pin = I2C_SCL|I2C_SDA;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
     
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
      GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_UP;

      GPIO_Init(GPIOF, &GPIO_InitStructure);   
}

u8 PCF8563_SetDate(u8 PCF_Format, RTC_DateTypeDef* PCF_DataStruct)
{
                RTC_DateTypeDef SetDate_Stu;
                u8 ret = TRUE;
               
                if(PCF_Format == PCF_Format_HEX)   // 16进制
                {
                          // 转换BCD 码
                                SetDate_Stu.RTC_Year = RTC_HexToBcd(PCF_DataStruct->RTC_Year);
                                SetDate_Stu.RTC_Month  = RTC_HexToBcd(PCF_DataStruct->RTC_Month);
                                SetDate_Stu.RTC_Date = RTC_HexToBcd(PCF_DataStruct->RTC_Date);
                                SetDate_Stu.RTC_WeekDay = RTC_HexToBcd(PCF_DataStruct->RTC_WeekDay);
                               
                }
                else if(PCF_Format == PCF_Format_BCD)  // BCD 码
                {
                                SetDate_Stu.RTC_Year  = (PCF_DataStruct->RTC_Year);
                                SetDate_Stu.RTC_Month  = (PCF_DataStruct->RTC_Month);
                                SetDate_Stu.RTC_Date  = (PCF_DataStruct->RTC_Date);
                                SetDate_Stu.RTC_WeekDay  = (PCF_DataStruct->RTC_WeekDay);
                }

                // 写进PCF8563
                ret = Rtc8563Write(PCF8563_Address_Years,SetDate_Stu.RTC_Year);
                if(ret == FALSE)
                        goto ERROR;
               
                ret = Rtc8563Write(PCF8563_Address_Months,SetDate_Stu.RTC_Month);
                if(ret == FALSE)
                        goto ERROR;

                ret = Rtc8563Write(PCF8563_Address_Days,SetDate_Stu.RTC_Date);
                if(ret == FALSE)
                        goto ERROR;

                ret = Rtc8563Write(PCF8563_Address_WeekDays,SetDate_Stu.RTC_WeekDay);
                if(ret == FALSE)
                        goto ERROR;


                return TRUE;


ERROR:
                return FALSE;
}



u8 PCF8563_SetTime(u8 PCF_Format, RTC_TimeTypeDef* PCF_TimeStruct)
{
                RTC_TimeTypeDef SetTime_Stu;
                u8 ret = TRUE;
               
                if(PCF_Format == PCF_Format_HEX)   // 16进制
                {
                          // 转换BCD 码
                                SetTime_Stu.RTC_Hours  = RTC_HexToBcd(PCF_TimeStruct->RTC_Hours);
                                SetTime_Stu.RTC_Minutes  = RTC_HexToBcd(PCF_TimeStruct->RTC_Minutes);
                                SetTime_Stu.RTC_Seconds  = RTC_HexToBcd(PCF_TimeStruct->RTC_Seconds);
                               
                }
                else if(PCF_Format == PCF_Format_BCD)  // BCD 码
                {
                                SetTime_Stu.RTC_Hours  = (PCF_TimeStruct->RTC_Hours);
                                SetTime_Stu.RTC_Minutes  = (PCF_TimeStruct->RTC_Minutes);
                                SetTime_Stu.RTC_Seconds  = (PCF_TimeStruct->RTC_Seconds);
                }

                // 写进PCF8563
                ret = Rtc8563Write(PCF8563_Alarm_Hours,SetTime_Stu.RTC_Hours);
                if(ret == FALSE)
                        goto ERROR;
               
                ret = Rtc8563Write(PCF8563_Address_Minutes,SetTime_Stu.RTC_Minutes);
                if(ret == FALSE)
                        goto ERROR;

                ret = Rtc8563Write(PCF8563_Address_Seconds,SetTime_Stu.RTC_Seconds);
                if(ret == FALSE)
                        goto ERROR;

                return TRUE;


ERROR:
                return FALSE;
}



u8 PCF8563_GetDate(u8 PCF_Format, RTC_DateTypeDef* PCF_DataStruct)
{
                /*
                PCF_DataStruct->RTC_Years = Rtc8563Read(PCF8563_Address_Years);
                PCF_DataStruct->RTC_Months= Rtc8563Read(PCF8563_Address_Months);
                PCF_DataStruct->RTC_Days= Rtc8563Read(PCF8563_Address_Days);
                PCF_DataStruct->RTC_WeekDays= Rtc8563Read(PCF8563_Address_WeekDays);
*/
                PCF_DataStruct->RTC_Year= Rtc8563Read(PCF8563_Address_Years);
                PCF_DataStruct->RTC_Month= Rtc8563Read(PCF8563_Address_Months);
                PCF_DataStruct->RTC_Date= Rtc8563Read(PCF8563_Address_Days);
        //        PCF_DataStruct->RTC_WeekDay= Rtc8563Read(PCF8563_Address_WeekDays);
               
                if(PCF_Format == PCF_Format_HEX)
                {
                                // 转回16进制
                                PCF_DataStruct->RTC_Year = ((PCF_DataStruct->RTC_Year>>4)*10) + (PCF_DataStruct->RTC_Year&0x0F);
                                PCF_DataStruct->RTC_Month = ((PCF_DataStruct->RTC_Month>>4)*10) + (PCF_DataStruct->RTC_Month&0x0F);
                                PCF_DataStruct->RTC_Date = ((PCF_DataStruct->RTC_Date>>4)*10) + (PCF_DataStruct->RTC_Date&0x0F);
                                PCF_DataStruct->RTC_WeekDay = ((PCF_DataStruct->RTC_WeekDay>>4)*10) + (PCF_DataStruct->RTC_WeekDay&0x0F);
                }


}


u8 PCF8563_GetTime(u8 PCF_Format, RTC_TimeTypeDef* PCF_TimeStruct)
{
               
                PCF_TimeStruct->RTC_Hours = Rtc8563Read(PCF8563_Address_Hours);
                PCF_TimeStruct->RTC_Minutes = Rtc8563Read(PCF8563_Address_Minutes);
                PCF_TimeStruct->RTC_Seconds = Rtc8563Read(PCF8563_Address_Seconds);

                UART6_SendByte(PCF_TimeStruct->RTC_Hours);
                UART6_SendByte(PCF_TimeStruct->RTC_Minutes);
                UART6_SendByte(PCF_TimeStruct->RTC_Seconds);


                if(PCF_Format == PCF_Format_HEX)
                {
                                // 转回16进制
                                PCF_TimeStruct->RTC_Hours = ((PCF_TimeStruct->RTC_Hours>>4)*10) + (PCF_TimeStruct->RTC_Hours&0x0F);
                                PCF_TimeStruct->RTC_Minutes = ((PCF_TimeStruct->RTC_Minutes>>4)*10) + (PCF_TimeStruct->RTC_Minutes&0x0F);
                                PCF_TimeStruct->RTC_Seconds = ((PCF_TimeStruct->RTC_Seconds>>4)*10) + (PCF_TimeStruct->RTC_Seconds&0x0F);
                }
               
}
回复

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-9-13 10:06:06 | 显示全部楼层
sapoiuyt 发表于 2016-9-12 16:47
void I2C_GPIO_Config(void)
{
     uint8_t i;

兄弟,抱歉没时间细看,但是我觉得问题不在这里,应该在你主程序执行过程中,你看看你的中断程序部分。
Mob:150 0032 0863
QQ:276204039
回复

使用道具 举报

4

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-7-29
在线时间
84 小时
 楼主| 发表于 2016-9-13 10:12:57 | 显示全部楼层
liarlaker 发表于 2016-9-13 10:06
兄弟,抱歉没时间细看,但是我觉得问题不在这里,应该在你主程序执行过程中,你看看你的中断程序部分。

没有用中断处理,I2C上还挂了AT24C1024
回复

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-9-13 10:21:15 | 显示全部楼层
sapoiuyt 发表于 2016-9-13 10:12
没有用中断处理,I2C上还挂了AT24C1024

把24C1024拆了,程序上不操作24c1024试一下呢,程序上弄简单一点。我用过DS1302,DS3231,基本上都很快调出来了。
Mob:150 0032 0863
QQ:276204039
回复

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-9-13 10:32:01 | 显示全部楼层
另外你有没有开watchdog?
Mob:150 0032 0863
QQ:276204039
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 10:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表