漫談傳輸介面-I2C


前言

I2C,唸作"I-square-C",全名是Inter-Integrated Circuit Bus(IIC),用兩根訊號線就能達成SPI四根訊號線的Read/Write能力,這是怎麼辦到的呢?已經不是純邏輯而要用一些電子學的觀念了,(1)對於master或slave,IO已經不是純input或純output,是既能做input也能做output,(2)pull和drive影響訊號線上的電壓值,平時IDLE時master和slave都是把IO做成input使用pull-up電阻保持訊號線上的邏輯值為1,等需要變0時就把要變0的訊號做成output去drive成0,所以master和slave隨時都能對某根訊號線做drive 0的動作,多了這兩個特性才可以用兩根訊號線達到SPI用4根訊號線的能力。
有背景知識後就能來了解I2C怎麼運作的:


I2C簡介

1. INPUT/OUTPUT

不論master或slave,都是只有兩根訊號線,且都可以當input或output
SCL:
Clock訊號,主要由master提供,但Slave在busy時也可以drive low讓Clock rising edge不會產生,等ready了再放掉變成pull-up。
SDA:
Data訊號,看Write動作或Read動作,不同的時間點由master或slave某一方負責控制,只能在SCL為0時改變值,應用上可能是data或是address。
當SCL為1時還有變化則做為控制訊號,falling edge是START BIT,rising edge是STOP BIT,類似UART。

2. Clock

和SPI一樣,雖然已經有SCL這個訊號線了,但slave如果老實用CLK當作自己的clock通常會出事,通常還是要用比較高的頻率的clock輔助濾掉不必要的雜訊,因此slave也會規範最高能支援到多快。

3. Handshake

也是可以先理解有Write動作和Read動作,再來用這基本動作疊出應用上的意義。
為了方便理解,會畫出master和slave的各自的SCL和SDA,再加上並在一起的波形。

Write動作


一開始SCL為1時SDA下降,代表START,再來SCL下降為0時就可以準備bit 7 data,再來依序把剩下的bits打完,再來放開SDA控制權等slave發ACK(0)或NAK(1),如果應用上已經結束就造出一個STOP(SCL為1時SDA上升)。

Read動作


Read動作應用上通常是接著一個WRTIE動作(給WRITE address)或是一個READ動作(連續多byte的Read),所以不會有START BIT的需求,反倒是可能準備data所以會先將SCL設0,等data ready才放開SCL,當8 bits data傳完就放開SDA看master的ACK/NAK,如果master不想再讀下一個byte則可以做出個STOP BIT。

簡單應用

有了Write動作、Read動作就可以做應用了,像是一個I2C master要讀I2C device的內容,就先發一個Write動作給起始address,接下來I2C device就持續用Read動作吐出data。
當然也可以I2C master先用一個Wrtie動作下command,再一個Write動作下address,再來看Command要讀還是寫就由slave或master提供data。


總算把三大Serial interface講完了,接下來先來講PCI好了,雖然看不到了但沒基本認識無法理解PCIe。

#I2C







你可能感興趣的文章

Python 基礎概念

Python 基礎概念

[css] 網頁字型渲染的優化

[css] 網頁字型渲染的優化

[ Nuxt.js 2.x 系列文章 ] VueX Store 搭配 vuex-persistedstate 狀態保存工具

[ Nuxt.js 2.x 系列文章 ] VueX Store 搭配 vuex-persistedstate 狀態保存工具






留言討論