1. 程式人生 > >STM32之I2C原理

STM32之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由低到高的跳變;停止訊號也是一種電平跳變時序訊號,而不是一個電平訊號。

i2c匯流排協議的工作原理詳解

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

  接收器件收到一個完整的資料位元組後,有可能需要完成一些其它工作,如處理內部中斷服務等,可能無法立刻接收下一個位元組,這時接收器件可以將SCL線拉成低電平,從而使主機處於等待狀態。直到接收器件準備好接收下一個位元組時,再釋放SCL線使之為高電平,從而使資料傳送可以繼續進行。

  3.ACK

  傳送器每傳送一個位元組,就在時鐘脈衝9期間釋放資料線,由接收器反饋一個應答訊號。 應答訊號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該位元組;應答訊號為高電平時,規定為非應答位(NACK),一般表示接收器接收該位元組沒有成功。 對於反饋有效應答位ACK的要求是,接收器在第9個時鐘脈衝之前的低電平期間將SDA線拉低,並且確保在該時鐘的高電平期間為穩定的低電平。 如果接收器是主控器,則在它收到最後一個位元組後,傳送一個NACK訊號,以通知被控傳送器結束資料傳送,並釋放SDA線,以便主控接收器傳送一個停止訊號P。

i2c匯流排協議的工作原理詳解

  如下圖邏輯分析儀的取樣結果:釋放匯流排後,如果沒有應答訊號,sda應該一直持續為高電平,但是如圖中藍色虛線部分所示,它被拉低為低電平,證明收到了應答訊號。 這裡面給我們的兩個資訊是:1)接收器在SCL的上升沿到來之前的低電平期間拉低SDA;2)應答訊號一直保持到SCL的下降沿結束;正如前文紅色標識所指出的那樣。

i2c匯流排協議的工作原理詳解

  4.資料的有效性:

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

i2c匯流排協議的工作原理詳解

  5.資料的傳送:

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

  工作過程

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

  1.主裝置向從裝置傳送資料 主裝置傳送起始位,這會通知總線上的所有裝置傳輸開始了,接下來主機發送裝置地址,與這一地址匹配的slave將繼續這一傳輸過程,而其它slave將會忽略接下來的傳輸並等待下一次傳輸的開始。主裝置定址到從裝置後,傳送它所要讀取或寫入的從裝置的內部暫存器地址; 之後,傳送資料。資料傳送完畢後,傳送停止位。(這段看不懂就別看了,沒什麼用)

  寫入過程如下: 傳送起始位

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

  2)傳送想要寫入的內部暫存器地址;EEPROM對其發出應答; 3)傳送資料 4)傳送停止位。

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

i2c匯流排協議的工作原理詳解

  詳細:

i2c匯流排協議的工作原理詳解

  需要說明的是:①主控器通過傳送地址碼與對應的被控器建立了通訊關係,而掛接在總線上的其它被控器雖然同時也收到了地址碼,但因為與其自身的地址不相符合,因此提前退出與主控器的通訊;

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

  讀的過程比較複雜,在從slave讀出資料前,你必須先要告訴它哪個內部暫存器是你想要讀取的,因此必須先對其進行寫入(dummy write): 1)傳送起始位;

  2)傳送slave地址+write bit set; 3)傳送內部暫存器地址;

  4)重新發送起始位,即restart; 5)重新發送slave地址+read bit set; 6)讀取資料

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

i2c匯流排協議的工作原理詳解

  詳細:

i2c匯流排協議的工作原理詳解

  2、資料傳送格式 (1)位元組傳送與應答

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

