匯流排全記錄 I2C

2021-10-10 13:53:21 字數 3210 閱讀 6265

​ i2c 是很常見的一種匯流排協議,i2c 是 nxp 公司設計的,i2c 使用兩條線在主控制器和從機之間進行資料通訊。一條是 scl(序列時鐘線),另外一條是 sda(序列資料線),這兩條資料線需要接上拉電阻,匯流排空閒的時候 scl 和 sda 處於高電平。i2c 匯流排標準模式下速度可以達到 100kb/s,快速模式下可以達到 400kb/s。i2c 匯流排工作是按照一定的協議來執行的,接下來就看一下 i2c 協議。

​ i2c 是支援多從機的,也就是乙個 i2c 控制器下可以掛多個 i2c 從裝置,這些不同的 i2c從裝置有不同的器件位址,這樣 i2c 主控制器就可以通過 i2c 裝置的器件位址訪問指定的 i2c裝置了,乙個 i2c 匯流排連線多個 i2c 裝置如圖所示:

​ i2c 通訊起始標誌,通過這個起始位就可以告訴 i2c 從機,「我」要開始進行 i2c 通訊了。在 scl 為高電平的時候,sda 出現下降沿就表示為起始位,如圖所示:

​ 停止位就是停止 i2c 通訊的標誌位,和起始位的功能相反。在 scl 位高電平的時候,sda出現上公升沿就表示為停止位,如圖所示:

​ i2c 匯流排在資料傳輸的時候要保證在 scl 高電平期間,sda 上的資料穩定,因此 sda 上的資料變化只能在 scl 低電平期間發生,如圖所示:

​ 當 i2c 主機傳送完 8 位資料以後會將 sda 設定為輸入狀態,等待 i2c 從機應答,也就是等到 i2c 從機告訴主機它接收到資料了。應答訊號是由從機發出的,主機需要提**答訊號所需的時鐘,主機傳送完 8 位資料以後緊跟著的乙個時鐘訊號就是給應答訊號使用的。從機通過將 sda 拉低來表示發出應答訊號,表示通訊成功,否則表示通訊失敗。

​ 主機通過 i2c 匯流排與從機之間進行通訊不外乎兩個操作:寫和讀,i2c 匯流排單位元組寫時序如圖所示:

​ 來看一下寫時序的具體步驟:

1)、開始訊號。

2)、傳送 i2c 裝置位址,每個 i2c 器件都有乙個裝置位址,通過傳送具體的裝置位址來決定訪問哪個 i2c 器件。這是乙個 8 位的資料,其中高 7 位是裝置位址,最後 1 位是讀寫位,為1 的話表示這是乙個讀操作,為 0 的話表示這是乙個寫操作。

3)、 i2c 器件位址後面跟著乙個讀寫位,為 0 表示寫操作,為 1 表示讀操作。

4)、從機傳送的 ack 應答訊號。

5)、重新傳送開始訊號。

6)、傳送要寫寫入資料的暫存器位址。

7)、從機傳送的 ack 應答訊號。

8)、傳送要寫入暫存器的資料。

9)、從機傳送的 ack 應答訊號。

10)、停止訊號。

​ i2c 單位元組讀時序比寫時序要複雜一點,讀時序分為 4 大步,第一步是傳送裝置位址,第二步是傳送要讀取的暫存器位址,第三步重新傳送裝置位址,最後一步就是 i2c 從器件輸出要讀取的暫存器值,具體來看一下這步。

1)、主機傳送起始訊號。

2)、主機傳送要讀取的 i2c 從裝置位址。

3)、讀寫控制位,因為是向 i2c 從裝置傳送資料,因此是寫訊號。

4)、從機傳送的 ack 應答訊號。

5)、重新傳送 start 訊號。

6)、主機傳送要讀取的暫存器位址。

7)、從機傳送的 ack 應答訊號。

8)、重新傳送 start 訊號。

9)、重新傳送要讀取的 i2c 從裝置位址。

10)、讀寫控制位,這裡是讀訊號,表示接下來是從 i2c 從裝置裡面讀取資料。

11)、從機傳送的 ack 應答訊號。

12)、從 i2c 器件裡面讀取到的資料。

13)、主機發出 no ack 訊號,表示讀取完成,不需要從機再傳送 ack 訊號了。

14)、主機發出 stop 訊號,停止 i2c 通訊。

​ 由於匯流排上的多個節點,都有自己的定址位址,以此作為從節點被別的節點訪問。但是如果有兩個或兩個以上的節點都向匯流排上傳送啟動訊號並開始傳送資料,這樣就形成了衝突。要解決這種衝突,就要進行仲裁的判決,這就是i 2c匯流排上的仲裁。

​ scl同步是由於匯流排具有線「與」的邏輯功能,即只要有乙個節點傳送低電平時,匯流排上就表現為低電平。當所有的節點都傳送高電平時,匯流排才能表現為高電平。正是由於線「與」邏輯功能的原理,當多個節點同時傳送時鐘訊號時,在匯流排上表現的是統一的時鐘訊號。這就是scl的同步原理。

​ 上圖是以兩個節點為例的仲裁過程。data1和data2分別是主節點向匯流排所傳送的資料訊號,sda為匯流排上所呈現的資料訊號,scl是匯流排上所呈現的時鐘訊號。

​ 當主節點1、2同時傳送起始訊號時,兩個主節點都傳送了高電平訊號。這時匯流排上呈現的訊號為高電平,兩個主節點都檢測到匯流排上的訊號與自己傳送的訊號相同,繼續傳送資料。

​ 第2個時鐘週期,2個主節點都傳送低電平訊號,在匯流排上呈現的訊號為低電平,仍繼續傳送資料。

​ 在第3個時鐘週期,主節點1傳送高電平訊號,而主節點2傳送低電平訊號。根據匯流排的線「與」的邏輯功能,匯流排上的訊號為低電平,這時主節點1檢測到匯流排上的資料和自己所傳送的資料不一樣,就斷開資料的輸出級,轉為從機接收狀態。這樣主節點2就贏得了匯流排,而且資料沒有丟失,即匯流排的資料與主節點2所傳送的資料一樣,而主節點1在轉為從節點後繼續接收資料,同樣也沒有丟掉sda線上的資料。因此在仲裁過程中資料沒有丟失。

自己所傳送的資料不一樣,就斷開資料的輸出級,轉為從機接收狀態。這樣主節點2就贏得了匯流排,而且資料沒有丟失,即匯流排的資料與主節點2所傳送的資料一樣,而主節點1在轉為從節點後繼續接收資料,同樣也沒有丟掉sda線上的資料。因此在仲裁過程中資料沒有丟失。

i2c匯流排時序

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

I2C匯流排死鎖

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

I 2C匯流排簡介

總共有五種工作狀態 a 匯流排非忙狀態 該狀態時資料線 sda 和時鐘線 scl 都保持高電平。b 啟動狀態 當時鐘線 scl 為高電平狀態時,資料線 sda 由高電平變為低電平的下降沿被認為是 啟動 訊號。c 停止狀態 當時鐘線 scl 為高電平狀態時,資料線 sda 由低電平變為高電平的下降沿被...