前言
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。