/***************************************************
名称:I2C通信模块修改版
编写:YuMin_Dong
时间:2012.11.17
***************************************************/
#ifndef _I2C_H_
#define _I2C_H_
sbit SDA=P1^0;
sbit SCL=P1^1;
uint8 ACK;
//开启I2C总线
void I2C_Start()
{
SDA=1;
//_nop_();
//_nop_();
//_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;//钳主总线
_nop_();
_nop_();
}
//停止I2C总线
void I2C_Stop()
{
SDA=0;
//_nop_();
//_nop_();
//_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
//I2C通信主机发送字节
void I2C_SendByte(uint8 byte)
{
uint8 i;
for(i=0;i<8;i++)
{
if(byte&0x80)
SDA=1;
else SDA=0;
_nop_();
SCL=1;//使SDA数据有效
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
byte<<=1;
_nop_();
_nop_();
}
SDA=1;//数据线浮高
_nop_();
_nop_();
SCL=1;//使读取的数据有效,判断是否应答或非应答
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(SDA==1)
ACK=0;//收到非应答信号
else ACK=1;//收到应答信号
SCL=0;//钳总线
_nop_();
_nop_();
}
//I2C通信主机接收字节
uint8 I2C_ReceiveByte()
{
uint8 i;
uint8 byte;
for(i=0;i<8;i++)
{
SDA=1;//拉高准备接收
_nop_();
SCL=1;
byte<<=1;
if(SDA==1)
byte|=0x01;
else byte&=0xfe;
SCL=0;
_nop_();
_nop_();
}
return byte;
}