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

📄 iic程序.c

📁 用c语言编写的单片机IIC程序
💻 C
📖 第 1 页 / 共 2 页
字号:
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
   Start_I2c();               /*启动总线*/
   SendByte(sla);             /*发送器件地址*/
   if(ack==0)return(0);
   SendByte(c);               /*发送数据*/
   if(ack==0)return(0);
   Stop_I2c();                /*结束总线*/ 
   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;

   Start_I2c();               /*启动总线*/
   SendByte(sla);             /*发送器件地址*/
   if(ack==0)return(0);
   SendByte(suba);            /*发送器件子地址*/
   if(ack==0)return(0);

   for(i=0;i<no;i++)
   {   
     SendByte(*s);            /*发送数据*/
     if(ack==0)return(0);
     s++;
   } 
   Stop_I2c();                /*结束总线*/ 
   return(1);
}


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

   Start_I2c();               /*启动总线*/
   SendByte(sla);             /*发送器件地址*/
   if(ack==0)return(0);

   for(i=0;i<no;i++)
   {   
     SendByte(*s);            /*发送数据*/
     if(ack==0)return(0);
     s++;
   } 
   Stop_I2c();                /*结束总线*/ 
   return(1);
}

 

 

/*******************************************************************
                    向无子地址器件读字节数据函数               
函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
          址sla,返回值在c.
           如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
   Start_I2c();                /*启动总线*/
   SendByte(sla+1);            /*发送器件地址*/
   if(ack==0)return(0);
   *c=RcvByte();               /*读取数据*/
   Ack_I2c(1);                 /*发送非就答位*/
   Stop_I2c();                 /*结束总线*/ 
   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;

   Start_I2c();                  /*启动总线*/
   SendByte(sla);                /*发送器件地址*/
   if(ack==0)return(0);
   SendByte(suba);               /*发送器件子地址*/
   if(ack==0)return(0);

   Start_I2c();    /*重新启动总线*/
   SendByte(sla+1);
   if(ack==0)return(0);
   for(i=0;i<no-1;i++)
   {   
     *s=RcvByte();               /*发送数据*/
      Ack_I2c(0);                /*发送就答位*/  
     s++;
   } 
   *s=RcvByte();
   Ack_I2c(1);                   /*发送非应位*/
   Stop_I2c();                   /*结束总线*/ 
   return(1);
}


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

   Start_I2c();
   SendByte(sla+1);
   if(ack==0)return(0);

   for(i=0;i<no-1;i++)
   {   
      *s=RcvByte();               /*发送数据*/
      Ack_I2c(0);                 /*发送就答位*/  
      s++;
   } 
   *s=RcvByte();
   Ack_I2c(1);                    /*发送非应位*/
   Stop_I2c();                    /*结束总线*/ 
   return(1);
}


















/********************************************** 
  模拟I2C程序 winavr20050214 
***********************************************/ 
# define F_CPU 4000000UL 

#include <avr/io.h> 
#include <avr/delay.h> 

#define cbi(sfr, bit)         (_SFR_BYTE(sfr) &= ~_BV(bit)) 
#define sbi(sfr, bit)         (_SFR_BYTE(sfr) |= _BV(bit)) 
#define bit_is_set(sfr, bit)    (_SFR_BYTE(sfr) & _BV(bit)) 

//DDR    PORT     
//0    0    in,high 
//0    1    in,r 
//1    0    out=0 
//1    1    out=1 

#define sda    0 
#define scl    1 
#define I2C        DDRB 
#define    I2C_read    PINB 
#define    I2C_set        PORTB 

#define Set_SDA        cbi(I2C,sda) 
#define Cls_SDA        sbi(I2C,sda) 
#define Set_SCL        cbi(I2C,scl) 
#define Cls_SCL        sbi(I2C,scl) 
#define SDA_High         bit_is_set(I2C_read,sda) 

//function declaration 
void I2C_Delay(void); 
void I2C_Start(void); 
void I2C_Stop(void); 
unsigned char I2C_Write(unsigned char wb); 
unsigned char I2C_Read(unsigned char bEnd); 

//***************************************************** 
//delay 100us 
//***************************************************** 
void I2C_Delay(void) 
{ 
    _delay_us(100); 
} 

//***************************************************** 
//i2c init 
//***************************************************** 
void I2C_init(void) 
{ 

//DDR    PORT     
//0    0    in,high 
//0    1    in,r 
//1    0    out=0 
//1    1    out=1 

    cbi(I2C_set,sda);        //sda=1 
    cbi(I2C,sda);            //sda in 
    cbi(I2C_set,scl);        //scl=1; 
    cbi(I2C,scl);            //scl in 
} 

//***************************************************** 
//i2c start 
//***************************************************** 
void I2C_Start(void) 
{ 
     Cls_SCL; 
     I2C_Delay(); 
     Set_SDA; 
     I2C_Delay(); 

     Set_SCL; 
     I2C_Delay(); 
     Cls_SDA; 
     I2C_Delay(); 

     Cls_SCL; 
     I2C_Delay();          
} 

//***************************************************** 
//i2c stop 
//***************************************************** 
void I2C_Stop(void) 
{ 
     Cls_SDA; 
     I2C_Delay(); 
      
     Set_SCL; 
     I2C_Delay(); 
     Set_SDA; 
     I2C_Delay(); 

     Set_SCL; 
     I2C_Delay(); 
} 

//***************************************************** 
//I2C_Write  
//***************************************************** 
unsigned char I2C_Write(unsigned char wb) 
{ 
    unsigned char i,ack=0; 
     
    for(i=0;i<8;i++) 
    { 
         if( wb&0x80 ) Set_SDA; 
         else          Cls_SDA; 
         wb=wb<<1; 
         I2C_Delay(); 
          
         Set_SCL; 
         I2C_Delay(); 
         Cls_SCL; 
         if(i!=7)    I2C_Delay(); 
    } 
     
    Set_SDA;        //release sda line 
    I2C_Delay(); 
    Set_SCL; 
    I2C_Delay(); 
     
    if( SDA_High )    ack=1;    //ack error 

    Cls_SCL; 
    I2C_Delay(); 
     
    return ack; 
} 

//***************************************************** 
//I2C_Read 
//***************************************************** 
unsigned char I2C_Read(unsigned char bEnd) 
{ 
    unsigned char i,mb; 
     
    Set_SDA;    //release sda line 
    mb=0; 
    for(i=0;i<8;i++) 
    { 
        mb=mb<<1; 
         
        I2C_Delay(); 
        Set_SCL; 
        I2C_Delay(); 
        if( SDA_High ) mb++; 
        I2C_Delay(); 
        Cls_SCL; 
        if(i!=7)        I2C_Delay(); 
    } 
    if( bEnd )      Set_SDA;        //end read 
    else            Cls_SDA;        //ack 
    I2C_Delay(); 
     
    Set_SCL; 
    I2C_Delay(); 
    Cls_SCL; 
    I2C_Delay(); 
    Set_SDA; 
     
    return mb; 

} 


























⌨️ 快捷键说明

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