专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
有没有大师教教我PCA8565 RTC怎么使用的呐。调不出来了
2019-07-15 22:21
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
4732
4
1455
我用平时可以用的IIC总线进行操作,不是专门的IIC接口,一般的IIO进行操作,可是一直读取的是255,我现在怎么调都调不出来,不能在线
仿真
,只能烧写之后,观察现象。。
求指点
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
zuohaiwen112
1楼-- · 2019-07-16 03:21
把你的代码贴出来看看!不然怎么知道问题点在那?
加载中...
怪兽跳跳糖
2楼-- · 2019-07-16 09:14
zuohaiwen112 发表于 2013-9-26 19:34
把你的代码贴出来看看!不然怎么知道问题点在那?
我用的是STC15F2K32S单片机,IIC总线代码也是借鉴STC官网的模块进行改写的。现在出现的问题是一直读取的数据是0xff,不正常。
硬件我是用普通IO口做得SDA,SLK传输口。外部晶振是5.5296M。
请老师检查:
/**************************************
起始信号
**************************************/
void PCA8565_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void PCA8565_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void PCA8565_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit PCA8565_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
LEDG ^= 1;
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void PCA8565_SendByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
PCA8565_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
unsigned char PCA8565_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
SDA = 1; //使能内部上拉,准备读取数据
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
/**************************************
向AT24C04写1页(16字节)数据
将TESTDATA开始的16个测试数据写如设备的00~0F地址中
**************************************/
void PCA8565_WritePage(unsigned char Addr,unsigned char date)
{
unsigned char i;
PCA8565_Start(); //起始信号
PCA8565_SendByte(0xa2); //发送设备地址+写信号
PCA8565_SendByte(Addr); //发送存储单元地址
PCA8565_SendByte(date);
PCA8565_Stop(); //停止信号
}
/**************************************
从AT24C04读取1页(16字节)数据
将设备的00~0F地址中的数据读出存放在DATA区的BUF中
**************************************/
unsigned char PCA8565_ReadPage(unsigned char Addr)
{
unsigned char tempA;
PCA8565_Start(); //起始信号
PCA8565_SendByte(0xa2); //发送设备地址+写信号
PCA8565_SendByte(Addr); //发送存储单元地址
PCA8565_Start(); //起始信号
PCA8565_SendByte(0xa3); //发送设备地址+读信号
tempA = PCA8565_RecvByte();
PCA8565_SendACK(1); //最后一个数据需要会NAK
PCA8565_Stop();
return tempA; //停止信号
}
void TSetTime(void)//只初始化一次即可,是否初始化记录在eeprom中。上电读取,判断是否需要初始化
{
PCA8565_WritePage(0x00,0x20);
PCA8565_WritePage(0x08,1);Delay_ms(5);
PCA8565_WritePage(0x07,2); Delay_ms(5);
PCA8565_WritePage(0x05,3); Delay_ms(5);
PCA8565_WritePage(0x04,4); Delay_ms(5);
PCA8565_WritePage(0x03,5); Delay_ms(5);
PCA8565_WritePage(0x02,6); //Second
PCA8565_WritePage(0x00,0);//开始时间机器,这个寄存器可以不设置,直接默认即可
}
void TGetTime(void)
{
dateTime.year = PCA8565_ReadPage(0x08);
dateTime.month = PCA8565_ReadPage(0x07);
dateTime.day = PCA8565_ReadPage(0x05);
dateTime.hour = PCA8565_ReadPage(0x04);
dateTime.minute = PCA8565_ReadPage(0x03);
dateTime.second = PCA8565_ReadPage(0x02);
}
这是我按照数据手册写的读取时间模块:
PCA8565_Start();
PCA8565_SendByte(0xa2);
//AT24C04_SendByte(0x02);
PCA8565_Stop();
PCA8565_SendByte(0xa3);
dateTime.year = PCA8565_ReadPage(0x08);
dateTime.month = PCA8565_ReadPage(0x07);
dateTime.day = PCA8565_ReadPage(0x05);
dateTime.hour = PCA8565_ReadPage(0x04);
AT24C04_Stop();
加载中...
怪兽跳跳糖
3楼-- · 2019-07-16 11:18
精彩回答 2 元偷偷看……
加载中...
15344535766
4楼-- · 2019-07-16 16:29
问下你的PCA8565的问题解决了吗,我也出现这样情况,请教下,谢谢
加载中...
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
我用的是STC15F2K32S单片机,IIC总线代码也是借鉴STC官网的模块进行改写的。现在出现的问题是一直读取的数据是0xff,不正常。
硬件我是用普通IO口做得SDA,SLK传输口。外部晶振是5.5296M。
请老师检查:
/**************************************
起始信号
**************************************/
void PCA8565_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void PCA8565_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void PCA8565_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit PCA8565_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
LEDG ^= 1;
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void PCA8565_SendByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
PCA8565_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
unsigned char PCA8565_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
SDA = 1; //使能内部上拉,准备读取数据
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
/**************************************
向AT24C04写1页(16字节)数据
将TESTDATA开始的16个测试数据写如设备的00~0F地址中
**************************************/
void PCA8565_WritePage(unsigned char Addr,unsigned char date)
{
unsigned char i;
PCA8565_Start(); //起始信号
PCA8565_SendByte(0xa2); //发送设备地址+写信号
PCA8565_SendByte(Addr); //发送存储单元地址
PCA8565_SendByte(date);
PCA8565_Stop(); //停止信号
}
/**************************************
从AT24C04读取1页(16字节)数据
将设备的00~0F地址中的数据读出存放在DATA区的BUF中
**************************************/
unsigned char PCA8565_ReadPage(unsigned char Addr)
{
unsigned char tempA;
PCA8565_Start(); //起始信号
PCA8565_SendByte(0xa2); //发送设备地址+写信号
PCA8565_SendByte(Addr); //发送存储单元地址
PCA8565_Start(); //起始信号
PCA8565_SendByte(0xa3); //发送设备地址+读信号
tempA = PCA8565_RecvByte();
PCA8565_SendACK(1); //最后一个数据需要会NAK
PCA8565_Stop();
return tempA; //停止信号
}
void TSetTime(void)//只初始化一次即可,是否初始化记录在eeprom中。上电读取,判断是否需要初始化
{
PCA8565_WritePage(0x00,0x20);
PCA8565_WritePage(0x08,1);Delay_ms(5);
PCA8565_WritePage(0x07,2); Delay_ms(5);
PCA8565_WritePage(0x05,3); Delay_ms(5);
PCA8565_WritePage(0x04,4); Delay_ms(5);
PCA8565_WritePage(0x03,5); Delay_ms(5);
PCA8565_WritePage(0x02,6); //Second
PCA8565_WritePage(0x00,0);//开始时间机器,这个寄存器可以不设置,直接默认即可
}
void TGetTime(void)
{
dateTime.year = PCA8565_ReadPage(0x08);
dateTime.month = PCA8565_ReadPage(0x07);
dateTime.day = PCA8565_ReadPage(0x05);
dateTime.hour = PCA8565_ReadPage(0x04);
dateTime.minute = PCA8565_ReadPage(0x03);
dateTime.second = PCA8565_ReadPage(0x02);
}
这是我按照数据手册写的读取时间模块:
PCA8565_Start();
PCA8565_SendByte(0xa2);
//AT24C04_SendByte(0x02);
PCA8565_Stop();
PCA8565_SendByte(0xa3);
dateTime.year = PCA8565_ReadPage(0x08);
dateTime.month = PCA8565_ReadPage(0x07);
dateTime.day = PCA8565_ReadPage(0x05);
dateTime.hour = PCA8565_ReadPage(0x04);
AT24C04_Stop();
一周热门 更多>