i2c連續讀寫間隔 I2C匯流排協議分析

2021-10-13 17:03:29 字數 2453 閱讀 8419

i2c匯流排是由philips公司開發的一種簡單、雙向二線制同步序列匯流排。它只需要兩根線即可在連線於匯流排上的裝置之間通訊。i2c的兩根線sda(序列資料線)和scl(序列時鐘線)都是雙向i/o線,介面電路為開漏輸出,需通過上拉電阻接電源vcc,當匯流排空閒時,兩根線都是高電平。

常見的硬體結構圖(乙個介面卡,兩根線,若干裝置而已)

使用i2c通訊時,必須指定主從裝置,一般包含有i2c控制器的處理器被配置成主裝置,掛接在i2c匯流排上的外設作為從裝置。通訊開始都是由主裝置發起的在i2c匯流排上的每個裝置都有乙個7bit位的位址,稱為i2c裝置位址。

主裝置如何發起開始和停止通訊訊號?

在scl線為高電平時,將sda線由高拉低,即發出乙個start開始訊號;當scl為高電平時,將sda由低拉高,即傳送乙個stop停止訊號;那麼這些操作都是由主裝置的i2c控制器完成的。

i2c匯流排上有很多的裝置,如何保證一對一的通訊?

在i2c匯流排上的每個裝置都有乙個7bit位的位址,在i2c匯流排處於空閒狀態時,如果有主裝置想發起通訊,那麼將由它先發出乙個start訊號占有匯流排,緊接著傳送這個主裝置想要進行通訊的從裝置的7bit位的位址,這個位址在i2c匯流排上處於廣播狀態,即匯流排上的所有裝置都能看到這個位址,如果某乙個從裝置發現匯流排上傳輸的位址和自己的裝置位址一樣,那麼就傳送乙個應答訊號,這時主從裝置間的通訊就建立了,這個時候i2c匯流排將處於busy狀態,其他的裝置無法再使用匯流排,從而在匯流排上建立了乙個一對一的通訊。當通訊結束時,由主裝置傳送乙個stop訊號,釋放匯流排,其他的裝置就可以再次占用匯流排通訊了。

i2c上的主從裝置如何通訊?

在i2c匯流排上傳輸的資料都是8bit位為單位的,所以當主機要往從機寫資料時時序如下:

傳送start訊號

傳送7位位址+1個讀寫位0(0表示寫,1表示讀)

從機收到位址後,傳送ack應答訊號

主機收到應答訊號後傳送要寫的8位資料

若從機收到主機傳送的資料,傳送ack應答訊號

如果主機要繼續寫,那麼回到步驟4,如果寫完了那麼傳送stop訊號,終止通訊

當主機要從從機讀取資料時時序如下:

傳送start訊號

傳送7位位址+1個讀寫位1(0表示寫,1表示讀)

從機收到位址後,傳送ack應答訊號

主機收到應答訊號後等待接收從機的資料

從機傳送主機要讀取的資料

若主機收到從機傳送的資料,傳送ack應答訊號

如果主機要繼續讀,那麼回到步驟4,如果讀完了那麼傳送stop訊號,終止通訊

那麼在具體的使用場景中是什麼樣子呢?從機裝置內部往往有很多暫存器,如何讀寫這些暫存器呢?以rpr0521這個sensor作為從裝置的例項進行分析:

主機寫rpr0521中某個暫存器(暫存器的位址是8位的,暫存器中資料也是8位的)

主機傳送完7位的從機位址和寫位

主機傳送8位的要寫的從機的內部暫存器位址

從機收到後傳送ack

主機收到ack後,然後傳送要往這個暫存器寫的資料

主機讀rpr0521中某個暫存器的值(暫存器的位址是8位的,暫存器中資料也是8位的)

主機傳送完7位的從機位址和寫位(一定要注意,先寫然後讀)

主機傳送8位的要讀的從機的內部暫存器位址(用於確定要讀的暫存器的位址)

從機收到後傳送ack

主機收到ack後傳送7位的從機位址和讀位,然後等待接收資料

主機收到ack和從機傳送過來的資料

如果主機不讀了就傳送stop,如果繼續讀就回到步驟5(從機會自動傳送連續暫存器的資料)

常用debug手段

在實際專案中,通常會出現讀不到資料,那麼我們就需要debug,最常見的debug手段就是使用示波器抓時序,下圖是i2c資料傳輸的時序:

sda的資料在scl位高電平時保持穩定,在scl為低電平時資料改變,所以我們應該在時鐘週期的高電平期間讀取有效資料進行分析。

I2C匯流排的連續讀和連續寫

想寫個在給位址後能一直讀或寫的程式,因為郭天祥的教程裡只有單個位元組讀寫示例。可在網上找了好久沒找到合適的示例,只好自己看著手冊,慢慢摸索。皇天不負苦心人呀,終於出來了。寫完程式的同時也學會了怎樣看手冊的時序圖。還有此 只實現了同時寫讀兩個位元組,至於在未達到晶元頁面通訊量的最大值的範圍內都可以用f...

i2c匯流排時序

一心想踏入linux device driver的世界,想著i2c匯流排相對於usb等其他匯流排較為簡單,就以i2c作為切入點,希望可以逐步理解ldd的設計思想,並能理解其裝置模型的概念。在此對近期於i2c匯流排及驅動原始碼的理解做備忘,以免徒勞。平台友善之臂s70 tiny6410 cpusams...

I2C匯流排死鎖

原文 現象 最近發現訪問i2c裝置時,主裝置復位可能會引起i2c死鎖,表現為scl為高,sda一直為低,後發現是從裝置拉死i2c匯流排,從裝置斷電之後,sda變高,上電後通訊正常。後來通過拉低scl訊號線,sda就會自動變成高電平,i2c匯流排恢復。原因 在正常情況下,i2c匯流排協議能夠保證匯流排...