嵌入式知識-ARM裸機-學習筆記(11):I2C總線通信

嵌入式知識-ARM裸機-學習筆記(11):I2C總線通信

一、I2C總線

1. I2C總線簡介

I2C(Inter-Integrated Circuit)總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線。它只需要兩根線即可在連接於總線上的器件之間傳送信息。
主器件用於啓動總線傳送數據,併產生時鐘以開放傳送的器件,此時任何被尋址的器件均被認爲是從器件。在總線上主和從、發和收的關係不是恆定的,而取決於此時數據傳送方向。如果主機要發送數據給從器件,則主機首先尋址從器件,然後主動發送數據至從器件,最後由主機終止數據傳送;如果主機要接收從器件的數據,首先由主器件尋址從器件,然後主機接收從器件發送的數據,最後由主機終止接收過程。

2. I2C物理接口

物理接口:SCL + SDA(只需要用2根線就可以進行復雜的通信)
(1)SCL(serial clock):時鐘線,傳輸CLK信號,一般是I2C主設備向從設備提供時鐘的通道。
(2)SDA(serial data): 數據線,通信數據都通過SDA線傳輸。

3. I2C通信特徵

I2C通信是一種串行、同步、非差分、低速率的通信方式。
(1)串行:I2C屬於串行通信,所有的數據以位爲單位在SDA線上串行傳輸
(2)同步:同步通信就是通信雙方工作在同一個時鐘下,一般是通信的A方通過一根CLK信號線傳輸A自己的時鐘給B,B工作在A傳輸的時鐘下。所以同步通信的顯著特徵就是:通信線中有CLK
(3)非差分:因爲I2C通信速率不高,而且通信雙方距離很近,所以使用電平信號通信。
(4)低速率:I2C一般是用在同一個板子上的2個IC之間的通信,而且用來傳輸的數據量不大,所以本身通信速率很低(一般幾百KHz,不同的I2C芯片的通信速率可能不同,具體在編程的時候要看自己所使用的設備允許的I2C通信最高速率,不能超過這個速率)。

主設備+從設備
I2C通信的時候,通信雙方地位是不對等的,而是分主設備和從設備。通信由主設備發起,由主設備主導,從設備只是按照I2C協議被動的接受主設備的通信,並及時響應。
誰是主設備、誰是從設備是由通信雙方來定的(I2C協議並無規定),一般來說一個芯片可以只能做主設備、也可以只能做從設備、也可以既能當主設備又能當從設備(但是不能同時當兩個)。

可以多個設備掛在一條總線上(從設備地址)
I2C通信可以一對一(1個主設備對1個從設備),也可以一對多(1個主設備對多個從設備)。
主設備來負責調度總線,決定某一時間和哪個從設備通信。注意:同一時間內,I2C的總線上只能傳輸一對設備的通信信息,所以同一時間只能有一個從設備和主設備通信,其他從設備處於“冬眠”狀態,不能出來搗亂,否則通信就亂套了。
每一個I2C從設備在通信中都有一個I2C從設備地址,這個設備地址是從設備本身固有的屬性,然後通信時主設備需要知道自己將要通信的那個從設備的地址,然後在通信中通過地址來判斷是不是自己要找的那個從設備。(這個地址是一個電路板上唯一的,不是全球唯一的)。

4. I2C總線通信時序

從字面意思解釋,時序就是時間順序,實際上在通信中時序就是通信線上按照時間順序發生的電平變化,以及這些變化對通信的意義就叫時序。

I2C的總線空閒狀態、起始位、結束位

I2C總線上有1個主設備,n(n>=1)個從設備。I2C總線上有2種狀態;空閒態(所有從設備都未和主設備通信,此時總線空閒)和忙態(其中一個從設備在和主設備通信,此時總線被這一對佔用,其他從設備必須歇着)。整個通信分爲一個週期一個週期的,兩個相鄰的通信週期是空閒態每一個通信週期由一個起始位開始,一個結束位結束,中間是本週期的通信數據

在這裏插入圖片描述
起始位並不是一個時間點,起始位是一個時間段,在這段時間內總線狀態變化情況是:CLK線維持高電平,同時SDA線發生一個從高到低的下降沿

與起始位相似,結束位也是一個時間段。在這段時間內總線狀態變化情況是:SCL線維持高電平,同時SDA線發生一個從低到高的上升沿

起始位的下一個時鐘的上升沿會發生一個數據的傳輸,必須在上升沿來臨之前使其穩定。數據傳輸過程中,數據線從0變爲1時,一定要在下一個上升沿來到之前完成。

5. I2C數據傳輸格式

