這幾天看到原子哥 STM32 的 IIC 了,打算認真紮實的把 IIC 好好學一學,鞏固加強一下。以前在學校也弄過,但很多地方了解的不夠深刻,做事,學知識,不能淺嘗辄止,而要紮紮實實,搞明白原理,不斷實踐,不斷總結,才能有所提高,有所得。後續計劃從51,STM32,iTop4412 額Linux下來實作 IIC 驅動,結合工作中的需求,從不同外設來實作。
1.IIC簡介:
IIC 即 Inter-Integrated Circuit(內建電路總線),這種總線類型是由飛利浦半導體公司在八十年代初設計出來的,主要是用來連接配接整體電路(ICS) ,IIC 是一種多向控制總線,也就是說多個晶片可以連接配接到同一總線結構下,同時每個晶片都可以作為實時資料傳輸的控制源。這種方式簡化了信号傳輸總線接口。
IIC 最初為音頻和視訊裝置開發,如今主要在伺服器管理中使用,其中包括單個元件狀态的通信。例如管理者可對各個元件進行查詢,以管理系統的配置或掌握元件的功能狀态,如電源和系統風扇。可随時監控記憶體、硬碟、網絡、系統溫度等多個參數,增加了系統的安全性,友善了管理。
IIC 的主要構成隻有兩個雙向的信号線,一個是資料線 SDA,一個是時鐘線 SCL。
2.IIC的 特點:
- 具有多機功能,該子產品既可以做主裝置也可以做為從裝置;
- IIC 主裝置功能,主要産生時鐘,産生起始信号和停止信号;
- IIC 從裝置功能,可程式設計的 IIC 位址檢測,每個電路和子產品都有唯一的位址,停止位檢測;
- 串行8位雙向資料,支援不同速率的通訊速度,标準速度(最高速度 100kHZ ),快速(最高 400kHZ ),和高速模式(3.4 Mbps);
- 連接配接到相同總線的IC 數量隻受到總線的最大電容 400pF 限制;
- 支援多主要子產品,但同一時刻隻允許有一個主要;
- SCL:上升沿将資料輸入到每個EEPROM器件中;下降沿驅動EEPROM器件輸出資料。(邊沿觸發);SDA:雙向資料線,為OD門,與其它任意數量的OD與OC門成”線與”關系。
- 總線的長度可高達25英尺(762cm),并且能夠以10Kbps的最大傳輸速率支援40個元件;
- IIC自動尋址、高低速裝置同步和仲裁等功能的高性能串行總線,為半雙工通信方式。
3.IO輸出結構

