www.pudn.com > GSM-M51.rar > I2C.c


/********************************** 
函数名:I2C.c 
功  能:AT24C32读写函数 
**********************************/ 
#include  
#include  
#include "hal.h" 
#include "I2C.h" 
 
//I2C起始 
void I2C_START(void) 
{I2C_SCL=1; 
 _NOP(); 
 I2C_SDA=1; 
 _NOP(); 
 I2C_SDA=0; 
 _NOP(); 
 I2C_SCL=0; 
 _NOP(); 
 } 
 
//I2C停止 
void I2C_STOP(void) 
{I2C_SDA=0; 
 _NOP(); 
 I2C_SCL=1; 
 _NOP(); 
 I2C_SDA=1; 
 _NOP(); 
 } 
 
//等待I2C应答 
void I2C_ACK(void) 
{uint i=0xffff; 
 I2C_SDA=1; 
 _NOP(); 
 I2C_SCL=1; 
 _NOP(); 
 do{i--; 
    if(I2C_SDA!=1) 
      {I2C_SCL=0;i=0;} 
    }while(i!=0); 
 I2C_SCL=0; 
 _NOP(); 
 } 
 
//I2C写8位 
void I2C_WRITE_8BIT(uchar dat) 
{uchar i; 
 for(i=0;i<8;i++) 
 {I2C_SDA=dat&0x80; 
  _NOP(); 
  I2C_SCL=1; 
  _NOP(); 
  I2C_SCL=0; 
  _NOP(); 
  dat<<=1; 
  } 
  I2C_ACK(); 
 } 
 
//I2C读8位 
uchar I2C_READ_8BIT(void) 
{uchar i,dat=0; 
 I2C_SDA=1; 
 for(i=0;i<8;i++) 
  {I2C_SCL=1; 
   _NOP(); 
   if(I2C_SDA==1) 
     {dat|=0x01;} 
   I2C_SCL=0; 
   if(i<7) 
   {dat<<=1;} 
   } 
 return(dat); 
 } 
 
//I2C读指定地址数据 
uchar I2C_READ(uint addr) 
{uchar dat; 
 I2C_START(); 
 I2C_WRITE_8BIT(OP_WRITE); 
 I2C_WRITE_8BIT((uchar)(addr/256)); 
 I2C_WRITE_8BIT((uchar)(addr%256)); 
 I2C_START(); 
 I2C_WRITE_8BIT(OP_READ); 
 dat=I2C_READ_8BIT(); 
 I2C_STOP(); 
 return(dat); 
 } 
 
//I2C写数据到指定地址 
void  I2C_WRITE(uint addr,uchar dat) 
{I2C_START(); 
 I2C_WRITE_8BIT(OP_WRITE); 
 I2C_WRITE_8BIT((uchar)(addr/256)); 
 I2C_WRITE_8BIT((uchar)(addr%256)); 
 I2C_WRITE_8BIT(dat); 
 I2C_STOP(); 
 }