I2C通訊原理介紹

前言

I2C通訊是常見嵌入式系統通訊的一種方式,像是一般我們創克在使用時候,連接某些感測器,他們要求的通訊,就是I2C通訊,就要採用這樣的通訊方式進行傳輸。

I2C通訊現在是由NXP這家公司matain,可以去查查看這個規格操作手冊。

什麼是I2C通訊呢?

他是由兩條線索構成,它的傳輸會透過這兩條線,一條是SCL,另一條是SDA,就是透過這兩條線組成訊號進行傳輸。

雖然只有這兩條線,但是他的組合是非常多,就可以透過這種方式傳輸非常多種的訊號。

SCL代表是clock時鐘訊號,SDA則是傳輸的資料訊號,SCL訊號的變化可以表示SDA傳輸資料是什麼意思。

I2C通訊架構設定

I2C他是要先區分master跟slave,主從架構,他可以有多個slave的傳輸,I2C的通訊主要是從master發送至slave。

在master與slave之間,會有pull up的電路,才能讓I2C通訊有0,1之間的變化。所謂的pull up電路,指的就是在master與slave之間有pull up的電阻,在pull up電阻上方會有Vcc的供電。我們以一般master為MCU,slave為感測器為例,MCU會接SDA與SCL的連接線,這時候在韌體設置上,MCU要採用open drain的方式,open drain指的是有別與一般常用的GPIO控制是push pull的方式。open drain是要靠外部電阻,才能讓訊號從1變0或0變1。就是透過這種方式才可以讓SDA與SCL訊號產生0與1的邏輯訊號。這時因為嵌入式電子裝置,也都是以0與1的邏輯訊號運作,所以如果是輸入訊號像是3.2的數值,對機器而言,還要額外去做轉換,才能讓機器理解。 

這邊要注意的是,因為是透過pull up電路產生0~1訊號,所以在實作上要確保I2C電壓要有一定的數值,才能運作通訊,有時候在開發過程中,發現電壓不足,就會一直導致通訊失敗,這樣就是硬體電路的問題,要再做修改。

I2C通訊協定

I2C在通訊時,一定要給定slave的地址,他們要認地址才確定有沒有通訊成功,所以是一個相對嚴謹的通訊方式。

下面是I2C通訊的訊號結構,通訊一開始會有start,之後會傳輸slave地址,要指定R/W bit是讀寫,指的是這次要做的操作是讀取還是寫入,然後slave要回傳有沒有接收到,如果有,就要傳送ACK,代表slave有接收到訊息,這時候就可以傳遞內容,在後面部分就可以傳遞傳輸的資料Data,傳完之後一樣要給slave應答資料ACK,然後在給停止訊號。

開始訊號跟停止訊號怎麼敲的呢?

在SCL是高位的時候,SDA從高到低,代表起始訊號。

在SCL是高位的時候,SDA從低到高,代表終止訊號。

Slave address

7-bit地址

代表slave的地址,只有7個bit,傳輸都是1個byte為基準,也就是8bits去進行傳輸。所以在7bit後面會接一個read/write的指令,表示這次的操作是讀或是寫,這樣就可以變成是8bit進行傳輸。

10-bit地址

這就代表slave地址總共有10bits,會分成有兩個byte傳輸,前面8bit,會先由11110組成,後面兩位是10bits地址的最前面兩位,然後尾巴是read/write bit,剩下來的8bit地址就會放到第二個byte來進行傳輸。

ACK與NACK訊號

ACK訊號就是來自於slave的傳輸,slave要回應他有沒有接收到,要傳送ack訊號的時候,master就會把SDA釋放,讓slave去拉動,這時候slave就會把SDA拉低,然後此時SCL在高位的位置,這就是代表ACK的訊號。

當SDA持續在低位,SCL在高位,就是NACK的訊號,這時候master可以決定要傳送stop條件或是repeated start。

Data資料 

data的部分就是待傳輸的資料,像是如果是控制slave的暫存器,這時候data就是要對slave下的command,或是如果要從slave讀取資料,那data就是接收來自slave傳遞的資料。

結論

本篇文章簡單介紹I2C通訊,介紹初步的概念,之後就可以基於這個概念去延伸。

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *