i2c.c

来自「51单片机的GSM收发短信C程序」· C语言 代码 · 共 100 行

C
100
字号
/**********************************
函数名:I2C.c
功  能:AT24C32读写函数
**********************************/
#include <W77C32.h>
#include <intrins.h>
#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();
 }

⌨️ 快捷键说明

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