使用pcf8563做RTC,读取的数据一直是255,哪位熟悉pcf8563的大神帮忙看看

yeahXing 2017-12-13 10:05:47
我的代码:
//PTD13 action
#define RTC_SCL_L 拉低scl
#define RTC_SCL_H 拉高scl
#define RTC_SCL_ST scl状态

//PTB5 action
#define RTC_SDA_L 拉低sda
#define RTC_SDA_H 拉高sda
#define RTC_SDA_ST sda状态
#define RTC_SDA_OUT sda输出
#define RTC_SDA_IN sda输入



void Delay21(uint32_t time)
{
while(time-- !=0)
{}
}


void RTC_Init()
{
//config output or input

RTC_SDA_L;
RTC_SCL_L;
}

/*function EEPROM_start()
* function:start write data or read data
*/
void RTC_Start()
{
RTC_SDA_H;
RTC_SCL_H;
RTC_SDA_L;
RTC_SCL_L;
}



/*function EEPROM_stop()
* function:stop write data or read data
*/
void RTC_Stop()
{
RTC_SDA_L;
RTC_SCL_L;
RTC_SCL_H;
RTC_SDA_H;
}


/*function EEPROM_ack()
* function:send EEPROM ack
*/
void RTC_Ack()
{
RTC_SDA_OUT;
RTC_SDA_L;
RTC_SCL_H;
RTC_SCL_L;
}


/*function EEPROM_noack()
* function:send EEPROM noack
*/
void RTC_Noack()
{
RTC_SDA_OUT;
RTC_SDA_H;
RTC_SCL_H;
RTC_SCL_L;
}


void RTC_Wait_Ack()
{
uint8_t tt=200;
RTC_SDA_H;
RTC_SCL_H;
while(RTC_SDA_ST && tt--)///
{}
RTC_SCL_L;
}


/*function EEPROM_Send_Char()
* function:send tdata
*/
void RTC_Send_Char(char tdata)
{
uint8_t i;
RTC_SDA_OUT;
for(i=0;i<8;i++)
{
RTC_SCL_L;
switch((tdata>>(7-i)&0X01))
{
case 0:
RTC_SDA_L;
break;
case 1:
RTC_SDA_H;
break;
default:
break;
}
RTC_SCL_H;
}
RTC_SCL_L;
RTC_SCL_H;
}

/*function EEPROM_Rev_Char()
* function:
*/
uint8_t RTC_Rev_Char()
{
uint8_t i;
uint8_t tdata=0;
RTC_SDA_IN;
RTC_SCL_L;
RTC_SDA_H;
for(i=0;i<8;i++)
{
tdata <<= 1;
RTC_SCL_L;
RTC_SCL_H;
tdata |= RTC_SDA_ST;
}
RTC_SCL_L;
return tdata;
}


void PCF8563_Write_Byte(unsigned char addr,unsigned char val)
{
RTC_Start();
RTC_Send_Char(0xA2);
RTC_Wait_Ack();
RTC_Send_Char(addr);
RTC_Wait_Ack();
RTC_Send_Char(val);
RTC_Wait_Ack();
RTC_Stop();
}



unsigned char PCF8563_Read_Byte(unsigned char addr)
{
unsigned char dat;
RTC_Start();
RTC_Send_Char(0xA2);
RTC_Wait_Ack();
RTC_Send_Char(addr);
RTC_Wait_Ack();
RTC_Start();
RTC_Wait_Ack();
RTC_Send_Char(0xA3); //发送读取命令
RTC_Wait_Ack();
dat=RTC_Rev_Char();
RTC_Noack();
RTC_Stop();
return(dat);
}



void RTC_Debug()
{
int k = 0;
RTC_Init();
PCF8563_Write_Byte(0x07,0x09);
k = PCF8563_Read_Byte(0x07);
}
...全文
677 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acuity. 2018-01-07
  • 打赏
  • 举报
回复
模拟i2c http://blog.csdn.net/qq_20553613/article/details/78878211
fly 100% 2018-01-06
  • 打赏
  • 举报
回复
波形是什么样的,sda 的上啦是多少?
zgl7903 2017-12-13
  • 打赏
  • 举报
回复
//PTD13 action #define RTC_SCL_L 拉低scl #define RTC_SCL_H 拉高scl #define RTC_SCL_ST scl状态 //PTB5 action #define RTC_SDA_L 拉低sda #define RTC_SDA_H 拉高sda #define RTC_SDA_ST sda状态 #define RTC_SDA_OUT sda输出 #define RTC_SDA_IN sda输入 这几个宏 要按实际的硬件写对应的代码
Acuity. 2017-12-13
  • 打赏
  • 举报
回复
1、IO设置为开漏模式; 2、检查时序。
zgl7903 2017-12-13
  • 打赏
  • 举报
回复
双踪看 时序是否对, 速率是否合适?
yeahXing 2017-12-13
  • 打赏
  • 举报
回复
是的,用示波器抓了波形是有的。粘贴的时候去掉了对应的引脚号。

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