i2c匯流排協議的工作原理詳解

  由於某種原因從機不對主機定址訊號應答時(如從機正在進行實時性的處理工作而無法

  接收總線上的資料),它必須將資料線置於高電平,而由主機產生一個終止訊號以結束匯流排的資料傳送。

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

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

  (2)資料幀格式

  I2C總線上傳送的資料訊號是廣義的,既包括地址訊號,又包括真正的資料訊號。 在起始訊號後必須傳送一個從機的地址(7位),第8位是資料的傳送方向位(R/),用“0”表示主機發送資料(T),“1”表示主機接收資料(R)。每次資料傳送總是由主機產生的終止訊號結束。但是,若主機希望繼續佔用匯流排進行新的資料傳送,則可以不產生終止訊號,馬上再次發出起始訊號對另一從機進行定址。

  在匯流排的一次資料傳送過程中,可以有以下幾種組合方式:

  a、主機向從機發送資料,資料傳送方向在整個傳送過程中不變:

i2c匯流排協議的工作原理詳解

  注:有陰影部分表示資料由主機向從機傳送,無陰影部分則表示資料由從機向主機傳送。 A表示應答, 表示非應答(高電平)。S表示起始訊號,P表示終止訊號。

i2c匯流排協議的工作原理詳解

  b、主機在第一個位元組後,立即由從機讀資料

i2c匯流排協議的工作原理詳解

  c、在傳送過程中,當需要改變傳送方向時,起始訊號和從機地址都被重複產生一次,但兩次讀/寫方向位正好反相。

  6、匯流排的定址

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

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

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

i2c匯流排協議的工作原理詳解

  主機發送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,如果相同,

  則認為自己正被主機定址,根據R/位將自己確定為傳送器或接收器。 從機的地址由固定部分和可程式設計部分組成。在一個系統中可能希望接入多個相同的從機,從機地址中可程式設計部分決定了可接入匯流排該類器件的最大數目。如一個從機的7位定址位有4位是固定位,3位是可程式設計位,這時僅能定址8個同樣的器件,即可以有8個同樣的器件接入到該I2C匯流排系統中。

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

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

i2c匯流排協議的工作原理詳解

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

i2c匯流排協議的工作原理詳解

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

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

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

i2c匯流排協議的工作原理詳解

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

  (3)起始位元組

  起始位元組是提供給沒有I2C匯流排介面的微控制器查詢I2C匯流排時使用的特殊位元組。 不具備I2C匯流排介面的微控制器,則必須通過軟體不斷地檢測匯流排,以便及時地響應匯流排的請求。微控制器的速度與硬體介面器件的速度就出現了較大的差別,為此,I2C總線上的資料傳送要由一個較長的起始過程加以引導。

i2c匯流排協議的工作原理詳解

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

  請求訪問匯流排的主機發出起始訊號後,傳送起始位元組(0000 0001),另一個微控制器可以用一個比較低的速率取樣SDA線,直到檢測到起始位元組中的7個“0”中的一個為止。在檢測到SDA線上的高電平後,微控制器就可以用較高的取樣速率,以便尋找作為同步訊號使用的第二個起始訊號Sr。

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

  匯流排資料傳送的模擬

i2c匯流排協議的工作原理詳解


  工作過程

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

  1.主裝置向從裝置傳送資料 主裝置傳送起始位,這會通知總線上的所有裝置傳輸開始了,接下來主機發送裝置地址,與這一地址匹配的slave將繼續這一傳輸過程,而其它slave將會忽略接下來的傳輸並等待下一次傳輸的開始。主裝置定址到從裝置後,傳送它所要讀取或寫入的從裝置的內部暫存器地址; 之後,傳送資料。資料傳送完畢後,傳送停止位。(這段看不懂就別看了,沒什麼用)

  寫入過程如下: 傳送起始位

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

  2)傳送想要寫入的內部暫存器地址;EEPROM對其發出應答; 3)傳送資料 4)傳送停止位。

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

i2c匯流排協議的工作原理詳解

  詳細:

i2c匯流排協議的工作原理詳解

  需要說明的是:①主控器通過傳送地址碼與對應的被控器建立了通訊關係,而掛接在總線上的其它被控器雖然同時也收到了地址碼,但因為與其自身的地址不相符合,因此提前退出與主控器的通訊;

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

  讀的過程比較複雜,在從slave讀出資料前,你必須先要告訴它哪個內部暫存器是你想要讀取的,因此必須先對其進行寫入(dummy write): 1)傳送起始位;

  2)傳送slave地址+write bit set; 3)傳送內部暫存器地址;

  4)重新發送起始位,即restart; 5)重新發送slave地址+read bit set; 6)讀取資料

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

i2c匯流排協議的工作原理詳解

  詳細:

i2c匯流排協議的工作原理詳解

  2、資料傳送格式 (1)位元組傳送與應答

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

i2c匯流排協議的工作原理詳解

  由於某種原因從機不對主機定址訊號應答時(如從機正在進行實時性的處理工作而無法

  接收總線上的資料),它必須將資料線置於高電平,而由主機產生一個終止訊號以結束匯流排的資料傳送。

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

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

  (2)資料幀格式

  I2C總線上傳送的資料訊號是廣義的,既包括地址訊號,又包括真正的資料訊號。 在起始訊號後必須傳送一個從機的地址(7位),第8位是資料的傳送方向位(R/),用“0”表示主機發送資料(T),“1”表示主機接收資料(R)。每次資料傳送總是由主機產生的終止訊號結束。但是,若主機希望繼續佔用匯流排進行新的資料傳送,則可以不產生終止訊號,馬上再次發出起始訊號對另一從機進行定址。

  在匯流排的一次資料傳送過程中,可以有以下幾種組合方式:

  a、主機向從機發送資料,資料傳送方向在整個傳送過程中不變:

i2c匯流排協議的工作原理詳解

  注:有陰影部分表示資料由主機向從機傳送,無陰影部分則表示資料由從機向主機傳送。 A表示應答, 表示非應答(高電平)。S表示起始訊號,P表示終止訊號。

i2c匯流排協議的工作原理詳解

  b、主機在第一個位元組後,立即由從機讀資料

i2c匯流排協議的工作原理詳解

  c、在傳送過程中,當需要改變傳送方向時,起始訊號和從機地址都被重複產生一次,但兩次讀/寫方向位正好反相。

  6、匯流排的定址

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

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

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

i2c匯流排協議的工作原理詳解

  主機發送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,如果相同,

  則認為自己正被主機定址,根據R/位將自己確定為傳送器或接收器。 從機的地址由固定部分和可程式設計部分組成。在一個系統中可能希望接入多個相同的從機,從機地址中可程式設計部分決定了可接入匯流排該類器件的最大數目。如一個從機的7位定址位有4位是固定位,3位是可程式設計位,這時僅能定址8個同樣的器件,即可以有8個同樣的器件接入到該I2C匯流排系統中。

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

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

i2c匯流排協議的工作原理詳解

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

i2c匯流排協議的工作原理詳解

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

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

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

i2c匯流排協議的工作原理詳解

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

  (3)起始位元組

  起始位元組是提供給沒有I2C匯流排介面的微控制器查詢I2C匯流排時使用的特殊位元組。 不具備I2C匯流排介面的微控制器,則必須通過軟體不斷地檢測匯流排,以便及時地響應匯流排的請求。微控制器的速度與硬體介面器件的速度就出現了較大的差別,為此,I2C總線上的資料傳送要由一個較長的起始過程加以引導。

i2c匯流排協議的工作原理詳解

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

  請求訪問匯流排的主機發出起始訊號後,傳送起始位元組(0000 0001),另一個微控制器可以用一個比較低的速率取樣SDA線,直到檢測到起始位元組中的7個“0”中的一個為止。在檢測到SDA線上的高電平後,微控制器就可以用較高的取樣速率,以便尋找作為同步訊號使用的第二個起始訊號Sr。

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

  匯流排資料傳送的模擬

i2c匯流排協議的工作原理詳解