- I2C 為 Inter-Integrated Circuit的縮寫,I2C Bus顧名思義就是IC之間溝通的匯流排
- I2C Bus為飛利浦(Philips)在1980年代所發展的雙向二線式的串列匯流排(Serial Bus)標準
- 資料線:Serial data line (SDA)
- 時脈線:Serial clock line (SCL)
- I2C Unit允許Processor透過I2C Bus來服務master和slave 裝置
- 資料在I2C Bus上可以用三種速度被傳送
- Standard-mode: 100 kbit/s
- Fast-mode: 400 kbit/s
- High-speed mode: 3.4 Mbit/s
- 相較傳統平行匯流排(Parallel Bus)
- 架構簡單,只需要二條線就能傳送資料,可靠度及安全性佳
- 省去平行匯流排所須的解碼電路
- 降低平行匯流排可能因接線太多而造成的電磁干擾和靜電放電的副作用
- 系統包含μC及其他周邊
- 希望將連接的成本降至最低
- 系統不需要很快的傳輸速度
- 希望應用於Multi-Master系統
- I2C Bus介面本身為Open Drain或是Open Collector構造,因此應用時需外加電源及提升電阻才能運作
I2C Bus功能說明
- I2C Bus定義一個由序列資料/位址線(SDA) 和序列時脈線(SCL)組成的序列協定給I2C Bus上的處理器來處理通過的資訊
- I2C Bus上的每個裝置是由一個獨特的7bits address來識別而且可以在master或slave模式下當成傳送端或接收端來操作
- for example
- 當Processor 在I2C Bus上作用為master時,它定址一個EEPROM為slave來接收資料。當Processor定址EEPROM時,它是一個master傳送端而EEPROM是一個slave接收端。當Processor讀取資料時,它是一個master接收端而EEPROM是一個slave傳送端。不管它是傳送端或是接收端,master會產生時脈信號,起始傳送,還有終止傳送。
- I2C Bus是一種同步傳輸協定,其資料傳送形態包含
- 開始(Start)
- 位址(Address)
- 讀/寫(R/nW)
- 資料(Data)
- 確認(Acknowledge)
- 停止(Stop)
- SDA若要變化,只有在SCL為低電位時才可以改變,而SCL在高電位時,其對應同時SDA的狀態(高電位或低電位)就是其傳送的位元(1 or 0)
- 開始(Start)
- Master必須送出”start”信號才能取得I2C Bus的控制權
- 當I2C Bus沒有動作時,SCL和SDA都保持在高電位
- I2C Bus動作時,master先在SDA送出低電位,經過一小段時間後,再將SCL變成低電位
- 停止(Stop)
- 和”start”信號的動作相反
- Master完成和slave的動作後,先將SCL釋放至高電位,經一小段時間在將SDA放至高電位
- 位址(Address)
- 每一個送到Bus上的資料都必須是8bit
- 以standard mode為例,Address有7個bit,master會先傳送MSB到Bus上,再依次傳出其他bit
- 讀/寫(R/nW)
- 緊接著Address,只佔一個bit 為LSB,高電位時為Read,低電位時為Write
- 確認(Acknowledge)
- Slave正確地收到資料後,會發出”ACK”信號向master表示收到
- Master會將SDA釋放成高電位,slave確認時會將SDA拉至低電位
- Slave未能正確地收到資料,slave則不動作,SDA會維持在高電位
- 資料(Data)
- 和Address及R/nW一樣,只不過資料可能由master或slave送出,由master或slave接收,而Address及R/nW則是由master送出,slave接收
- 資料的意義隨著裝置的不同而不同
I2C Bus的操作
- 簡單的溝通原理
- Uc要對memory寫入資料
- Uc發出start訊號告訴其他device它要動作了,接著發出”device address”(每個deivce都有一個唯一的address)和讀寫訊號
- Memory收到uc要它做讀寫動作,便發出ack告訴uc我收到了
- 然後uc傳送欲寫入的address(這裡是指memory address)給memroy
- Memory再發出ack給uc
- Uc再將欲寫入的資料送給memory
- 寫入完畢後,memroy又發出ack給uc
- 接著uc送出stop告訴bus上的所有device我的事做完了
- Master接收Slave傳送 / 重複START / Master傳送Slave接收
Multi-Master
- Single-Master: 只有一個μC發號施令,主控整個系統
- Multi-Master: 系統有二個以上的μC發號施令,其他的μC(slave)只能受主控的μC (master)控制,在不對外界送出命令時,master本身又可以變成slave
- 就是說有兩個以上的μC時,只有一個主控的master μc,其他的μc均當成slave
- Multi-master就只靠scl和sda這兩條線來完成,在兩條線上有很多個master傳送資料,那不是很容易發生衝突嗎? 靠著open collector (drain)的特性,scl和sda均可作wired_and動作,這些問題都可以解決。達成arbitration 和 synchronization的功能以確保bus正常運作。
- Multi-master功能需要I2C Bus arbitration(調停),當二或多個master在最短的停留時間產生START信號時調停將發生
- 使用wired-AND硬體線路,因此多個master發出同樣狀態的信號,傳輸不會遺失資料
- 假如包含的address和R/nW或是data不一樣時,master會發出高電位狀態來表示調停失敗並關閉它的SDA,然後回到slave模式
- 當兩個以上的master送出不同的位址時,低位址會擁有優先權
- 每個I2C Bus上的master為了在SCL上的資料傳輸會產生它自己的時脈
- 不同頻率的時脈連接到SCL,當時脈是在高電位期間時資料是有效的
- Master擁有最長的時脈週期者會將SCL維持在低電位
- 當兩個master發出的信號頻率不同時,SCL的頻率會以最低的為標準
- Service an internal interrupt
- If a slave can’treceive or transmit another complete byte of data until ithas performed some other function, for example servicing an internal interrupt, it can hold the clock line SCL LOW to force the master into a wait state. Data transfer then continues when the slave is ready for another byte of data and releases clock line SCL.
- Handshake
- The clock synchronization mechanism can be used to enable receivers to cope with fast data transfers, on either a byte level or a bit level. On the byte level, a device may be able to receive bytes of data at a fast rate, but needs more time to store a received byte or prepare another byte to be transmitted. Slaves can then hold the SCL line LOW after reception and acknowledgment of a byte to force the master into a wait state until the slave is ready for the next byte transfer in a type of handshake procedure.