IIC知識整理以及ADS1115

ba_wang_mao發表於2020-11-24

什麼是IIC?

IIC (Inter-Integrated Circuit), 通常發音為: I-squared-C,是多主、多從、分組交換、單工的序列匯流排,通常用於處理器或微控制器與低速外圍器件的短距離通訊連線。這個通訊協議是由(NXP半導體的前生)飛利浦公司發明,並在2006年開始,I2C協議的實施不要許可費,但仍要收取I2C從機分配地址的費用。
來自:wiki

IIC的特性如下

  1. 僅用兩線連線;
  2. 不像RS232那樣有著嚴格的波特率要求,而是由主裝置(mater)產生時鐘訊號;
  3. 裝置之間的主/從關係簡單,每個裝置都有軟體給予的唯一地址;
  4. IIC是一個真正的多主匯流排,提供仲裁和衝突檢測的功能。

來自: I2C-BUS.COM

IIC 的發展歷史

時間事件
1982年最初的100KHz I2C系統產生,其作為內部匯流排系統用於建立帶各種飛利浦晶片的控制電路。
1992年I2C的首個標準版本1.0出現,加入400KHz的(Fast-mode)快速模式;引入10bits的地址,使得系統能夠容納多達1008個節點。
1998年版本2.0加入3.4MHz的高速模式(High-speed mode)以及滿足系統在電壓和電流方面的節能需求。
2000年版本2.1基於版本2 引入一個小清理。
2007年版本3 加入1 Mhz 快速+模式(Fast-mode plus)。
2012年版本4 加入5 MHz的極快模式(Ultra Fast-mode),這種模式的資料線和時鐘線使用推輓輸出來替代上拉電阻,並加入了輔助分配Id表。此模式只能用於單向匯流排。
2012年版本5 修正了一些錯誤。
2014年版本6 修正了兩幅圖。

來自:wiki


物理(電氣)特性

IIC物理層的連線結構十分簡單,訊號的傳輸僅需2根線(裝置之間隔離)便能實現,分別是通訊時鐘線(SCL)和資料線(SDA),SCL作為時鐘線進行時鐘同步,SDA作為資料傳輸線路,由於只有一條,這決定了IIC通訊是單工的。一般無隔離的情況下,由於共地還需引入一條地線。

 

圖1 Fast/standard 模式下的裝置連線

 

圖1 Fast/standard 模式下的裝置連線

 

通常,I2C通訊裝置之間只通過普通導線進行連線,位元流訊號採用TTL/CMOS標準下的高/低電平來表示1/0訊號,這一方式使得傳輸距離很短(本來設計目的就是用於短距離通訊),直接連線的傳輸距離短達40cm,提升通訊距離則需使用P82B715一類的中繼器或者改用其它通訊協議與裝置。


匯流排通訊協議

IIC是多主的匯流排協議。匯流排的時鐘訊號(SCL)是由主裝置提供,因此同一時間一條匯流排中只能存在一個主裝置,先不考慮多主情況下的匯流排仲裁競爭,只考慮主裝置確定的通訊規則。

圖2 7位地址模式下資料傳輸電平

 

圖2 7位地址模式下資料傳輸電平

 

以7位地址主從IIC傳輸為例

IIC傳輸資料的模式模式為:
[ 開始 +(7位地址+1位讀寫+1位ACK)+(8位資料+1位ACK)*n+停止 ]
在傳輸過程中,每傳輸8位後,要通過一個ACK位進行相互確認。

 

— 接下來,將具體介紹協議

 

一位訊號資料傳遞模式

 

圖3 傳遞一位資料的流程

 

圖3 傳遞一位資料


IIC協議通過資料線SDA在SCL的配合下實現資訊的有效傳送。每條線均可產生5V/0V或3.3V/0V的高低電平(也可以是其它方式,常用TTL和CMOS的電平模式),如圖3所示,每當時鐘線SCL產生高電平時,SDA所產生的電平訊號為當前時鐘週期下傳輸的有效訊號;而當SCL為低電平時,SDA可改變,以產生下一週期的傳輸訊號。
PS: 個人認為當SCL產生上升沿後,對方裝置開始檢測SDA的電平,以此作為當前傳輸的資料,而下降沿是作為SDA資訊可調整的訊號,在之後就能進行SDA的電平調整。

 

開始和結束條件

 

