新聞中心

I2C總線注意要點(diǎn)

作者: 時間:2016-12-15 來源:網(wǎng)絡(luò) 收藏
1、只要求兩條總線線路:一條串行數(shù)據(jù)線SDA,一條串行時鐘線SCL。


本文引用地址:http://m.butianyuan.cn/article/201612/330279.htm

2、每個連接到總線的器件都可以通過唯一的地址和一直存在的簡單的主機(jī)/從機(jī)關(guān)系軟件設(shè)定地址,主機(jī)可以作為主機(jī)發(fā)送器或主機(jī)接收器。

3、在傳輸數(shù)據(jù)的時候,SDA線必須在時鐘的高電平周期保持穩(wěn)定,SDA的高或低電平狀態(tài)只有在SCL線的時鐘信號是低電平時才能改變。


4、SCL線是高電平時,SDA線從高電平向低電平切換,這個情況表示起始條件。

5、SCL線是高電平時,SDA線由低電平向高電平切換,這個情況表示停止條件。


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


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

voidI2C_delay(void)

{

u8i=200;

while(i)

{

i--;

}

}

voidI2C_Start(void)

{

SDA_H;

I2C_delay();

SCL_H;//SCL線是高電平時,SDA線從高電平向低電平切換,總線開始

I2C_delay();

SDA_L;

I2C_delay();

SCL_L;

I2C_delay();

}

voidI2C_Stop(void)

{

SDA_L;

I2C_delay();

SCL_H;//SCL線是高電平時,SDA線由低電平向高電平切換,總線結(jié)束。

I2C_delay();

SDA_H;

I2C_delay();

}

//等待ACK應(yīng)答

voidWaitACK1(void)

{

u8errtime=225;

SDA_IN();//設(shè)置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();

}

//寫入單字節(jié)數(shù)據(jù)

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();

}



關(guān)鍵詞: I2C總線注意要

評論


技術(shù)專區(qū)

關(guān)閉