I2C總線:軟件開發需要了解的知識

綜述

I2C總線是一種非常基本和常用的總線接口。

不僅如此,還有非常多基於I2C的總線接口,比如SMBus,IPMI,PMBus等。

I2C總線在物理上由兩根線構成,一根數據線,一根時鐘線。

I2C總線連接的設備有微處理器,LCD,LED,GPIO,EEPROM,RTC,AD/DA轉換器等等,下面是一個例子:

還有更復雜的例子,I2C還可以通過Switch等進行擴展:

一般系統中可以有一個或多個I2C控制器,多個I2C控制器就可以擴展出多條I2C總線,不同總線間互不干擾。

I2C總線上的設備分爲主從兩種類型,主設備是主動發起I2C業務的那個設備,I2C請求的方式是主設備發起數據傳輸並激活時鐘信號來允許這次數據傳輸。

每個I2C設備都有一個唯一的地址(相對於該總線,因爲I2C總線在一個系統中可以有多條),主設備通過I2C地址訪問從設備。

主從設備並不固定,有些設備可以做主設備也可以做從設備,當然有的設備只能選擇其一。

I2C總線也支持多主設備,即多個設備可以同時發起I2C業務。

多主設備存在的情況下,依賴於時鐘同步和仲裁來確定此時此刻誰能夠獲取I2C的控制權。

 

I2C總線協議

I2C總線協議規定了如下的內容:

所以I2C業務的開始和結束都有數據線和時鐘線的規範:

業務起始時時鐘線拉高,數據線下降沿。

業務結束時時鐘線拉高,數據線上升沿。

中間是數據的傳輸。

數據傳輸時,時鐘信號固定頻率高低電平切換,高電平時獲取到的數據線電平表示實際的1(高電平)和0(低電平),數據線在時鐘拉低時可以變化數據:

一次數據傳輸包含8個比特,之後接一個ACK位,發送者釋放數據線,等待接收者拉低數據線,表示接收者已經成功接收數據,發送者可以接着傳送數據。

如果數據線沒有被拉低而是一直保持高,表示NACK,有可能是以下情況中的一種:

  1. 沒有數據的接收者;
  2. 接收者正忙;
  3. 接收者收到無法識別的數據或命令;
  4. 接收者沒有收到足夠的數據;
  5. 主設備是接收者時需要發送NACK給從設備發送者;

在多主設備同時使用I2C總線時,需要依賴於時鐘同步和仲裁,具體不介紹。

設備訪問涉及到地址,需要注意地址也是在數據線上傳輸的,它跟在業務起始信號之後。

I2C地址有7位和10位兩種情況,需要注意的是前面提到過I2C上一次數據的收發是8個字節,所以7位地址信號的傳輸需要1個字節,10位地址信號的傳輸需要2個字節。

緊跟地址之後是讀寫位,表示主設備的操作方向。下面是7位地址的例子:

下面是10位地址的例子:

下面是一次完整的數據傳輸:

某些I2C地址是保留的,它們有特殊的用途,如下所示:

其中的general call address表示發送給I2C總線上的所有設備。

如果這些設備不需要數據,則不發送ACK信號,否則就發送ACK並作爲從設備。

如果在發送general call之後,接着發送一個06h,表示軟復位I2C總線上的設備(有些設備沒有這個功能,那就不需要復位)。

Device ID用來獲取I2C設備信息,具體格式如下:

 

總線速度

I2C數據傳輸的速度,在默認情況下是100kbit/s,後續可以設置成不同的值:

通常情況下I2C的速度相比CPU來說非常的慢,即使是以它的最大速度來講。

並且有時因爲硬件信號上的原因,如果設置的速度較高,會導致數據傳輸異常。

 

I2C總線在硬件平臺上的實現

I2C總線就是兩根線。

通常情況下,系統中一般有默認的I2C控制器,軟件需要操作的是控制器寄存器。

另外,還可以通過GPIO來模擬I2C,此時就需要軟件通過GPIO來操作相關的電平,以實現I2C總線功能。

以Intel型號爲Z370的PCH爲例,其中包含如下的I2C控制器:

從這裏也可以看到它們是跟GPIO複用的,所以也可以配置成GPIO,然後自己來實現I2C,不過似乎也沒有特別的必要。

目前沒有可以參看的I2C控制器的寄存器說明,所以具體軟件操作方式省略。

 

可視化I2C傳輸

I2C的傳輸速度很慢,所以很方便可以通過外部的工具來查看具體的數據傳輸。

比如將示波器接在數據和時鐘線上,即可以查看所有的數據。

此外,還有專門的工具來連接到I2C總線上,然後另一端接在電腦上,通過電腦上的工具來讀取I2C業務,比如如下的工具:

使用這樣的工具可以很方便的定位I2C總線相關的問題。

 

參考

《I2C-bus specification and user manual.pdf》

《200-series-chipset-pch-datasheet-vol-1.pdf》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章