每一個I2C總線器件内部的 SDA、SCL 引腳電路結構都是一樣的,引腳的輸出驅動與輸入緩沖連在一起。其中輸出為漏極開路的場效應管,輸入緩沖為一隻高輸入阻抗的同相器,這種電路具有兩個特點:
(1)由于 SDA、SCL 為漏極開路結構(OD),隻能輸出“0”,不能輸出“1”,是以它們必須接有上拉電阻,阻值的大小常為 1k8, 4k7 and 10k ,但1k8 時性能最好;當總線空閑時,兩根線均為高電平。連到總線上的任一器件輸出的低電平,都将使總線的信号變低,即各器件的SDA及SCL都是線”與”關系。
(2)引腳在輸出信号的同時還将引腳上的電平進行檢測,檢測是否與剛才輸出一緻,為”時鐘同步”和”總線仲裁”提供了硬體基礎。
SCL線的時鐘同步:SCL由于具有線“與”的邏輯功能,即隻要有一個節點發送低電平時,總線上就表現為低電平。當所有的節點都發送高電平時,總線才能表現為高電平。正是由于線“與”邏輯功能的原理,當多個節點同時發送時鐘信号時,在總線上表現的是統一的時鐘信号。
SDA線的仲裁:SDA線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。節點在發送1位資料後,比較總線上所呈現的資料與自己發送的是否一緻。是,繼續發送;否則,退出競争。SDA線的仲裁可以保證I2C總線系統在多個主節點同時企圖控制總線時通信正常進行并且資料不丢失。總線系統通過仲裁隻允許一個主節點可以繼續占據總線。
4.IIC總線上器件的連接配接
系統中的所有外圍器件都具有一個7位的”從器件專用位址碼”,其中高4位為器件類型,由生産廠家制定,低3位為器件引腳定義位址,由使用者定義。
對于 10 位位址格式,必須發送兩個位元組。前五位用來指定采用的是 10 位位址格式,發送的第一個位元組中包括用于指定 10 位位址的 5 位以及位址的
兩個 MSb 和 1 個 R/W 位。第二個位元組是其餘的 8 位位址。
主要器件通過位址碼建立多機通信的機制,是以 I2C 總線省去了外圍器件的片選線,這樣無論總線上挂接多少個器件,其系統仍然為簡約的二線結構。終端挂載在總線上,有主端和從端之分,主端必須是帶有 CPU 的邏輯子產品,在同一總線上同一時刻使能有一個主端,可以有多個從端,從端的數量受位址空間和總線的最大電容 400pF 的限制。
當多個主機試圖去控制總線時,通過仲裁可以使得隻有一個主機獲得總線控制權,并且它傳輸的資訊不被破壞。
相關概念介紹:
名稱 | 解釋 |
主機 | 初始化發送,産生時鐘信号和終止發送的器件 |
從機 | 被主機尋址的器件 |
發送器 | 發送資料到總線的器件 |
接收器 | 從總線接收資料的器件 |
仲裁 | 一個在有多個主機同時嘗試控制總線,隻允許其中一個控制總線并使封包不被破壞 |
同步 | 兩個或多個器件同步時鐘信号的過程 |
資料格式說明:
格式 | 表示 |
無資料 | SCL=1,SDA=1 |
開始位(Start) | 當SCL=1時,SDA由1向0跳變 |
停止位(Stop) | 當SCL=1時,SDA由0向1跳變 |
資料位 | 當SCL由0向1跳變時,由發送方控制SDA,此時SDA為有效資料,不可随意改變SDA;當SCL保持為0時,SDA上的資料可随意改變; |
位址位 | 定義同資料位,但隻由Master發給Slave |
應答位(ACK) | 當發送方傳送完8位時,發送方釋放SDA,由接收方控制SDA,且SDA=0 |
非應答位(NACK) | 當發送方傳送完8位時,發送方釋放SDA,由接收方控制SDA,且SDA=1 |
單位元組傳送 | 開始位,8位位址位(含1位讀寫位),應答,8位資料,應答,停止位 |
一串位元組傳送 | 開始位,8位位址位(含1位讀寫位),應答,8位資料,應答,8位資料,應答,……,8位資料,應答,停止位 |
5.I2C協定
(1)空閑狀态
I2C總線總線的SDA和SCL**兩條信号線同時處于高電平時,規定為總線的空閑狀态。此時各個器件的輸出級場效應管均處在截止狀态,即釋放總線,由兩條信号線各自的上拉電阻把電平拉高。**
(2)起始信号與停止信号
起始信号:當SCL為高期間,SDA由高到低的跳變;啟動信号是一種電平跳變時序信号,而不是一個電平信号。
停止信号:當SCL為高期間,SDA由低到高的跳變;停止信号也是一種電平跳變時序信号,而不是一個電平信号。
(3)應答信号ACK
發送器每發送一個位元組,就在時鐘脈沖9期間釋放資料線,由接收器回報一個應答信号。 應答信号為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該位元組;應答信号為高電平時,規定為非應答位(NACK),一般表示接收器接收該位元組沒有成功。
對于回報有效應答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間将SDA線拉低,并且確定在該時鐘的高電平期間為穩定的低電平。 如果接收器是主要器,則在它收到最後一個位元組後,發送一個NACK信号,以通知被控發送器結束資料發送,并釋放SDA線,以便主要接收器發送一個停止信号P。
(4)資料有效性
I2C總線進行資料傳送時,時鐘信号為高電平期間,資料線上的資料必須保持穩定,隻有在時鐘線上的信号為低電平期間,資料線上的高電平或低電平狀态才允許變化。
即:資料在SCL的上升沿到來之前就需準備好。并在在下降沿到來之前必須穩定。
資料傳輸:先發送起始位,再發一個8bit資料:前7bit表示從位址,第8bit表示讀或者寫。0 write是處理器往IIC從裝置發,1 read是IIC從裝置往處理器發。第9個時鐘周期回複響應信号。
(5)資料的傳送
IIC 資料從最高位(MSB)開始傳輸,發送到SDA線上的資料必須是8位的,每一個被傳送的位元組後面都必須跟随一位應答位(即一幀共有9位),發送器發送完 LSB 之後,應當釋放 SDA 線(拉高 SDA,輸出半導體截止) ,以等待接收器産生應答位。在 IIC 總線上傳送的每一位資料都有一個時鐘脈沖相對應(或同步控制),即在SCL串行時鐘的配合下,在SDA上逐位地串行傳送每一位資料。資料位的傳輸是邊沿觸發。
典型時序:
完整的資料傳送:
eg:傳輸 1011 0110
應答位的時鐘脈沖仍由主機産生,而應答位的資料狀态則遵循“誰接收誰産生”的原則,即總是由接收器産生應答位。主機向從機發送資料時,應答位由從機産生;主機從從機接收資料時,應答位由主機産生。
在切換資料的傳輸方向時,可以不必先産生停止條件再開始下次傳輸,而是直接再一次産生開始條件。I2C 總線在已經處于忙的狀态下,再一次直接産生起始條件的情況被稱為重複起始條件。
6.讀寫資料過程
寫通訊過程:
1. 主要在檢測到總線空閑的狀況下,首先發送一個START信号掌管總線;
2. 發送一個位址位元組(包括7位位址碼和一位R/W);
3. 當被控器件檢測到主要發送的位址與自己的位址相同時發送一個應答信号(ACK);
4. 主要收到ACK後開始發送第一個資料位元組;
5. 被控器收到資料位元組後發送一個ACK表示繼續傳送資料,發送NACK表示傳送資料結束;
6. 主要發送完全部資料後,發送一個停止位STOP,結束整個通訊并且釋放總線;
當寫資料的時候,Master每發送完8個資料位,Slave裝置如果還有空間接受下一個位元組應該回答“ACK”,Slave裝置如果沒有空間接受更多的位元組應該回答“NACK”,Master當收到“NACK”或者一定時間之後沒收到任何資料将視為逾時,此時Master放棄資料傳送,發送“Stop”。
讀通訊過程:
1. 主要在檢測到總線空閑的狀況下,首先發送一個START信号掌管總線;
2. 發送一個位址位元組(包括7位位址碼和一位R/W);
3. 當被控器件檢測到主要發送的位址與自己的位址相同時發送一個應答信号(ACK);
4. 主要收到ACK後釋放資料總線,開始接收第一個資料位元組;
5. 主要收到資料後發送ACK表示繼續傳送資料,發送NACK表示傳送資料結束;
6. 主要發送完全部資料後,發送一個停止位STOP,結束整個通訊并且釋放總線;
當讀資料的時候,Slave 裝置每發送完 8 個資料位,如果 Master 希望繼續讀下一個位元組,Master 應該回答“ACK”以提示Slave準備下一個資料,如果Master不希望讀取更多位元組,Master應該回答“NACK”以提示Slave裝置準備接收Stop信号。
主要器向被控器發送的資訊種類有:啟動信号、停止信号、7位位址碼、讀/寫控制位、10位位址碼、資料位元組、重新開機動信号、應答信号、時鐘脈沖。
被控器向主要器發送的資訊種類有:應答信号、資料位元組、時鐘低電平。
注:SCL一直由Master控制,SDA依照資料傳送的方向,讀資料時由Slave控制SDA,寫資料時由Master控制SDA。當 8 位資料傳送完畢之後,應答位或者否應答位的SDA控制權與資料位傳送時相反。
注明:以上大部分資料均來自網絡總結,參考處注明。
參考:
1.I2C總線之(一)—概述
2.i2c總線(iic總線/ I square C)
3.PROTEUS仿真學習筆記04 (IIC 外設)——2014_7_8
4.IIC總線解析
5.關于I2C和SPI總線協定
6.IIC總線協定