每一個通信週期的發起和結束都是由主設備來做的,從設備只有被動的響應主設備,沒法自己自發的去做任何事情。主設備在每個通信週期會先發8位的從設備地址(其實8位中只有7位是從設備地址,還有1位表示主設備下面要寫入還是讀出)到總線(主設備是以廣播的形式發送的,只要是總線上的所有從設備其實都能收到這個信息)。然後總線上的每個從設備都能收到這個地址,並且收到地址後和自己的設備地址比較看是否相等。如果相等說明主設備本次通信就是給我說話,如果不想等說明這次通信與我無關,不用聽了不管了。
發送方發送一段數據後,接收方需要迴應一個ACK。這個響應本身只有1個bit位,不能攜帶有效信息,只能表示2個意思(要麼表示收到數據,即有效響應;要麼表示未收到數據,無效響應)。
在某一個通信時刻,主設備和從設備只能有一個在發(佔用總線,也就是向總線寫),另一個在收(從總線讀)。如果在某個時間主設備和從設備都試圖向總線寫那就完蛋了,通信就亂套了。

下圖爲輸出傳輸格式:
在這裏插入圖片描述
其中白色爲主設備對從設備,灰色部分爲從設備對主設備
寫模式時的情況:首先由主設備發送一個起始信號,緊接着在下一個時鐘上升沿來臨時,將從設備的地址通過總線發送出去(其中7位爲地址數據,1位表示寫模式),總線上的各從設備接收到地址後與自己的地址相對比,如果對應則被選中,那麼從設備會發送一個ACK信號告訴主設備準備完畢,主設備發送8 bit的數據,從設備接收到該數據後會發送一個ACK信號,之後由主設備發送停止信號標誌着傳輸完成。
讀模式時的情況:首先由主設備發送一個起始信號,緊接着在下一個時鐘上升沿來臨時,將從設備的地址通過總線發送出去(其中7位爲地址數據,1位表示讀模式),總線上的各從設備接收到地址後與自己的地址相對比,如果對應則被選中,那麼從設備會發送一個ACK信號告訴主設備準備完畢,然後從設備開始發送8bit的數據,主設備收到之後會發送一個ACK信號,然後再發送停止信號標誌結束。

在這裏插入圖片描述
I2C通信時的基本數據單位也是以字節爲單位的每次傳輸的有效數據都是1個字節(8位)
起始位及其後的8個clk中都是主設備在發送(這設備掌控總線),此時從設備只能讀取總線,通過讀總線來得知主設備發給從設備的信息;然後到了第9週期,按照協議規定從設備需要發送ACK給主設備,所以此時主設備必須釋放總線(主設備把總線置爲高電平然後不要動,其實就類似於總線空閒狀態),同時從設備試圖拉低總線發出ACK如果從設備拉低總線失敗,或者從設備根本就沒有拉低總線,則主設備看到的現象就是總線在第9週期仍然一直保持高,這對主設備來說,意味着我沒收到ACK,主設備就認爲剛纔給從設備發送的8字節不對(接收失敗)

二、S5PV210的I2C總線

1. I2C控制器

主從設備通信雙方本質上是通過時序在工作,但是時序會比較複雜不利於SoC軟件完成,於是乎解決方案是SoC內部內置了硬件的控制器來產生通信時序。這樣我們寫軟件時只需要向控制器的寄存器中寫入配置值即可,控制器會產生適當的時序在通信線上和對方通信。

在這裏插入圖片描述
(1)時鐘來源是PCLK_PSYS(65MHz),經過內部2級分頻最終得到I2C控制器的CLK。第一級分頻是I2CCON的bit6,可以得到一箇中間時鐘I2CCLK(等於PCLK/16或者PCLK/512);第二級分頻是得到最終I2C控制器工作的時鐘,以I2CCLK這個中間時鐘爲來源,分頻係數爲[1,16],因爲是4bit(相當於0~15加1)。最終要得到時鐘是2級分頻後的時鐘,譬如一個可用的設置是:65000KHz/512/4=31KHz通信中這個CLK會通過SCL線傳給從設備
(2)I2C總線控制邏輯(前臺代表是I2CCON、I2CSTAT這兩個寄存器),主要負責產生I2C通信時序。實際編程中要發送起始位、停止位、接收ACK等都是通過這兩個寄存器(背後所代表的電路模塊)實現的。
(3)移位寄存器(shift register),將代碼中要發送的字節數據,通過移位寄存器變成1個位一個位的丟給SDA線上去發送/接收
地址寄存器+比較器。本I2C控制器做從設備的時候用。
(4)I2CADD:用來寫自己的slave address。
(5)I2CDS:發送/接收的數據都放在這裏。

2. 總線通信流程

主設備收/發模式
在這裏插入圖片描述
在這裏插入圖片描述
這裏要補充一點:就是在發送8bit地址數據時,其實是7bit地址+1bit的方向。
舉個例子:
KXTE9的I2C地址固定爲0b0001111,I2C從設備地址本身是7位的,但是在I2C通信中發送I2C從設備地址時實際發送的是8位,這8位中高7位(bit7-bit1)對應I2C從設備的7位地址,最低一位(LSB)存放的是R/W信息(就是說下一個數據是主設備寫從設備讀(對應0),還是主設備讀從設備寫(對應1))。因此,對於KXTE9來說,主設備(SoC)發給gsensor信息時,SAD應該是:0b00011110(0x1E),而主設備讀取gsensor信息時,則應該是0b00011111(0x1F)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章