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

📄 i2c.txt

📁 I2C模拟函数 I2C总线是飞利浦公司推出的总线技术,因其只使用两根I/O,就可以对一系列的I2C器件进行控制
💻 TXT
字号:
********************************************** 
  模拟I2C程序 winavr20050214 
***********************************************/ 
# define F_CPU 4000000UL 

#i nclude <avr/io.h> 
#i nclude <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 + -