⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 668i2c.c

📁 I2C总线模拟方式,位方式,字节方式的asm和C代码
💻 C
字号:
/*******************************************************************
P89C668单片机硬件I2C软件包,668i2c.c(主方式)
668的硬件I2C接口定义在P1.6,P1.7上,分别为P1.6=SCL;P1.7=SDA;(开漏输出)
相应寄存器:地址寄存器  S1ADR   用于存放自身从地址(从方式时才有用)
            数据寄存器  S1DAT   接收/发送数据用
            控制寄存器  S1CON   用于硬件I2C的设置、使能、启动、结束,
                                应答控制,中断标志等。
            状态寄存器  S1STA   指示I2C总线的操作状态码,高5位有效,
                                若I2C中断志置位,可查询此寄存器判断
                                总线情况。
此软件包是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并
使用看门狗,以防等待总线而造成死机。
                                  2001-09-21
*******************************************************************/
#include  "REG552.h"        /*668的硬件I2C定义与552的一样*/
#define   uchar unsigned char




/*******************************************************************
                  申请总线
功能:进行I2C总线的初始化--包括时钟速率,I2C使能,发送起始信号等
      等。
*******************************************************************/
void GetBus()
{
  S1CON=0xc5;          /*设置时钟为100K(MCU主频为12M),ENS1和AA置位*/
  STA=1;               /*申请成为主机,起动总线*/
  while(SI==0);        /*等待起始位的发送*/
}






/*******************************************************************
                    发送数据函数
功能:用于向总线发送数据                    
*******************************************************************/
void SendByte(uchar c)
{
  S1DAT=c;
  S1CON=0XC5;          /*清除SI位等等*/
  while(SI==0);        /*等待数据的发送*/
}







/*******************************************************************
                    向无子地址器件发送字节数据函数               
函数原型: bit  ISendByte(uchar sla,ucahr c);  
功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla,
          待发送的数据c,如果返回1表示操作成功,否则操作有误。
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
   GetBus();                 /*启动总线*/
   SendByte(sla);            /*发送器件地址,若无应答则返回*/
     if(S1STA!=0X18){S1CON=0XD5;return(0);}
   SendByte(c);              /*发送数据*/
     if(S1STA!=0X28){S1CON=0XD5;return(0);}
  S1CON=0XD5;                /*结束总线*/ 
  return(1);
}






/*******************************************************************
                    向有子地址器件发送多字节数据函数               
函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
          地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
          如果返回1表示操作成功,否则操作有误。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;

   GetBus();                 /*启动总线*/
   SendByte(sla);            /*发送器件地址*/
     if(S1STA!=0X18){S1CON=0XD5;return(0);}
   SendByte(suba);           /*发送器件子地址*/
     if(S1STA!=0X28){S1CON=0XD5;return(0);}
     
   for(i=0;i<no;i++)
    {   
     SendByte(*s);           /*发送数据*/
      if(S1STA!=0X28){S1CON=0XD5;return(0);}
     s++;
    } 
  S1CON=0XD5;                /*结束总线*/ 
  return(1);
}








/*******************************************************************
                    向无子地址器件读字节数据函数               
函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
          址sla,返回值在c.
          如果返回1表示操作成功,否则操作有误。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
   GetBus();                  /*启动总线*/
   SendByte(sla+1);           /*发送器件地址*/   
     if(S1STA!=0X40){S1CON=0XD5;return(0);}
   S1CON=0XC1;                /*接收一字节数据即发送非应答位*/
   while(SI==0);              /*等待接收数据*/  
     if(S1STA!=0X58){S1CON=0XD5;return(0);}
   *c=S1DAT;                  /*读取数据*/
   S1CON=0XD5;                /*结束总线*/   
  return(1);
}








/*******************************************************************
                    向有子地址器件读取多字节数据函数               
函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
          如果返回1表示操作成功,否则操作有误。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;

   GetBus();                 /*启动总线*/
   SendByte(sla);            /*发送器件地址*/
     if(S1STA!=0X18){S1CON=0XD5;return(0);}
   SendByte(suba);           /*发送器件子地址*/
     if(S1STA!=0X28){S1CON=0XD5;return(0);}
   S1CON=0XE5;               /*重新启动总线*/
   while(SI==0);
   SendByte(sla+1);
     if(S1STA!=0X40){S1CON=0XD5;return(0);} 
   
   for(i=0;i<no-1;i++)
    {  
     S1CON=0XC5;                /*接收一字节数据并发送应答位*/
     while(SI==0);              /*等待接收数据*/  
     if(S1STA!=0X50){S1CON=0XD5;return(0);}
     *s=S1DAT;                  /*读取数据*/ 
     s++;
    } 
   S1CON=0XC1;                 /*接收最后一字节数据并发送非应答位*/
   while(SI==0);  
   *s=S1DAT;
   S1CON=0XD5;                 /*结束总线*/ 
   return(1);
}

/*软件包大小:326字节*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -