1. 程式人生 > 其它 >I2C(原創,禁止轉載)

I2C(原創,禁止轉載)

一、概述

1、I2C匯流排只有兩根雙向訊號線。一根是資料線SDA,另一根是時鐘線SCL。

SCL:上升沿將資料輸入到每個EEPROM器件中;下降沿驅動EEPROM器件輸出資料。(邊沿觸發)

SDA:雙向資料線,為OD門,與其它任意數量的OD與OC門成\線與\關係。

I2C匯流排通過上拉電阻接正電源。當匯流排空閒時,兩根線均為高電平(SDL=1;SCL=1)。連到總線上的任一器件輸出的低電平,都將使匯流排的訊號變低,即各器件的SDA及SCL都是線“與”關係。

2、主裝置與從裝置

系統中的所有外圍器件都具有一個7位的從器件專用地址碼,其中高4位為器件型別,由生產廠家制定,低3位為器件引腳定義地址,由使用者定義。

主控器件通過地址碼建立多機通訊的機制,因此I2C匯流排省去了外圍器件的片選線,這樣無論總線上掛接多少個器件,其系統仍然為簡約的二線結構。

終端掛載在總線上,有主端和從端之分,主端必須是帶有CPU的邏輯模組,在同一總線上同一時刻使能有一個主端,可以有多個從端,從端的數量受地址空間和匯流排的最大電容400pF的限制。

主端主要用來驅動SCL line; 從裝置對主裝置產生響應;

二者都可以傳輸資料,但是從裝置不能發起傳輸,且傳輸是受到主裝置控制的。

二、協議

1.空閒狀態

I2C匯流排匯流排的SDA和SCL兩條訊號線同時處於高電平時,規定為匯流排的空閒狀態。

此時各個器件的輸出級場效電晶體均處在截止狀態,即釋放匯流排,由兩條訊號線各自的上拉電阻把電平拉高。

2.起始位與停止位的定義

起始訊號:當SCL為高期間,SDA由高到低的跳變;啟動訊號是一種電平跳變時序訊號,而不是一個電平訊號。

停止訊號:當SCL為高期間,SDA由低到高的跳變;停止訊號也是一種電平跳變時序訊號,而不是一個電平訊號。

起始和終止訊號都是由主機發出的,在起始訊號產生後,匯流排就處於被佔用的狀態;在終止訊號產生後,匯流排就處於空閒狀態。

接收器件收到一個完整的資料位元組後,有可能需要完成一些其它工作,如處理內部中斷服務等,可能無法立刻接收下一個位元組,這時接收器件可以將SCL線拉成低電平,從而使主機處於等待狀態。

直到接收器件準備好接收下一個位元組時,再釋放SCL線使之為高電平,從而使資料傳送可以繼續進行。

3.ACK

傳送器每傳送一個位元組,就在時鐘脈衝9期間釋放資料線,由接收器反饋一個應答訊號。

應答訊號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該位元組;應答訊號為高電平時,規定為非應答位(NACK),一般表示接收器接收該位元組沒有成功。

對於反饋有效應答位ACK的要求是,接收器在第9個時鐘脈衝之前的低電平期間將SDA線拉低,並且確保在該時鐘的高電平期間為穩定的低電平。

如果接收器是主控器,則在它收到最後一個位元組後,傳送一個NACK訊號,以通知被控傳送器結束資料傳送,並釋放SDA線,以便主控接收器傳送一個停止訊號P。

4.資料的有效性:

I2C匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。

5.資料的傳送:

在I2C總線上傳送的每一位資料都有一個時鐘脈衝相對應(或同步控制),即在SCL序列時鐘的配合下,在SDA上逐位地序列傳送每一位資料。資料位的傳輸是邊沿觸發。

三、工作過程

總線上的所有通訊都是由主控器引發的。在一次通訊中,主控器與被控器總是在扮演著兩種不同的角色。

1.主裝置向從裝置傳送資料

主裝置傳送起始位,這會通知總線上的所有裝置傳輸開始了,接下來主機發送裝置地址,與這一地址匹配的slave將繼續這一傳輸過程,而其它slave將會忽略接下來的傳輸並等待下一次傳輸的開始。

主裝置定址到從裝置後,傳送它所要讀取或寫入的從裝置的內部暫存器地址; 之後,傳送資料。資料傳送完畢後,傳送停止位。

寫入過程如下:

  1. 傳送起始位

  2. 傳送從裝置的地址和讀/寫選擇位;釋放匯流排,等到EEPROM拉低匯流排進行應答;如果EEPROM接收成功,則進行應答;若沒有握手成功或者傳送的資料錯誤時EEPROM不產生應答,此時要求重發或者終止。

  3. 傳送想要寫入的內部暫存器地址;EEPROM對其發出應答

  4. 傳送資料

  5. 傳送停止位

