再議IIC協議與設計【1】--通信是如何定義

概述

在討論IIC的時候,無需一頭扎進IIC協議中去分析文檔,根據以下的步驟來分析,就能很明確地知道IIC的協議,以及如何設計IIC主機或者從機。


初識IIC

在實際的電路設計中,兩個芯片(IC)需要互相通信,發生數據的交換。那麼這兩個芯片之間必須滿足一些規則,這樣,負責“聽”的芯片就能“聽懂”“說”的那個芯片“說了些什麼”。與人類交流原理相通,“聽者”首先需要知道“說者”是對哪個“聽者”發出命令,並且需要需要“說者”以“聽者”能聽的懂的語言來溝通交流(通信方式)。同時,“說者”說話的頻率不能太快,以保證“聽者”能清楚地知道所要表達的意思(通信頻率)。這些合在一起就構成了IIC的通訊協議。


圖1


那麼IIC到底是什麼呢?定義如下:IIC即Inter-Integrated Circuit,是由飛利浦半導體在上世紀八十年代設計出來的一種串行總線,主要是用來連接整體電路。在IIC剛設計出來的時候,因爲其簡單,雙向通信,二線制,同步設計等優點,迅速地成爲芯片間互聯的一個優勢選擇。在整個電路板上,可以使用一個IIC主控制器,其他的所有芯片,都掛在同一個IIC總線結構下。這樣就可以完成整個系統中所有的芯片的數據傳輸。最大的優點是簡化了信號傳輸的總線接口(2-wire)。同時,IIC的通信速度有兩種,一種爲普通模式下的100KHz,另一種爲高速模式下的400KHz.

圖2

在上圖2中,區分了IIC設備的主設備(Master)和從設備(Slave),無論Master還是Slave都具有一個地址Address,這個地址即爲設備的“標識符”。通過訪問設備的“標識符”就能與設備進行通訊。在具體的設計中,需要明確哪個是主設備(Master),即信號的發起者,哪個是從設備(Slave),即信號的接收者。所描述的“信號的發起者”或者“信號的接收者”,可以看成是那個器件在發出SCL信號。對於SDA來說,它是一個雙向的單bit信號,這就是IIC爲什麼是雙向通信的原因了。


Master與Slave進行通信,既要向Slave中“寫入”數據,也要從Slave中“讀取”數據。而無論讀入或者寫出的數據,都是一位一位地從SDA線上傳輸的。


通信過程

由上面的介紹可以知道,對於設備來說,它有一個“標識符”,即設備地址,一般的設備地址是7bit的,留出來一個bit來做“讀”或者“寫”的標誌。從設備接收到主機所發送的設備地址和讀寫標誌後,首先判斷設備地址是否爲自己的地址,如果地址匹配成功,其次纔開始響應讀寫標誌位。當從設備響應完成後,設備進入Ready狀態,準備接收主設備發送的後續數據。當主機發送完一個字節(8bit)的數據後,從機一般會返回一個響應(ACK)標誌,用來通知主機,接收成功。


詳細介紹

上面對通信過程進行介紹的時候,有幾個問題沒有解決:

  • 數據通信何時開始 / 何時結束
  • ACK信號怎樣表示 / NACK信號怎樣表示
  • ACK / NACK信號什麼時候存在

帶着以上的問題再重新回看IIC通信。SDA和SCL總線,在空閒不進行通信的時候,是處於高電平狀態,即SDA 和SCL都爲邏輯1。我們都知道,數據在傳輸的過程中,都是由時鐘的邊沿將數據送入到器件中。即芯片在時鐘邊沿對數據進行採樣的時候,必須要保證數據線穩定不變。在這裏需要保證在SCL爲高電平的時候,保持SDA穩定不變,這樣才能將數據穩定地送入到芯片中。所以我們可以將IIC總結如下:

  • SCL爲高,SDA發生變化,即爲發生了特殊狀態(ACK, NACK, START, STOP)
  • SCL爲地,SDA發生變化,即爲數據端發生跳變,這個是無影響的。
  • IIC總線在數據傳輸時,時鐘信號爲高電平,數據線上的數據必須保持穩定,只有在SCL上的信號爲低電平時,SDA線才允許變化

也只有這樣,才能在2-wire上完成這麼多的狀態對通信進行控制。

接下來,就詳細地描述這些狀態標誌,這是IIC通信協議的核心。


START和STOP信號

SCL爲高電平期間,SDA由高電平向低電平變化表示爲起始信號;

SCL爲高電平期間,SDA由低電平向高電平變化表示爲終止信號。


圖 3

起始信號和終止信號都是由主機發出的,在此時,從機僅處於空閒狀態。當起始信號產生後,總線就處被佔用的狀態;在終止信號產生後,總線又回到了空閒狀態(SCL = 1 SDA = 1).

接收器件分爲兩種,一種是內部集成了IIC控制器,另外一種是使用GPIO來模擬IIC控制器。無論哪種,主機在發送START後,會緊接着發送一個完整的數據字節,從機接收這個數據字節,但有可能從機在接收完成後,無法立即響應以接收下一個字節(從機可能在處理中斷等),這時候從機會將SCL線拉底到低電平,從而使主機處於等待狀態,直到從機準備好接收下一個字節,才釋放SCL使其回到高電平。


ACK和NACK信號

每一個完整的傳輸都必須保證是一個字節的傳輸(8bit),在傳輸過程中是由MSB到LSB進行傳輸的,每一個字節傳輸完成後都必須跟隨一位應答信號,即每一個完成的傳輸是9bit。


圖 4


需要注意的是,並非每一次字節傳輸完成後都會有ACK信號,有以下三種情況例外:

  • 當從機無法響應主機發送給從機的地址時(例如從機正忙,這個地址錯誤等)在第9個SCL週期內SDA沒有被拉低,即沒有ACK信號,這是主機會發送一個STOP標誌來終止信號的傳輸或者重新發出一個RESTART信號請求新的傳輸。
  • 如果從機接收器在傳輸過程中不能接收更多的數據時,它也不會發出ACK標誌,這樣主機在接收不到ACK標誌的時候就會發出一個STOP信號來終止傳輸或者重新發出一個RESTART信號來請求新的傳輸。
  • 主機接收器在接收到最後一個字節後,也不會發出ACK信號,於是從機釋放SDA線,以允許主機發送STOP信號來結束傳輸。

以上可以總結爲:對主機來說,它會不斷地檢測在SCL處於第9週期時SDA是否爲低,只要發現爲低,那麼主機在接下來就會發出STOP信號。


總線數據傳輸過程

常見的幾種數據傳輸

  • 主機向從機發送數據,數據傳輸方向在整個傳輸過程中不變化


圖 5

  • 主機在發送完從機地址後,立即從從機讀取數據


圖 6

  • 在傳輸過程中,當需要改變數據傳輸方向時,起始信號和從機地址都要重新發送一次


圖 7

至此,IIC最基本的協議就先介紹到這裏。


發佈了26 篇原創文章 · 獲贊 106 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章