实时时钟难题,请大家帮忙

liangsiyuan 2003-09-29 08:00:46
本人现在在做一个实时时钟的驱动,C代码如下。
RTC:RS5C372A(理光)
MCU:MSP430F413
读出来的数据是0xFF,不知哪位可以帮忙?
*************************************************
代码如下:

#define WriteDeviceAddress 0x64 /*RTC Slave Address*/
#define ReadDeviceAddress 0x65 /*RTC Slave Address*/

#define SomeNop(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
/*---------------------------------------------------------------------------*/

void I2CStart(void)
{
SomeNop();
SDA = 1;
SomeNop();
SCL = 1;
SomeNop();
SDA = 0;
SomeNop();
SCL = 0;
SomeNop();
}

/*---------------------------------------------------------------------------*/

void I2CStop(void)
{
SDA = 0;
SomeNop();
SCL = 1;
SomeNop();
SDA = 1;
SomeNop();
}

/*---------------------------------------------------------------------------*/

bit I2CClock(void)
{
bit temp;
SomeNop();
SCL = 1;
_nop_();
_nop_();
_nop_();
temp = SDA;
_nop_();
_nop_();
SCL = 0;
SomeNop();
return(temp);
}

/*---------------------------------------------------------------------------*/

bit I2CSendByte(uchar I2CData)
{
register uchar i;
for(i = 0; i < 8; i++)
{
SDA = (bit)(I2CData & 0x80);
I2CData <<= 1;
I2CClock();
}
SDA = 1;
return(~I2CClock());
}

/*---------------------------------------------------------------------------*/

uchar I2CReceiveByte(void)
{
uchar I2CData = 0;
register uchar i;
for(i = 0; i < 8; i++)
{
I2CData <<= 1;
if(I2CClock())
I2CData++;
}
return(I2CData);
}

/*---------------------------------------------------------------------------*/

void I2CSendAck(void)
{
SDA = 0;
I2CClock();
SDA = 1;
}

/*---------------------------------------------------------------------------*/

void I2CSendNoAck(void)
{
SDA = 1;
I2CClock();
}

/*---------------------------------------------------------------------------*/

void WR_Rtc(uchar RamAddress, uchar *s, uchar bytes, uchar wr)
reentrant
{
uchar index;
EA = 0;
I2CStart();
I2CSendByte(WriteDeviceAddress);
I2CSendByte(RamAddress);
if(wr == 0)
{
for(index = 0; index < bytes; index++)
{
I2CSendByte(*s);
s++;
}
}
else if(wr == 1)
{
I2CStart();
I2CSendByte(ReadDeviceAddress);
for(index = 0; index < bytes - 1; index++)
{
SDA = 1;
*s = I2CReceiveByte();
I2CSendAck();
s++;
}
*s = I2CReceiveByte();
I2CSendNoAck();
}
I2CStop();
EA = 1;
}

/*---------------------------------------------------------------------------*/
...全文
89 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangsiyuan 2003-10-13
  • 打赏
  • 举报
回复
多谢大家帮忙,问题已经解决。
把以下经验和大家共享:

1、问题并不是时序的问题,RTC是支持400K频率的
2、SDA和SCL要接上拉,推荐10K(若波形太缓,可用4.7K或1K)
3、晶振外壳接地,这样晶振的波形会很好
4、上电后要等2秒后再操作RTC ,这样会比较稳定
liangsiyuan 2003-10-04
  • 打赏
  • 举报
回复
有用过RS5C372A的么?
CrazyGentleman 2003-09-30
  • 打赏
  • 举报
回复
时序!
galle 2003-09-30
  • 打赏
  • 举报
回复
somenop()太长了!
jack2004 2003-09-30
  • 打赏
  • 举报
回复
时序不对!认真读读I2C的说明,理解的更深一点.
HEROP 2003-09-30
  • 打赏
  • 举报
回复
估计应该事时序。
zhangyang_cn 2003-09-29
  • 打赏
  • 举报
回复
用我的I2C子程序,调通的,使用过DS1307和AT24C64
#define SCL P13
#define SDA P14

void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void wait10()
{
uint i=0xfff0;
while (i>0)
i--;
}

void start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}

void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
delay();
}

bit clock()
{
bit sam;
SCL=1;
delay();
sam=SDA;
SCL=0;
delay();
return(sam);
}

bit send(uchar dgt)
{
uchar i;
for(i=0;i<8;i++)
{
SDA=(bit)(dgt&0x80);
dgt<<=1;
clock();
}
SDA=1;
return(!clock());
}

void ack()
{
SDA=0;
clock();
SDA=1;
}

void nack()
{
SDA=1;
clock();
}

uchar receive()
{
uchar dgt=0;
uchar i;
for(i=0;i<8;i++)
{
dgt*=2;
if(clock())
dgt++;
}
return dgt;
}

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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