一:起始與終止
本文引用地址:http://m.butianyuan.cn/article/201611/321549.htm1:I2C起始條件
SCL高電平期間,SDA從高電平向低電平切換。
2:I2C終止條件
SCL高電平期間,SDA從低電平向高電平切換。
二:數(shù)據(jù)傳輸
1:進(jìn)行數(shù)據(jù)傳送時,在SCL呈現(xiàn)高電平期間,SDA上的電平必須保持穩(wěn)定
SDA上的數(shù)據(jù)只能在SCL為低電平期間變化。
2:I2C總線每個CLK發(fā)送或接收一個位的數(shù)據(jù)(或地址)
在CLK上升沿,把數(shù)據(jù)bit(或地址)送到SDA線上
在CLK下降沿,從SDA線上讀取數(shù)據(jù)bit
C程序?qū)嵗?/p>
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);
}
評論