24c256和PCF8563能接到一条I2C总线上吗?
老兄,你用到SAA1064没有?请问DIP那里能买到?24c256和PCF8563能接到一条I2C总线呀!
我没用过SAA1064。请问SCL和SDA的上拉电阻有什么匹配问题吗?
应该没问题
我用的是77E58。
我现在PCF8563和ADUC834都是
上拉电阻用10K应该是没有问题的
发到这里吧,大家都能看。有错大家也能找 写:发送STAR
|
发送A2
|
发送02 (要写的数的首地址,从秒开始写)
|
写秒
|
写分
|
……
|
写年
|
STOP
对8563的设置:(只用了时钟,其他报警,定时都不用)
发送STAR
|
发送A2
|
发送00 (寄存器0地址)
|
发送00 (寄存器0数据)
|
发送00 (寄存器1数据)
|
发送A2
|
发送09 (寄存器09地址)
|
发送80 (寄存器09数据)
|
发送80 (寄存器0A数据)
|
发送80 (寄存器0B数据)
|
发送80 (寄存器0C数据)
|
发送00 (寄存器0D数据)
|
发送00 (寄存器0E数据)
|
STOP
(注意应答位)
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void)
函数说明:私有函数,I2C专用。开始
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_(); //START
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void)
函数说明:私有函数,I2C专用。停止
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0;
_nop_();_nop_();_nop_();_nop_(); _nop_(); //INI
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1; //STOP
EA=1;
}
/**--------------------------------------------------------------------------------
调用方式:bool WaitAck(void)
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
uchar errtime=255; //因故障接收方无ACK,超时值为255。
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
while(SDA)
{errtime--;
if (!errtime)
{I2CStop();
// SystemError=0x11;
return false;}
}
SCL=0;
return true;
}
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void SendNotAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应
答信号。 }
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch)
函数说明:私有函数,发送一字节数。I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(uchar ch)
{
uchar i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch < <=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
SCL=0;
}
/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void)
函数说明:私有函数,接收一字节数。I2C专用
---------------------------------------------------------------------------------*/
uchar I2CReceiveByte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while (i--)
{
ddata < <=1;
SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();
ddata|=SDA;
}
SCL=0;
return ddata;
}
//---------------------------------------------------------------------------
//PCF8563T驱动程序
/**--------------------------------------------------------------------------------
调用方式:void GetPCF8563(ucha rdata *tmbf)
函数说明:读取时钟芯片PCF8563的时间,一次把时间读取到tmbf中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void GetPCF8563(uchar data *tmbf)
{
uchar i;
I2CStart();
I2CSendByte(0xA2);WaitAck();
I2CSendByte(0x02);WaitAck();
I2CStart();
I2CSendByte(0xA3);WaitAck();
for(i=0;i <7;i++)
{tmbf[i]=I2CReceiveByte();
if (i!=6) SendAck();//除最后一个字节外,其他都要从MASTER发应答。
}
SendNotAck();
I2CStop();
}
/**--------------------------------------------------------------------------------
调用方式void iniPCF8563(void)
函数说明:初始化时钟
---------------------------------------------------------------------------------*/
void iniPCF8563(void)
{ I2CStart();
I2CSendByte(0xA2); WaitAck();
I2CSendByte(0x00); WaitAck();
I2CSendByte(0x00); WaitAck();
I2CSendByte(0x01); WaitAck();
I2CStart();
I2CSendByte(0xA2); WaitAck();
I2CSendByte(0x09); WaitAck();
I2CSendByte(0x80); WaitAck(); //09
I2CSendByte(0x80); WaitAck(); //0a
I2CSendByte(0x80); WaitAck(); //0b
I2CSendByte(0x80); WaitAck(); //0c
I2CSendByte(0x00); WaitAck(); //0d
I2CSendByte(0x00); WaitAck(); //0e
I2CStop();
delay(1);
}
/**--------------------------------------------------------------------------------
调用方式:void SetPCF8563(ucha datr *tmbf)
函数说明:设置时钟。tmbf是要写入的时间(BCD格式)。0x07中D7高为19,低为20;
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void SetPCF8563(uchar *tmbf)
{uchar i;
I2CStart();
I2CSendByte(0xA2); WaitAck();
I2CSendByte(0x02); WaitAck();
for(i=0;i <7;i++)
{I2CSendByte(tmbf[i]); WaitAck();}
I2CStop();
}
用过这两种芯片的人应该很多啊,大家帮帮忙嘛
你用这个读写有问题没有?
这个图片我看到过
电容不接晶振不会正常工作的。
我的24C256和8563同时接上还是不行!救命啊!
确实应该先发读(写)地址再发内部地址,然
你能上QQ不?
24C56和pcf8563应该是可以接到
肯定没有问题.我曾经将两者并在一起用过,很好的。
能否借鉴一下?或者请你指点,应该注意些什么?为什么我的接到一起就不行了?
注意速度
我觉得程序出错的可能性要大一些。以前我两