這裡寫圖片描述

 

 

圖4 開始和結束電平分析


I2C匯流排在待機狀態時,SDA和SCL都處於高電平(兩根線一般情況均接上拉電阻)。

 

  • 當開始工作時,開始訊號由主裝置(master)發起,SDA先由高電平轉為低電平,此時的SCL是高電平。此後,SDA和SCL便配合傳輸開始工作。

 

  • 當停止工作時,在SCL處於高電平下,SDA由低電平轉為高電平。

 

第一個byte (7位地址+1位讀寫+1位ACK)

 

這裡寫圖片描述


第一個位元組,共8位,前7位數可以大多數作為從機(slave)的地址,而某些數位是作為其他功能標誌,本文不進行深究。7位從機地址之後的是讀寫位,如果為高電平,則是從從裝置中獲取資料,反之 0 則是向從裝置寫入資料,這將會影響下一個位元組的操作。8位資料之後是一個ACK位的響應操作,主裝置會將SDA置於高電平,等待從裝置響應(由於是上拉電阻,一端置低取低),從裝置置低,主裝置就獲得響應,然後就可進行下一位元組的操作。
注意:有時採用無響應的方式,這取決於從裝置的模式,為了通訊的可靠性,建議採用有響應的方式。

 

Write(寫)操作(8位資料+1位ACK)

這是寫操作,ACK位均是從從裝置向主裝置傳送的。

這裡寫圖片描述

Read(讀)操作(8位資料+1位ACK)

主裝置每次傳送8位資料完畢後,主裝置會返回一個ACK值(低電平)以響應已獲得資料。

這裡寫圖片描述


操作例項

接下來將用IIC獲取ADS1115晶片的電壓值。

SLAVE地址
由於模組addr pin是懸空的,參考表5應該和Ground同一個地址,為SLAVE ADDRESS:1001000。

這裡寫圖片描述

 

Pointer 暫存器

這裡寫圖片描述

這個暫存器具有指向下一個暫存器的作用,類似索引,通過向該暫存器寫入不同的資料,就可指向相應的暫存器,接下來就可以對該暫存器進行操作。

以指向config暫存器操作為例:

  • 對暫存器config進行寫操作
    Start+地址+寫+ACK*+0000 0001+ACK*+Config_H+ACK*+Config_L+NACK*/ACK*+End

  • 對暫存器config進行讀操作
    Start+地址+寫+ACK*+0000 0001+NACK*/ACK*+End
    ReStart+地址+讀+ACK*+Config_H*+ACK+Config_L*+NACK+End
    注:帶*表示從裝置向主裝置傳送。

pointer暫存器中只有BIT1、BIT0有效,指向地址見表6如下:

這裡寫圖片描述

 

CONFIG 暫存器

這裡寫圖片描述
這裡寫圖片描述

 

Lo_thresh and Hi_thresh 暫存器

 

這裡寫圖片描述

 

上下限,暫存器中的是帶符號的補碼(負數 取反加1)
預設:
補碼:8000 H~7FFF H
原碼:(-2^15)~(2^15-1)

CONVERSION暫存器
該暫存器存著轉換得到的AD值。
例如:
這裡寫圖片描述

操作流程

  1. 設定 Lo_thresh 和 Hi_thresh 暫存器
    對 Lo_thresh 寫操作
    Start+地址+寫+ACK*+00000010+ACK*
    +Lo_thresh_H+ACK*+Lo_thresh_L+NACK*/ACK*+End
    對 Hi_thresh 寫操作
    Start+地址+寫+ACK*+00000011+ACK*
    +Hi_thresh_H+ACK*+Hi_thresh_L+NACK*/ACK*+End
  2. 設定CONFIG 暫存器
    Start+地址+寫+ACK*+0000 0001+ACK*+Config_H+ACK*+Config_L+NACK*/ACK*+End
  3. 讀取Conversion register
    Start+地址+寫+ACK*+0000 0000+NACK*/ACK*+End
    ReStart+地址+讀+ACK*+Conversion_H*+ACK+Conversion_L*+NACK+End
  4. 轉換

參考

[1] Semiconductor P. The i2c-bus specification[J]. 2000.
[2] ADS1115 datasheet
[3] wiki

(6條訊息) IIC知識整理以及ADS1115_Line的專欄-CSDN部落格

相關文章