IIC協議學習筆記
IIC總線(Inter-Integrated Circuit)即集成電路總線,是PHILIPS公司設計出來的一種簡單、雙向、二線制、同步串行總線。IIC總線是一個多向控制總線,多個器件(從機)可以同時掛載到一個主機控制的一條總線上。每個連接在總線上的設備都是通過唯一的地址和其他器件通信,主機和從機的角色可互換,
主機和從機的概念。主機就是負責整個系統的任務協調與分配,從機一般是通過接收主機的指令從而完成某些特定的任務,主機和從機之間通過總線連接,進行數據通訊。我們平時使用的個人電腦也就是這個概念。
IIC協議為半雙工協議。
全雙工指在發送數據的同時也能夠接收數據,兩者同步進行。目前的網卡一般都支持全雙工。
半雙工就是指一個時間段內只有一個動作發生,早期的對講機、以及早期集線器等設備都是基於半雙工的產品。
還有一種單工通信是指通信線路上的數據按單一方向傳送.。
數據有效傳輸在scl信號的高電平期間,sda數據線保持穩定,在scl為低電平時允許sda數據線變化。
起始條件在scl為高電平期間,sda出現下降沿,則為起始信號。
結束條件在scl為高電平期間,sda出現上升沿,則為結束信號。
總結:當scl為高電平的時候,sda為出現下降沿為start位, sda出現上升沿為stop位,所以在scl為高電平的時候sda應該保持穩定不能隨意亂動。這就又回到了數據傳輸有效的條件,只有在scl為低電平期間,才允許數據變化,在高電平期間,不允許數據變化,否則就會出現起始位或結束位。
應答(ACK,Acknowledgement)。即確認字符,在數據通信中,接收站發給發送站的一種傳輸類控制字符。主機每向從機發送完一個字節的數據,從機總是需要等待從機給出一個應答信號,來確認從機是否成功接收到了數據,從機應答主機所需要的時鐘也是由主機提供的,應答出現在每一次主機完成8個數據位傳輸後緊跟著的時鐘周期,低電平0表示應答,1表示非應答。,需要應答時,數據發出方將SDA總線設置為3態輸入,由於IIC總線上有上拉電阻,因此此時總線默認高電平,若數據接收方正確接收到數據,則數據接收方將SDA總線拉低,以示正確應答。
IIC傳輸時時從MSB開始傳輸到LSB結束。MSB是Most Significant Bit的縮寫,最高有效位。在二進制數中,MSB是最高加權位。與十進制數字中最左邊的一位類似。通常,MSB位於二進制數的最左側,LSB位於二進制數的最右側。LSB,英文 least significant bit,中文義最低有效位。
IIC寫時序
ID_Address, REG_Address, W_REG_Data
(1) 產生start位
(2) 傳送器件地址ID_Address,器件地址的最後一位為數據的傳輸方向位,R/W,低電平0表示主機往從機寫數據(W),1表示主機從從機讀數據(R)。ACK應答,應答是從機發送給主機的應答,這裏不用管。
(3) 傳送寫入器件寄存器地址,即數據要寫入的位置。同樣ACK應答不用管。
(4) 傳送要寫入的數據。ACK應答不用管。
(5) 產生stop信號。
IIC讀時序
{ID_Address + REG_Address} + {ID_Address + R_REG_Data}
(1) 產生start信號
(2) 傳送器件地址(寫ID_Address),ACK。
(3) 傳送字地址(寫REG_Address),ACK。
(4) 再次產生start信號
(5) 再傳送一次器件地址,ACK。
(6) 讀取一個字節的數據,讀數據最後結束前無應答ACK信號。
(7) 產生stop信號。
從時序圖上可以看出,IIC讀時序要寫兩次器件地址,剛開始接觸的時候我也很疑惑 dummy write。我個人這樣理解這裏,首先傳送器件地址到總線上找到器件,然後寫入寄存器地址,也就是word address找到需要讀取數據的地址,但並不是真正的寫入數據所以叫做dummy wirte(假寫)。然後再傳輸一次器件地址後開始讀數據。
IIC協議在讀寫數據時,總是要發送器件地址,這裏需要註意的是,不是主機給從機發送地址,而是主機給地址總線上發送地址,掛IIC總線上的所有從機都能收到地址,如果發過來的地址和自己的地址匹配上了,從機就會給主機一個應答,這樣就建立起來了一個通訊。所以我在想,如果從機的器件是完全一樣的,那麽IIC協議就可以同時給多個從機,即對多個器件進行配置。這種理論上是可行的,但其實是不行的,IIC協議就是通過地址不同來判斷給哪個器件傳送數據的,如果兩個器件的地址完全一樣,器件會產生應答,那麽兩個器件就通過競爭判斷給誰通信了,有隨機性。即IIC協議一次只能和一個設備/器件進行通訊。
IIC讀寫時序補充
雙字節地址寫時序,寫入器件地址,寫入寄存器地址高位、低位,然後寫數據。
多數據寫時序,寫入器件地址,寫入寄存器地址,連續寫入數據。
雙字節地址多數據寫時序,寫入器件地址,寫入寄存器地址高位、低位,然後連續寫入數據。
雙字節地址讀時序,寫入器件地址,寫入寄存器地址高位、低位,然後再次寫入器件地址,寫入數據。讀數據最後結束前無應答ACK信號。
多數據讀時序,寫入器件地址,寫入寄存器地址,,然後再次寫入器件地址,連續寫入數據。讀數據最後結束前無應答ACK信號。
雙字節地址多數據讀時序,寫入器件地址,寫入寄存器地址,,然後再次寫入器件地址,連續寫入數據。讀數據最後結束前無應答ACK信號。
轉載請註明出處:NingHeChuan(寧河川)
個人微信訂閱號:開源FPGA
如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關註個人微信訂閱號
知乎ID:NingHeChuan
微博ID:NingHeChuan
原文地址:http://www.cnblogs.com/ninghechuan/p/8595423.html
IIC協議學習筆記