导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→24c256和PCF8563能接到一条I2C总线上吗?[rain_cxp]

 *第24066篇: 24c256和PCF8563能接到一条I2C总线上吗?

  
楼 主:rain_cxp 2004年7月24日12:31
 24c256和PCF8563能接到一条I2C总线上吗?
我用的是单片机控制,IO口模拟I2C总线,8563和24C256共用SCL和SDA,24C256的读地址为
0A7,写地址为0A6,和8563的地址不相冲突,可是为什么8563能正常工作,24C256却不能,
如果屏蔽掉对8563的操作,24C256就正常工作了,为什么?
  
2楼:潇香客 2004年7月24日16:04
 老兄,你用到SAA1064没有?请问DIP那里能买到?24c256和PCF8563能接到一条I2C总线呀!
老兄,你用到SAA1064没有?请问DIP那里能买到?24c256和PCF8563能接到一条I2C总线呀!我还有好多I2C器件都接到一条总线上。
  
3楼:rain_cxp 2004年7月26日09:14
 我没用过SAA1064。请问SCL和SDA的上拉电阻有什么匹配问题吗?
  
4楼:baolqkun 2004年7月24日17:21
 应该没问题
我看到过别人这么接的

应该没问题
我看到过别人这么接的
请问你单片机用的是什么的?
我用ADUC834接pcf8563
现在有点问题
  
5楼:rain_cxp 2004年7月26日09:16
 我用的是77E58。
接8563没什么问题。至少现在看来是这样的。就是24C256还不行,而且奇怪的是前天曾经能读能写,今天什么都没动,一早来了就又不行了,难道是上拉电阻的影响吗?
  
6楼:baolqkun 2004年7月26日09:56
 我现在PCF8563和ADUC834都是
我现在PCF8563和ADUC834都是第一次用
I2C也不是很了解
所以
有问题
都不知道是什么问题
找了一堆PCF8563的程序都没有搞定
因为ADUC834和80C51有一点点不同


上拉电阻用10K应该是没有问题的


  
7楼:rain_cxp 2004年7月26日10:22
 发到这里吧,大家都能看。有错大家也能找
读:发送STAR   
       |
     发送A2  
       |
     发送02    (要读的数的首地址,从秒开始读)
       |
     发送A3    
       |
     读秒    
       |
     读分    
       |
     ……
       |
     读年
       |
     STOP
     

写:发送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();
 }

  
8楼:rain_cxp 2004年7月26日09:56
 用过这两种芯片的人应该很多啊,大家帮帮忙嘛
  
9楼:baolqkun 2004年7月26日11:16
 你用这个读写有问题没有?
你的PCF8

你用这个读写有问题没有?
你的PCF8563接了电容没有?
  
10楼:rain_cxp 2004年7月26日11:46
 没有问题,接线图给你看看

此主题相关图片如下:
按此在新窗口浏览图片
  
11楼:baolqkun 2004年7月26日13:01
 这个图片我看到过
我不知道我没接15P

这个图片我看到过
我不知道我没接15PF电容
会不会对。
W77E58和80C51差不多吧
我现在用的ADUC834和80C51有一点不同
  
12楼:rain_cxp 2004年7月27日11:54
 电容不接晶振不会正常工作的。
77E58和80C51差不多,就是功能稍微强点,速度快点而已
  
13楼:rain_cxp 2004年7月27日11:55
 我的24C256和8563同时接上还是不行!救命啊!
  
14楼:rain_cxp 2004年7月27日13:10
 确实应该先发读(写)地址再发内部地址,然
确实应该先发读(写)地址再发内部地址,然后是数据。少了内部地址我也不知道是不是默认为0X00
  
15楼:baolqkun 2004年7月27日14:03
 你能上QQ不?
我的号码3972142

你能上QQ不?
我的号码397214227
MSN: baokun97@hotmail.com
  
16楼:baolqkun 2004年7月27日13:25
 24C56和pcf8563应该是可以接到
24C56和pcf8563应该是可以接到一起的,
但是内部编程我就不知道了
是我们另外一个同事做的
  
17楼:荒原野草 2004年7月27日14:18
 肯定没有问题.我曾经将两者并在一起用过,很好的。
  
18楼:rain_cxp 2004年7月27日15:44
 能否借鉴一下?或者请你指点,应该注意些什么?为什么我的接到一起就不行了?
  
19楼:guest 2004年7月29日08:10
 注意速度
注意速度
  
20楼:seribus 2004年7月30日13:03
 我觉得程序出错的可能性要大一些。以前我两
我觉得程序出错的可能性要大一些。以前我两个器件用同一个IIC总线时也是程序的BUG问题。可能的话用示波器好好看看,每次通信是否正常,总线是否释放

>>>>>>对该主题发表你的看法

本主题贴数20,分页: [第1页]


[上一篇主题]:请教高手一个8019AS发送数据包的问题,谢谢

[下一篇主题]:承接产品单片机开发