专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
搞了几天的PCF8563时钟芯片。。求助。。
2019-07-21 07:07
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
5211
18
1422
I2C有应答,但是不管写什么数据进去,读出来都是为0。有应答,应该可以说时序没有问题吧?、不知道为什么??晶振起振了。。换了几片的8563都不行。。写数据是按手册来写的。。望搞过的大侠求求助。。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
冰是睡着的水
1楼-- · 2019-07-21 10:32
网上对照了几个程序,都试过了。。原子哥的模拟I2C也试过了。。还是读出来为0,。。越简单的问题就越难。。
加载中...
正点原子
2楼-- · 2019-07-21 13:36
精彩回答 2 元偷偷看……
加载中...
mvip
3楼-- · 2019-07-21 19:08
给你一直在用的代码
#include "
CF8563.h"
// 读取时间
uchar ReadDateTime(DATETIME *dt)
{
uchar xdata i, buf[7];
IIC_BitStart();
if(!IIC_SendByte(PCF8563_WR)) return 0; // 写地址 0x02
if(!IIC_SendByte(0x02)) return 0;
IIC_BitStart(); // 写读控制字
if(!IIC_SendByte(PCF8563_RD)) return 0;
for(i=0; i<7; i++)
{
buf
= IIC_RcvByte();
if(i<7)
{
SDA = 0;
IIC_Clock();
}
else
{
SDA = 1;
IIC_Clock();
IIC_BitStop();
}
}
dt->year = ((buf[6]>>4)*10) + (buf[6] & 0x0F);
dt->month = (((buf[5]>>4) & 0x01)*10) + (buf[5] & 0x0F);
dt->day = (((buf[3]>>4) & 0x03)*10) + (buf[3] & 0x0F);
dt->hour = (((buf[2]>>4) & 0x03)*10) + (buf[2] & 0x0F);
dt->minute = (((buf[1]>>4) & 0x07)*10) + (buf[1] & 0x0F);
dt->second = (((buf[0]>>4) & 0x07)*10) + (buf[0] & 0x0F);
return 1;
}
// 启动时钟
uchar StartDateTime(void)
{
uchar xdata i, buf[2];
buf[0] = 0;
buf[1] = 0;
IIC_BitStart();
if(!IIC_SendByte(PCF8563_WR)) return 0;
if(!IIC_SendByte(0x00)) return 0; //address
for(i=0; i<2; i++)
{
if(!IIC_SendByte(buf
)) return 0;
}
IIC_BitStop();
return 1;
}
// 设置时间
uchar SetDateTime(DATETIME *dt)
{
uchar xdata i, buf[7];
buf[0] = ((dt->second/10) << 4) + (dt->second%10);
buf[1] = ((dt->minute/10) << 4) + (dt->minute%10);
buf[2] = ((dt->hour/10) << 4) + (dt->hour%10);
buf[3] = ((dt->day/10) << 4) + (dt->day%10);
buf[4] = 1;
buf[5] = ((dt->month/10) << 4) + (dt->month%10);
buf[6] = ((dt->year/10) << 4) + (dt->year%10);
IIC_BitStart();
if(!IIC_SendByte(PCF8563_WR)) return 0;
if(!IIC_SendByte(0x02)) return 0; //address
for(i=0; i<7; i++)
{
if(!IIC_SendByte(buf
)) return 0;
}
IIC_BitStop();
return 1;
}
// 判断时间
bit IsDateTime(void)
{
DATETIME xdata dt;
ReadDateTime(&dt);
if((dt.year > 99) || (dt.year < 0)) return 0;
if((dt.month > 12) || (dt.month <= 0)) return 0;
if((dt.day > 31) || (dt.day <= 0)) return 0;
if((dt.hour > 23) || (dt.hour < 0)) return 0;
if((dt.minute > 59) || (dt.minute < 0)) return 0;
if((dt.second > 59) || (dt.second < 0)) return 0;
return 1;
}
加载中...
冰是睡着的水
4楼-- · 2019-07-21 23:11
回复【4楼】mvip:
---------------------------------
谢谢。昨天已经解决了。一个低级错误搞得我3天。。不该啊。。
加载中...
冰是睡着的水
5楼-- · 2019-07-22 00:57
回复【4楼】mvip:
---------------------------------
问一下,,这个芯片不可以输出10ms级别的吧。。我想要输出这样的时间,难道真的要用定时器来搞。。
加载中...
liuquanjuren
6楼-- · 2019-07-22 03:41
回复【5楼】冰是睡着的水:
---------------------------------
请问楼主是怎么解决的?我刚坐pcf8563,和你遇到的问题一样。。
加载中...
1
2
3
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include "CF8563.h"
// 读取时间
uchar ReadDateTime(DATETIME *dt)
{
uchar xdata i, buf[7];
IIC_BitStart();
if(!IIC_SendByte(PCF8563_WR)) return 0; // 写地址 0x02
if(!IIC_SendByte(0x02)) return 0;
IIC_BitStart(); // 写读控制字
if(!IIC_SendByte(PCF8563_RD)) return 0;
for(i=0; i<7; i++)
{
buf = IIC_RcvByte();
if(i<7)
{
SDA = 0;
IIC_Clock();
}
else
{
SDA = 1;
IIC_Clock();
IIC_BitStop();
}
}
dt->year = ((buf[6]>>4)*10) + (buf[6] & 0x0F);
dt->month = (((buf[5]>>4) & 0x01)*10) + (buf[5] & 0x0F);
dt->day = (((buf[3]>>4) & 0x03)*10) + (buf[3] & 0x0F);
dt->hour = (((buf[2]>>4) & 0x03)*10) + (buf[2] & 0x0F);
dt->minute = (((buf[1]>>4) & 0x07)*10) + (buf[1] & 0x0F);
dt->second = (((buf[0]>>4) & 0x07)*10) + (buf[0] & 0x0F);
return 1;
}
// 启动时钟
uchar StartDateTime(void)
{
uchar xdata i, buf[2];
buf[0] = 0;
buf[1] = 0;
IIC_BitStart();
if(!IIC_SendByte(PCF8563_WR)) return 0;
if(!IIC_SendByte(0x00)) return 0; //address
for(i=0; i<2; i++)
{
if(!IIC_SendByte(buf)) return 0;
}
IIC_BitStop();
return 1;
}
// 设置时间
uchar SetDateTime(DATETIME *dt)
{
uchar xdata i, buf[7];
buf[0] = ((dt->second/10) << 4) + (dt->second%10);
buf[1] = ((dt->minute/10) << 4) + (dt->minute%10);
buf[2] = ((dt->hour/10) << 4) + (dt->hour%10);
buf[3] = ((dt->day/10) << 4) + (dt->day%10);
buf[4] = 1;
buf[5] = ((dt->month/10) << 4) + (dt->month%10);
buf[6] = ((dt->year/10) << 4) + (dt->year%10);
IIC_BitStart();
if(!IIC_SendByte(PCF8563_WR)) return 0;
if(!IIC_SendByte(0x02)) return 0; //address
for(i=0; i<7; i++)
{
if(!IIC_SendByte(buf)) return 0;
}
IIC_BitStop();
return 1;
}
// 判断时间
bit IsDateTime(void)
{
DATETIME xdata dt;
ReadDateTime(&dt);
if((dt.year > 99) || (dt.year < 0)) return 0;
if((dt.month > 12) || (dt.month <= 0)) return 0;
if((dt.day > 31) || (dt.day <= 0)) return 0;
if((dt.hour > 23) || (dt.hour < 0)) return 0;
if((dt.minute > 59) || (dt.minute < 0)) return 0;
if((dt.second > 59) || (dt.second < 0)) return 0;
return 1;
}
---------------------------------
谢谢。昨天已经解决了。一个低级错误搞得我3天。。不该啊。。
---------------------------------
问一下,,这个芯片不可以输出10ms级别的吧。。我想要输出这样的时间,难道真的要用定时器来搞。。
---------------------------------
请问楼主是怎么解决的?我刚坐pcf8563,和你遇到的问题一样。。
一周热门 更多>