概述
IIC總線使用兩條串行線路傳輸數據
SDA :串行數據線
SCL :串行時鐘
- 傳輸模式爲半雙工傳輸
- 是一個多主機總線,如果兩個或多個主機同時初始化數據傳輸,可以通過沖突檢測和仲裁防止數據破壞
- 每個連接到總線上的器件都有唯一的地址,數據傳輸和地址設定由軟件設定
- 傳輸時鐘由主機產生
總線空閒狀態 :
SDA :高電平
SCL :高電平
時序
起始
開始信號:SCL高電平,SDA由高電平跳變爲低電平
開始終止:SCL高電平,SDA由低電平跳變爲高電平
數據傳輸
數據傳輸:數據位接在在開始信號後,在SCL低電平的時候設置SDA數據位,在SCL高電平的時候採樣數據爲,因此在SCL高電平的時候SDA必須保持不變
IIC時鐘頻率:不高於400K
ACK
數據響應:發送端將8位數據或命令傳出後,會檢測SDA電平,接收端將SDA由高電平拉爲低電平則正確應答,否則傳輸失敗。
器件地址
IIC器件地址:每一個IIC器件都有一個器件地址,例如EEPROM,前四個地址爲1010,後三個地址是由硬件鏈接確定。
引腳電路:IIC引腳爲帶上拉輸出
數據傳輸
IIC傳輸以8位位一個分隔段,傳輸完8位後接收端必須有一個ACK確認信號。如果外接IIC設備能收到信號的話接着在第9個週期把SDA拉低代表ACK確認。每次傳輸由開始信號+傳輸地址+數據+結束信號組成
傳輸地址組成:開始信號後接7爲地址+一位讀寫標誌(0代表寫,1代表讀)+確認信號(接收端發出)
所以IIC除了自己以外,可以尋址127個器件。
IIC器件單字節寫:器件地址後跟寫地址,然後跟數據位
寫過程:
- 向IIC總線發送一個起始位
- 芯片尋址,向IIC總線寫入地址,R/W位是0
- 等待應答
- 片內子地址尋址
- 等待應答
- 寫入數據
- 等待應答
- 發送停止位
IIC器件多字節寫:多一個字節代表寫地址
IIC器件單字節讀:讀操作是先向器件寫入讀取地址,然後再發起讀取操作,讀取完畢不需要確認信號
讀過程:
- 向IIC總線發送一個起始位
- 芯片尋址,向IIC總線寫入地址,R/W位是0
- 等待應答
- 片內子地址尋址
- 等待應答
- 向IIC總線再發送一個起始位
- 芯片尋址,向IIC總線寫入地址,R/W位是1
- 等待應答
- 讀取數據
- 發送停止位
整體時序:
IIC 總線仲裁
IIC總線的仲裁非常簡單,基本原理是檢測SDA線上的電平是否與自己預期的相同。如果與自己預期的不相同,那麼自己就放棄總線。由於IIC數據線是上拉輸出,很明顯數據位只會在高電平的時候會與自己預期的不相同,因爲其他主機此時可能正處在低電平位置。當發現自己高電平數據爲設置失敗的時候就可以放棄總線了。
仲裁時序圖:
IIC 時鐘同步
跟總線仲裁類似,時鐘同步也比較簡單,通常由時鐘最慢的主機決定總線的時鐘,因爲只有所有主機都是高電平的時候,總線纔會是高電平。時鐘快的主機將等待時鐘慢的主機。
時鐘同步時序圖: