一:起始与终止
1:I2C起始条件
SCL高电平期间,SDA从高电平向低电平切换。
2:I2C终止条件
SCL高电平期间,SDA从低电平向高电平切换。
二:数据传输
1:进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定
SDA上的数据只能在SCL为低电平期间变化。
2:I2C总线每个CLK发送或接收一个位的数据(或地址)
在CLK上升沿,把数据bit(或地址)送到SDA线上
在CLK下降沿,从SDA线上读取数据bit
C程序实例:
void Start_I2c()
{
SDA=1;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
_Nop();
}
void Stop_I2c()
{
SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
_Nop();
_Nop();
}
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c
else SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1;
SCL=0;
_Nop();
_Nop();
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
retc=retc<1;
if(SDA==1)retc=retc+1;
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}