i2c是一種匯流排式結構,它只需要scl時鐘訊號線與sda資料線,兩根線就能將連線與匯流排上的裝置實現資料通訊,由於它的簡便的構造設計,於是成為一種較為常用的通訊方式。
由於i2c採用的是主從式通訊方式,所以,通訊的過程完全由主裝置仲裁。在通訊之前,必須由主裝置傳送乙個起始訊號,決定資料是否可以開始傳送,並且在結束通訊時,必須再由主裝置傳送乙個結束訊號,以表示通訊已經結束。
因為,通訊之前,主裝置需要傳送乙個起始訊號,所以,先講一下起始訊號。通過上面的圖就可以知道(上圖中的第乙個波形圖是sda資料線,第二個波形圖是scl時鐘訊號線),起始訊號是在scl時鐘訊號線處於高電平時,sda資料線由高電平轉換為低電平,也就是產生乙個下降沿,就意味著起始訊號已經傳送,資料的通訊可以進行了。**如下:
void i2c_start()同樣的,由上圖可知:結束訊號,就是在scl時鐘訊號線處於高電平時,sda資料線由低電平變為高電平 ,也就是,sda資料線產生乙個 上公升沿。**如下:
接下來就是該講一下,i2c資料的傳送問題了。由於i2c是主從式通訊,也就意味著一根匯流排上可以掛載多個從裝置,那麼主裝置如何區分這些從裝置呢?主裝置如何知道是在與哪乙個從裝置在通訊呢?答案是:通過位址。每乙個從裝置都有自己的位址編碼,也就是說,主裝置在與具體的某乙個從裝置通訊之前,必須先傳送位址,以表示與主裝置通訊的是該裝置。從上圖可知,主裝置在傳送完起始訊號後,立刻開始了傳送從裝置的位址。那麼如何傳送資料位址呢?首先,在scl時鐘訊號線處於低電平時,sda資料線上的位址資訊要開始準備了。i2c通訊乙個必須注意的點就是,在傳送位址資訊時,都是從高位開始傳送,
i2c_sda = dat >> 7;接著,scl時鐘訊號線開始由低電平向高電平轉換,這個時候,sda資料線上的資料開始在傳送了,當scl時鐘訊號線上的訊號再由高電平轉換位低電平的時候,乙個bit位的資料已經傳送完畢。在位址資訊傳送完畢之後,還會有乙個應答訊號,因為,為了確保從裝置接收到已經傳送的資料,從裝置就會向主裝置傳送乙個應答訊號,若主裝置接收到應答訊號則說明資料傳送成功,否則資料傳送失敗。很重要的一點是,匯流排一直是由主裝置控制,那麼當從裝置想要向主裝置傳送乙個應答訊號時,主裝置需要是釋放匯流排,將匯流排許可權交給從裝置。dat = dat << 1;
所以,從裝置在向主裝置傳送應答訊號時,主裝置應該釋放匯流排,**如下:
i2c_sda = 1;接著,由上圖可知,當scl時鐘訊號線再次拉高時,就進入了第9個時鐘週期,也就是此時開始傳送應答訊號。當成功應答時,返回1,否則返回0。完整**如下:
i2c_sda = 1;最後,就是i2c裝置(也就是主裝置)資料的接收。此時,從裝置傳送資料給主裝置,也就是,主裝置進行資料的接收。那麼,主裝置同樣要釋放匯流排許可權。也就是i2c_delay10us();
i2c_scl = 1;
while(i2c_sda && (ack == 1)) }
i2c_scl = 0;
i2c_delay10us();
return 1;
}
i2c_sda = 1;首先,scl時鐘訊號線為低電平,這時,sda資料線要準備好資料了,接著,scl時鐘訊號線由低電平變為高電平,此時,資料傳送開始了,當scl時鐘訊號線再次變為低電平是,乙個bit的資料傳送結束。**如下:
uchar i2c_readbyte()i2c的底層時序到這裡基本上就已經結束了。return dat;
}
I2C通訊基本原理及其實現
i2c是一種匯流排式結構,它只需要scl時鐘訊號線與sda資料線,兩根線就能將連線與匯流排上的裝置實現資料通訊,由於它的簡便的構造設計,於是成為一種較為常用的通訊方式。由於i2c採用的是主從式通訊方式,所以,通訊的過程完全由主裝置仲裁。在通訊之前,必須由主裝置傳送乙個起始訊號,決定資料是否可以開始傳...
I2c序列匯流排組成及其工作原理
採用序列匯流排技術可以使系統的硬體設計大大簡化,系統的體積減小,可靠性提高,同時系統更容易更改和擴充 常用的序列擴充套件匯流排有 i2c匯流排,單匯流排,spi匯流排,以及microwire plus等等 i2c匯流排只有兩根雙向訊號線,一根是資料線sda,另一根是時鐘線scl i2c匯流排通過上拉...
序列通訊的基本原理及用MFC實現串列埠通訊程式設計
在 windows 應用程式的開發中,我們常常需要面臨與外圍資料來源裝置通訊的問題。計算機和微控制器 如 mcs 51 都具有序列通訊口,可以設計相應的串列埠通訊程式,完成二者之間的資料通訊任務。實際工作中利用串列埠完成通訊任務的時候非常之多。已有一些文章介紹串列埠程式設計的文章在計算機雜誌上發表。...