导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发到这里吧,大家都能看。有错大家也能找

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

   rain_cxp 
rain_cxp发表的帖子 

 发到这里吧,大家都能看。有错大家也能找
读:发送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();
 }


发表时间:2004年7月26日10:22:18

  
回复该帖

本主题共有 20 帖,分页:>>>>>该主题的所有内容[20]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  59006.[详细]你用这个读写有问题没有?你的PCF8563接了电容没有?
摘要:你用这个读写有问题没有? 你的PCF8563接了电容没有?......(51字)
- [baolqkun][1416次] 2004年7月26日

  59010.[详细]没有问题,接线图给你看看
摘要:[upload=jpg]UploadFile/200472611455619788.jpg[/upload]......(54字)
- [rain_cxp][1105次] 2004年7月26日

  59024.[详细]这个图片我看到过我不知道我没接15PF电容会不会对。W77E58和80C51差不多吧我现在用的AD..
摘要:这个图片我看到过 我不知道我没接15PF电容 会不会对。 W77E58和80C51差不多吧 我现在用的ADUC834和80C51有一点不同 ......(113字)
- [baolqkun][1080次] 2004年7月26日

[上一篇帖子]:hong9099@sohu.com--请给我一份资料看看,谢谢!hong9099@sohu.com-
[下一篇帖子]:用过这两种芯片的人应该很多啊,大家帮帮忙嘛