|
#include "Global.h"
#define SDA P3_1
#define SCL P3_0
#define SET_SDA (SDA = 1)
#define CLR_SDA (SDA = 0)
#define SET_SCL (SCL = 1)
#define CLR_SCL (SCL = 0)
#define SDA_INPUT {P3M1 &= ~(BIT1);SET_SDA;}
#define SDA_OUTPUT {P3M1 |= (BIT1);}
#define SCL_INPUT {P3M1 &= ~(BIT0);SET_SCL;}
#define SCL_OUTPUT {P3M1 |= (BIT0);}
#define Device_Addr 0xA0
#define DELAN_TIM 30
//------------------------------------------
void DelanNop(u8 Count)
{
do
{
Count--;
} while (Count != 0);
}
//**********************************
//I2C start signal
//**********************************
void i2cStart(void)
{
SDA_OUTPUT; //set SDA as output
SCL_OUTPUT; //set SCL as output
SET_SDA; DelanNop(DELAN_TIM); //SDA=1
SET_SCL; DelanNop(DELAN_TIM); //SCL=1
CLR_SDA; DelanNop(DELAN_TIM); //SDA=0
CLR_SCL; DelanNop(DELAN_TIM); //SCL=0
}
//**********************************
//I2C stop signal
//**********************************
void i2cStop(void)
{
SDA_OUTPUT; //set SDA as output
SCL_OUTPUT; //set SCL as output
CLR_SDA; DelanNop(DELAN_TIM);//SDA=0
SET_SCL; DelanNop(DELAN_TIM);//SCL=1
SET_SDA; DelanNop(DELAN_TIM);//SDA=1
CLR_SCL; DelanNop(DELAN_TIM);//SCL=0
}
//**********************************
//ACK(0) signal
//**********************************
void Ack(void)
{
SDA_OUTPUT;//set SDA as output
SCL_OUTPUT;//set SCL as output
CLR_SDA; DelanNop(DELAN_TIM);//SDA=0
SET_SCL; DelanNop(DELAN_TIM);//SCL=1
CLR_SCL; DelanNop(DELAN_TIM);//SCL=0
SET_SDA; DelanNop(DELAN_TIM);//SDA=1
}
//**********************************
//NoAck(1) signal
//**********************************
void NoAck(void)
{
SDA_OUTPUT;//set SDA as output
SCL_OUTPUT;//set SCL as output
SET_SDA; DelanNop(DELAN_TIM);//SDA=1
SET_SCL; DelanNop(DELAN_TIM);//SCL=1
CLR_SCL; DelanNop(DELAN_TIM);//SCL=0
}
//**********************************
//master check ack signal
//0:ACK complete1 no complete
//**********************************
bl TestAck(void)
{
bl Ack_Bit; //define ack bit
SDA_INPUT; //set SDA as input
SCL_OUTPUT; //set SCL as output
//SDA=1;_delay(30);//SDA=1
SET_SCL; DelanNop(DELAN_TIM);//SCL=1
Ack_Bit = SDA; DelanNop(DELAN_TIM);//read back ACK
CLR_SCL; DelanNop(DELAN_TIM);//SCL=0
SDA_OUTPUT;
Ack_Bit = 1;
if (!Ack_Bit)
{
DelanNop(DELAN_TIM);
DelanNop(DELAN_TIM);
Ack_Bit = 1;
}
return Ack_Bit;
}
//**********************************
//master write data
//**********************************
void i2cWrite(u8 Data)
{
u8 count = 8;
SDA_OUTPUT; //set SDA as output
SCL_OUTPUT; //set SCL as output
while (count--)
{
SDA = (bl)(Data & 0x80); //bit7 sent to SDA pin
DelanNop(DELAN_TIM);
SET_SCL; DelanNop(DELAN_TIM); //sent clock
CLR_SCL; DelanNop(DELAN_TIM);
Data = Data << 1; //Data shift left 1 bit
}
}
//**********************************
//master read data
//**********************************
u8 i2cRead(void)
{
u8 count = 8, Data;
SDA_INPUT;//set SDA as input
SCL_OUTPUT;//set SCL as output
do
{
SET_SCL; DelanNop(DELAN_TIM);
Data = Data << 1; //Data shift left 1 bit
if (SDA){ Data |= BIT0; }
CLR_SCL;
DelanNop(DELAN_TIM);
count--;
} while (count);
return(Data);
}
//---------------------------------------------------------------------------------IIC 發(fā)送數(shù)據(jù)
void SendI2cData(void)
{
u8 I;
i2cStart();
i2cWrite(Device_Addr);
TestAck();
DelanNop(DELAN_TIM);
for (I = 0; I < sizeof(SendBuf); I++)
{
i2cWrite(SendBuf[I]);
TestAck();
}
i2cStop();
}
//---------------------------------------------------------------------------------IIC 接收數(shù)據(jù)
bl FlagBuzOk;
void ReceveI2cData(void)
{
u8 I, CKM;
i2cStart();
i2cWrite(Device_Addr + 1);
TestAck();
DelanNop(DELAN_TIM);
for (I = 0; I < sizeof(ReadBuf); I++)
{
ReadBuf[I] = i2cRead();
Ack();
}
NoAck();
i2cStop();
}
|
|