完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在调试PCA8565 这款实时时钟芯片是总是无法调试成功,想请教学长:
我用的是STC15F2K32S单片机,IIC总线代码也是借鉴STC官网的模块进行改写的。现在出现的问题是一直读取的数据是0xff,不正常。 硬件我是用普通IO口做得SDA,SLK传输口。外部晶振是5.5296M。 我的QQ:891176730 /************************************** 起始信号 **************************************/ 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; } /************************************** **************************************/ 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(); //停止信号 } /************************************** **************************************/ 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); PCA8565 _Stop(); |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 23:04 , Processed in 0.537469 second(s), Total 49, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号