实时时钟难题,请大家帮忙
本人现在在做一个实时时钟的驱动,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;
}
/*---------------------------------------------------------------------------*/