EEPROM收到停止訊號後,進入到一個內部的寫入週期,大概需要10ms,此間任何操作都不會被EEPROM響應

2.主控器讀取資料的過程

讀的過程比較複雜,在從slave讀出資料前,你必須先要告訴它哪個內部暫存器是你想要讀取的,因此必須先對其進行寫入:

  1. 傳送起始位;

  2. 傳送slave地址+write bit set;

  3. 傳送內部暫存器地址;

  4. 重新發送起始位,即restart;

  5. 重新發送slave地址+readbit set;

  6. 讀取資料

  7. 傳送停止位

主機接收器在接收到最後一個位元組後,也不會發出ACK訊號。於是,從機發送器釋放 SDA線,以允許主機發出P訊號結束傳輸。

3、資料傳送格式

每一個位元組必須保證是8位長度。資料傳送時,先傳送最高位(MSB),每一個被傳送的位元組後面都必須跟隨一位應答位(即一幀共有9位)。

由於某種原因從機不對主機定址訊號應答時(如從機正在進行實時性的處理工作而無法接收總線上的資料),它必須將資料線置於高電平,而由主機產生一個終止訊號以結束匯流排的資料傳送。

如果從機對主機進行了應答,但在資料傳送一段時間後無法繼續接收更多的資料時,從機可以通過對無法接收的第一個資料位元組的“非應答”通知主機,主機則應發出終止訊號以結束資料的繼續傳送。

當主機接收資料時,它收到最後一個數據位元組後,必須向從機發出一個結束傳送的訊號。這個訊號是由對從機的“非應答”來實現的。然後,從機釋放SDA線,以允許主機產生終止訊號。

4、匯流排的定址

I2C匯流排協議有明確的規定:採用7位的定址位元組(定址位元組是起始訊號後的第一個位元組)。

(1)定址位元組的位定義

D7~D1位組成從機的地址。D0位是資料傳送方向位,為“0”時表示主機向從機寫資料,為“1”時表示主機由從機讀資料。

主機發送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,如果相同,則認為自己正被主機定址,根據R/位將自己確定為傳送器或接收器。

從機的地址由固定部分和可程式設計部分組成。在一個系統中可能希望接入多個相同的從機,從機地址中可程式設計部分決定了可接入匯流排該類器件的最大數目。

如一個從機的7位定址位有4位是固定位,3位是可程式設計位,這時僅能定址8個同樣的器件,即可以有8個同樣的器件接入到該I2C匯流排系統中。

(2)定址位元組中的特殊地址

固定地址編號0000和1111已被保留作為特殊用途。

起始訊號後的第一位元組的8位為“0000 0000”時,稱為通用呼叫地址。通用呼叫地址的用意在第二位元組中加以說明。格式為:

第二位元組為 06H(0110)時,所有能響應通用呼叫地址的從機器件復位,並由硬體裝入從機地址的可程式設計部分。能響應命令的從機器件復位時不拉低SDA和SCL線,以免堵塞匯流排。

第二位元組為 04H(0100)時,所有能響應通用呼叫地址並通過硬體來定義其可程式設計地址的從機器件將鎖定地址中的可程式設計位,但不進行復位。

如果第二位元組的方向位B為“1”,則這兩個位元組命令稱為硬體通用呼叫命令。 在這第二位元組的高7位說明自己的地址。接在總線上的智慧器件,如微控制器或其他微處理器能識別這個地址,並與之傳送資料。硬體主器件作為從機使用時,也用這個地址作為從機地址。格式為:

在系統中另一種選擇可能是系統復位時硬體主機器件工作在從機接收器方式,這時由系統中的主機先告訴硬體主機器件資料應送往的從機器件地址,當硬體主機器件要傳送資料時就可以直接向指定從機器件傳送資料了。

(3)起始位元組

起始位元組是提供給沒有I2C匯流排介面的微控制器查詢I2C匯流排時使用的特殊位元組。

不具備I2C匯流排介面的微控制器,則必須通過軟體不斷地檢測匯流排,以便及時地響應匯流排的請求。

微控制器的速度與硬體介面器件的速度就出現了較大的差別,為此,I2C總線上的資料傳送要由一個較長的起始過程加以引導。

引導過程由起始訊號、起始位元組、應答位、重複起始訊號(Sr)組成。

請求訪問匯流排的主機發出起始訊號後,傳送起始位元組(0000 0001),另一個微控制器可以用一個比較低的速率取樣SDA線,直到檢測到起始位元組中的7個“0”中的一個為止。

在檢測到SDA線上的高電平後,微控制器就可以用較高的取樣速率,以便尋找作為同步訊號使用的第二個起始訊號Sr。

在起始訊號後的應答時鐘脈衝僅僅是為了和匯流排所使用的格式一致,並不要求器件在這個脈衝期間作應答。