1、只要求兩條總線(xiàn)線(xiàn)路:一條串行數據線(xiàn)SDA,一條串行時(shí)鐘線(xiàn)SCL。
本文引用地址:http://dyxdggzs.com/article/201612/330279.htm2、每個(gè)連接到總線(xiàn)的器件都可以通過(guò)唯一的地址和一直存在的簡(jiǎn)單的主機/從機關(guān)系軟件設定地址,主機可以作為主機發(fā)送器或主機接收器。
3、在傳輸數據的時(shí)候,SDA線(xiàn)必須在時(shí)鐘的高電平周期保持穩定,SDA的高或低電平狀態(tài)只有在SCL線(xiàn)的時(shí)鐘信號是低電平時(shí)才能改變。

4、SCL線(xiàn)是高電平時(shí),SDA線(xiàn)從高電平向低電平切換,這個(gè)情況表示起始條件。
5、SCL線(xiàn)是高電平時(shí),SDA線(xiàn)由低電平向高電平切換,這個(gè)情況表示停止條件。

6、數據傳輸必須帶響應,相關(guān)的響應時(shí)鐘脈沖由主機產(chǎn)生。在響應的時(shí)鐘脈沖期間發(fā)送器釋放SDA線(xiàn)(高)。響應的時(shí)鐘脈沖期間,接收器必須將SDA線(xiàn)拉低,使它在這個(gè)時(shí)鐘脈沖的高電平期間保持穩定的低電平。

7、第一個(gè)字節的頭7位組成了從機地址,最低位(LSB)是第8位,它決定了傳輸的方向。第一個(gè)字節的最低位是“0”,表示主機會(huì )寫(xiě)信息到被選中的從機;“1”表示主機會(huì )向從機讀信息,當發(fā)送了一個(gè)地址后,系統中的每個(gè)器件都在起始條件后將頭7位與它自己的地址比較,如果一樣,器件會(huì )判定它被主機尋址,至于是從機接收器還是從機發(fā)送器,都由R/W位決定的。

voidI2C_delay(void)
{
u8i=200;
while(i)
{
i--;
}
}
voidI2C_Start(void)
{
SDA_H;
I2C_delay();
SCL_H;//SCL線(xiàn)是高電平時(shí),SDA線(xiàn)從高電平向低電平切換,總線(xiàn)開(kāi)始
I2C_delay();
SDA_L;
I2C_delay();
SCL_L;
I2C_delay();
}
voidI2C_Stop(void)
{
SDA_L;
I2C_delay();
SCL_H;//SCL線(xiàn)是高電平時(shí),SDA線(xiàn)由低電平向高電平切換,總線(xiàn)結束。
I2C_delay();
SDA_H;
I2C_delay();
}
//等待ACK應答
voidWaitACK1(void)
{
u8errtime=225;
SDA_IN();//設置SDA端口為輸入模式
I2C_delay();
SCL_H;
I2C_delay();
while(SDA_read)//SCL拉高后,等待SDA被拉低(ACK)
{
errtime--;
if(errtime==0)
{
I2C_Stop();
SDA_OUT();
break;
}
}
SCL_L;
SDA_OUT();
I2C_delay();
}
//寫(xiě)入單字節數據
voidWritebyte(unsignedcharData)
{
unsignedchari;
for(i=0;i<8;i++)
{
if((Data<
{
SDA_H;
}
else
{
SDA_L;
}
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
}
SDA_L;
I2C_delay();
WaitACK1();
I2C_delay();
}
評論